/ Hex Artifact Content
Login

Artifact 375de68ad2daf3bd339f79074ced5a6db77e2f62:


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 66 20 74  QUERY./*.** If t
29f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61  he expression pa
2a00: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2a10: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2a20: 54 4b 5f 56 45 43 54 4f 52 2c 20 72 65 74 75 72  TK_VECTOR, retur
2a30: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
2a40: 6f 20 74 68 65 20 69 27 74 68 20 66 69 65 6c 64  o the i'th field
2a50: 20 6f 66 20 74 68 65 20 76 65 63 74 6f 72 2e 20   of the vector. 
2a60: 4f 72 2c 20 69 66 20 74 68 65 20 66 69 72 73 74  Or, if the first
2a70: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69   argument.** poi
2a80: 6e 74 73 20 74 6f 20 61 20 73 75 62 2d 73 65 6c  nts to a sub-sel
2a90: 65 63 74 20 74 68 61 74 20 72 65 74 75 72 6e 73  ect that returns
2aa0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
2ab0: 6f 6c 75 6d 6e 2c 20 72 65 74 75 72 6e 20 61 20  olumn, return a 
2ac0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
2ad0: 68 65 20 69 27 74 68 20 72 65 74 75 72 6e 65 64  he i'th returned
2ae0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 20 4f   column value. O
2af0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
2b00: 20 61 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74   a copy .** of t
2b10: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2b20: 74 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  t..*/.Expr *sqli
2b30: 74 65 33 45 78 70 72 56 65 63 74 6f 72 46 69 65  te3ExprVectorFie
2b40: 6c 64 28 45 78 70 72 20 2a 70 56 65 63 74 6f 72  ld(Expr *pVector
2b50: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
2b60: 72 74 28 20 69 3c 73 71 6c 69 74 65 33 45 78 70  rt( i<sqlite3Exp
2b70: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 56 65 63  rVectorSize(pVec
2b80: 74 6f 72 29 20 29 3b 0a 20 20 69 66 28 20 73 71  tor) );.  if( sq
2b90: 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f  lite3ExprIsVecto
2ba0: 72 28 70 56 65 63 74 6f 72 29 20 29 7b 0a 20 20  r(pVector) ){.  
2bb0: 20 20 69 66 28 20 70 56 65 63 74 6f 72 2d 3e 6f    if( pVector->o
2bc0: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
2bd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
2be0: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
2bf0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
2c00: 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
2c10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 56 65        return pVe
2c20: 63 74 6f 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  ctor->x.pList->a
2c30: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
2c40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 56  .  }.  return pV
2c50: 65 63 74 6f 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ector;.}.#endif.
2c60: 0a 2f 2a 0a 2a 2a 20 49 66 20 65 78 70 72 65 73  ./*.** If expres
2c70: 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20 6f 66  sion pExpr is of
2c80: 20 74 79 70 65 20 54 4b 5f 53 45 4c 45 43 54 2c   type TK_SELECT,
2c90: 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
2ca0: 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 69 74  o evaluate.** it
2cb0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  . Return the reg
2cc0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
2cd0: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
2ce0: 72 65 64 20 28 6f 72 2c 20 69 66 20 74 68 65 20  red (or, if the 
2cf0: 0a 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20 72  .** sub-select r
2d00: 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
2d10: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65   one column, the
2d20: 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72 72   first in an arr
2d30: 61 79 0a 2a 2a 20 6f 66 20 72 65 67 69 73 74 65  ay.** of registe
2d40: 72 73 20 69 6e 20 77 68 69 63 68 20 74 68 65 20  rs in which the 
2d50: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
2d60: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  )..**.** If pExp
2d70: 72 20 69 73 20 6e 6f 74 20 61 20 54 4b 5f 53 45  r is not a TK_SE
2d80: 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2c  LECT expression,
2d90: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
2da0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 43 6f 64  atic int exprCod
2db0: 65 53 75 62 73 65 6c 65 63 74 28 50 61 72 73 65  eSubselect(Parse
2dc0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
2dd0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 72 65  pExpr){.  int re
2de0: 67 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  g = 0;.#ifndef S
2df0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e00: 45 52 59 0a 20 20 69 66 28 20 70 45 78 70 72 2d  ERY.  if( pExpr-
2e10: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
2e20: 7b 0a 20 20 20 20 72 65 67 20 3d 20 73 71 6c 69  {.    reg = sqli
2e30: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
2e40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
2e50: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
2e60: 66 0a 20 20 72 65 74 75 72 6e 20 72 65 67 3b 0a  f.  return reg;.
2e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
2e80: 74 20 70 56 65 63 74 6f 72 20 70 6f 69 6e 74 73  t pVector points
2e90: 20 74 6f 20 61 20 76 65 63 74 6f 72 20 65 78 70   to a vector exp
2ea0: 72 65 73 73 69 6f 6e 20 2d 20 65 69 74 68 65 72  ression - either
2eb0: 20 61 20 54 4b 5f 56 45 43 54 4f 52 0a 2a 2a 20   a TK_VECTOR.** 
2ec0: 6f 72 20 54 4b 5f 53 45 4c 45 43 54 20 74 68 61  or TK_SELECT tha
2ed0: 74 20 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74  t returns more t
2ee0: 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20  han one column. 
2ef0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
2f00: 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 72 65 67  turns.** the reg
2f10: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  ister number of 
2f20: 61 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20  a register that 
2f30: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
2f40: 75 65 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74  ue of.** element
2f50: 20 69 46 69 65 6c 64 20 6f 66 20 74 68 65 20 76   iField of the v
2f60: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ector..**.** If 
2f70: 70 56 65 63 74 6f 72 20 69 73 20 61 20 54 4b 5f  pVector is a TK_
2f80: 53 45 4c 45 43 54 20 65 78 70 72 65 73 73 69 6f  SELECT expressio
2f90: 6e 2c 20 74 68 65 6e 20 63 6f 64 65 20 66 6f 72  n, then code for
2fa0: 20 69 74 20 6d 75 73 74 20 68 61 76 65 20 0a 2a   it must have .*
2fb0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 67  * already been g
2fc0: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 74  enerated using t
2fd0: 68 65 20 65 78 70 72 43 6f 64 65 53 75 62 73 65  he exprCodeSubse
2fe0: 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65 2e 20  lect() routine. 
2ff0: 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
3000: 70 61 72 61 6d 65 74 65 72 20 72 65 67 53 65 6c  parameter regSel
3010: 65 63 74 20 73 68 6f 75 6c 64 20 62 65 20 74 68  ect should be th
3020: 65 20 66 69 72 73 74 20 69 6e 20 61 6e 20 61 72  e first in an ar
3030: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
3040: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .** containing t
3050: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
3060: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 0a 2a  e sub-select. .*
3070: 2a 0a 2a 2a 20 49 66 20 70 56 65 63 74 6f 72 20  *.** If pVector 
3080: 69 73 20 6f 66 20 74 79 70 65 20 54 4b 5f 56 45  is of type TK_VE
3090: 43 54 4f 52 2c 20 74 68 65 6e 20 63 6f 64 65 20  CTOR, then code 
30a0: 66 6f 72 20 74 68 65 20 72 65 71 75 65 73 74 65  for the requeste
30b0: 64 20 66 69 65 6c 64 0a 2a 2a 20 69 73 20 67 65  d field.** is ge
30c0: 6e 65 72 61 74 65 64 2e 20 49 6e 20 74 68 69 73  nerated. In this
30d0: 20 63 61 73 65 20 28 2a 70 52 65 67 46 72 65 65   case (*pRegFree
30e0: 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  ) may be set to 
30f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3100: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67   a temporary reg
3110: 69 73 74 65 72 20 74 6f 20 62 65 20 66 72 65 65  ister to be free
3120: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
3130: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
3140: 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
3150: 65 74 75 72 6e 69 6e 67 2c 20 6f 75 74 70 75 74  eturning, output
3160: 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 70 45   parameter (*ppE
3170: 78 70 72 29 20 69 73 20 73 65 74 20 74 6f 20 70  xpr) is set to p
3180: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 45  oint to the.** E
3190: 78 70 72 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  xpr object corre
31a0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65 6c 65 6d  sponding to elem
31b0: 65 6e 74 20 69 45 6c 65 6d 20 6f 66 20 74 68 65  ent iElem of the
31c0: 20 76 65 63 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74   vector..*/.stat
31d0: 69 63 20 69 6e 74 20 65 78 70 72 56 65 63 74 6f  ic int exprVecto
31e0: 72 52 65 67 69 73 74 65 72 28 0a 20 20 50 61 72  rRegister(.  Par
31f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3210: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
3220: 0a 20 20 45 78 70 72 20 2a 70 56 65 63 74 6f 72  .  Expr *pVector
3230: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3240: 20 20 20 2f 2a 20 56 65 63 74 6f 72 20 74 6f 20     /* Vector to 
3250: 65 78 74 72 61 63 74 20 65 6c 65 6d 65 6e 74 20  extract element 
3260: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 46  from */.  int iF
3270: 69 65 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  ield,           
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65            /* Fie
3290: 6c 64 20 74 6f 20 65 78 74 72 61 63 74 20 66 72  ld to extract fr
32a0: 6f 6d 20 70 56 65 63 74 6f 72 20 2a 2f 0a 20 20  om pVector */.  
32b0: 69 6e 74 20 72 65 67 53 65 6c 65 63 74 2c 20 20  int regSelect,  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 2f 2a 20 46 69 72 73 74 20 69 6e 20 61 72 72 61  /* First in arra
32e0: 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a  y of registers *
32f0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 45 78 70  /.  Expr **ppExp
3300: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
3310: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 78 70 72      /* OUT: Expr
3320: 65 73 73 69 6f 6e 20 65 6c 65 6d 65 6e 74 20 2a  ession element *
3330: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 46 72 65  /.  int *pRegFre
3340: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
3350: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 65 6d 70      /* OUT: Temp
3360: 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
3370: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
3380: 28 20 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54  ( pVector->op==T
3390: 4b 5f 56 45 43 54 4f 52 20 7c 7c 20 70 56 65 63  K_VECTOR || pVec
33a0: 74 6f 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  tor->op==TK_SELE
33b0: 43 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CT );.  assert( 
33c0: 28 70 56 65 63 74 6f 72 2d 3e 6f 70 3d 3d 54 4b  (pVector->op==TK
33d0: 5f 56 45 43 54 4f 52 29 3d 3d 28 72 65 67 53 65  _VECTOR)==(regSe
33e0: 6c 65 63 74 3d 3d 30 29 20 29 3b 0a 20 20 69 66  lect==0) );.  if
33f0: 28 20 72 65 67 53 65 6c 65 63 74 20 29 7b 0a 20  ( regSelect ){. 
3400: 20 20 20 2a 70 70 45 78 70 72 20 3d 20 70 56 65     *ppExpr = pVe
3410: 63 74 6f 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  ctor->x.pSelect-
3420: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 46 69 65 6c  >pEList->a[iFiel
3430: 64 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 72  d].pExpr;.     r
3440: 65 74 75 72 6e 20 72 65 67 53 65 6c 65 63 74 2b  eturn regSelect+
3450: 69 46 69 65 6c 64 3b 0a 20 20 7d 0a 20 20 2a 70  iField;.  }.  *p
3460: 70 45 78 70 72 20 3d 20 70 56 65 63 74 6f 72 2d  pExpr = pVector-
3470: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 46 69 65  >x.pList->a[iFie
3480: 6c 64 5d 2e 70 45 78 70 72 3b 0a 20 20 72 65 74  ld].pExpr;.  ret
3490: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 43  urn sqlite3ExprC
34a0: 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
34b0: 2a 70 70 45 78 70 72 2c 20 70 52 65 67 46 72 65  *ppExpr, pRegFre
34c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  e);.}../*.** Exp
34d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
34e0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
34f0: 74 77 65 65 6e 20 74 77 6f 20 76 65 63 74 6f 72  tween two vector
3500: 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 75 74 65   values. Compute
3510: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f  .** the result o
3520: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
3530: 20 28 31 2c 20 30 2c 20 6f 72 20 4e 55 4c 4c 29   (1, 0, or NULL)
3540: 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 0a   and write that.
3550: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 72  ** result into r
3560: 65 67 69 73 74 65 72 20 64 65 73 74 2e 0a 2a 2a  egister dest..**
3570: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
3580: 75 73 74 20 73 61 74 69 73 66 79 20 74 68 65 20  ust satisfy the 
3590: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 65 63 6f 6e  following precon
35a0: 64 69 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  ditions:.**.**  
35b0: 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    if pExpr->op==
35c0: 54 4b 5f 49 53 3a 20 20 20 20 20 20 6f 70 3d 3d  TK_IS:      op==
35d0: 54 4b 5f 45 51 20 61 6e 64 20 70 35 3d 3d 53 51  TK_EQ and p5==SQ
35e0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20  LITE_NULLEQ.**  
35f0: 20 20 69 66 20 70 45 78 70 72 2d 3e 6f 70 3d 3d    if pExpr->op==
3600: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 6f 70 3d 3d  TK_ISNOT:   op==
3610: 54 4b 5f 4e 45 20 61 6e 64 20 70 35 3d 3d 53 51  TK_NE and p5==SQ
3620: 4c 49 54 45 5f 4e 55 4c 4c 45 51 0a 2a 2a 20 20  LITE_NULLEQ.**  
3630: 20 20 6f 74 68 65 72 77 69 73 65 3a 20 20 20 20    otherwise:    
3640: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 3d 3d              op==
3650: 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 70 35  pExpr->op and p5
3660: 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ==0.*/.static vo
3670: 69 64 20 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d  id codeVectorCom
3680: 70 61 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  pare(.  Parse *p
3690: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
36a0: 20 43 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   Code generator 
36b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
36c0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
36d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
36e0: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  ison operation *
36f0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20  /.  int dest,   
3700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
3710: 74 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20  te results into 
3720: 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
3730: 0a 20 20 75 38 20 6f 70 2c 20 20 20 20 20 20 20  .  u8 op,       
3740: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
3750: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20  arison operator 
3760: 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
3770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
3780: 4c 49 54 45 5f 4e 55 4c 4c 45 51 20 6f 72 20 7a  LITE_NULLEQ or z
3790: 65 72 6f 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ero */.){.  Vdbe
37a0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
37b0: 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65  dbe;.  Expr *pLe
37c0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
37d0: 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  t;.  Expr *pRigh
37e0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
37f0: 74 3b 0a 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d  t;.  int nLeft =
3800: 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
3810: 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
3820: 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 73 71   int nRight = sq
3830: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
3840: 69 7a 65 28 70 52 69 67 68 74 29 3b 0a 0a 20 20  ize(pRight);..  
3850: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f  /* Check that bo
3860: 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20  th sides of the 
3870: 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 76  comparison are v
3880: 65 63 74 6f 72 73 2c 20 61 6e 64 20 74 68 61 74  ectors, and that
3890: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 72 65 20 74  .  ** both are t
38a0: 68 65 20 73 61 6d 65 20 6c 65 6e 67 74 68 2e 20  he same length. 
38b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 4c 65 66 74 21   */.  if( nLeft!
38c0: 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73  =nRight ){.    s
38d0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
38e0: 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69 64 20  Parse, "invalid 
38f0: 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c 75 65  use of row value
3900: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
3910: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
3920: 72 65 67 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20  regLeft = 0;.   
3930: 20 69 6e 74 20 72 65 67 52 69 67 68 74 20 3d 20   int regRight = 
3940: 30 3b 0a 20 20 20 20 75 38 20 6f 70 78 20 3d 20  0;.    u8 opx = 
3950: 6f 70 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  op;.    int addr
3960: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
3970: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
3980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
3990: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c  pr->op==TK_EQ ||
39a0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e   pExpr->op==TK_N
39b0: 45 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  E .         || p
39c0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
39d0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
39e0: 5f 49 53 4e 4f 54 20 0a 20 20 20 20 20 20 20 20  _ISNOT .        
39f0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
3a00: 4b 5f 4c 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_LT || pExpr->o
3a10: 70 3d 3d 54 4b 5f 47 54 20 0a 20 20 20 20 20 20  p==TK_GT .      
3a20: 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d     || pExpr->op=
3a30: 3d 54 4b 5f 4c 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_LE || pExpr-
3a40: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 0a 20 20 20 20  >op==TK_GE .    
3a50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
3a60: 45 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 7c 7c 20  Expr->op==op || 
3a70: 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
3a80: 53 20 26 26 20 6f 70 3d 3d 54 4b 5f 45 51 29 0a  S && op==TK_EQ).
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3aa0: 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   (pExpr->op==TK_
3ab0: 49 53 4e 4f 54 20 26 26 20 6f 70 3d 3d 54 4b 5f  ISNOT && op==TK_
3ac0: 4e 45 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  NE) );.    asser
3ad0: 74 28 20 70 35 3d 3d 30 20 7c 7c 20 70 45 78 70  t( p5==0 || pExp
3ae0: 72 2d 3e 6f 70 21 3d 6f 70 20 29 3b 0a 20 20 20  r->op!=op );.   
3af0: 20 61 73 73 65 72 74 28 20 70 35 3d 3d 53 51 4c   assert( p5==SQL
3b00: 49 54 45 5f 4e 55 4c 4c 45 51 20 7c 7c 20 70 45  ITE_NULLEQ || pE
3b10: 78 70 72 2d 3e 6f 70 3d 3d 6f 70 20 29 3b 0a 0a  xpr->op==op );..
3b20: 20 20 20 20 70 35 20 7c 3d 20 53 51 4c 49 54 45      p5 |= SQLITE
3b30: 5f 53 54 4f 52 45 50 32 3b 0a 20 20 20 20 69 66  _STOREP2;.    if
3b40: 28 20 6f 70 78 3d 3d 54 4b 5f 4c 45 20 29 20 6f  ( opx==TK_LE ) o
3b50: 70 78 20 3d 20 54 4b 5f 4c 54 3b 0a 20 20 20 20  px = TK_LT;.    
3b60: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 47 45 20 29  if( opx==TK_GE )
3b70: 20 6f 70 78 20 3d 20 54 4b 5f 47 54 3b 0a 0a 20   opx = TK_GT;.. 
3b80: 20 20 20 72 65 67 4c 65 66 74 20 3d 20 65 78 70     regLeft = exp
3b90: 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  rCodeSubselect(p
3ba0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
3bb0: 20 20 20 72 65 67 52 69 67 68 74 20 3d 20 65 78     regRight = ex
3bc0: 70 72 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  prCodeSubselect(
3bd0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
3be0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
3bf0: 3c 6e 4c 65 66 74 3b 20 69 2b 2b 29 7b 0a 20 20  <nLeft; i++){.  
3c00: 20 20 20 20 69 6e 74 20 72 65 67 46 72 65 65 31      int regFree1
3c10: 20 3d 20 30 2c 20 72 65 67 46 72 65 65 32 20 3d   = 0, regFree2 =
3c20: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   0;.      Expr *
3c30: 70 4c 2c 20 2a 70 52 3b 20 0a 20 20 20 20 20 20  pL, *pR; .      
3c40: 69 6e 74 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  int r1, r2;.    
3c50: 20 20 69 66 28 20 69 3e 30 20 29 20 73 71 6c 69    if( i>0 ) sqli
3c60: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
3c70: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
3c80: 72 31 20 3d 20 65 78 70 72 56 65 63 74 6f 72 52  r1 = exprVectorR
3c90: 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20  egister(pParse, 
3ca0: 70 4c 65 66 74 2c 20 69 2c 20 72 65 67 4c 65 66  pLeft, i, regLef
3cb0: 74 2c 20 26 70 4c 2c 20 26 72 65 67 46 72 65 65  t, &pL, &regFree
3cc0: 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 65  1);.      r2 = e
3cd0: 78 70 72 56 65 63 74 6f 72 52 65 67 69 73 74 65  xprVectorRegiste
3ce0: 72 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  r(pParse, pRight
3cf0: 2c 20 69 2c 20 72 65 67 52 69 67 68 74 2c 20 26  , i, regRight, &
3d00: 70 52 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  pR, &regFree2);.
3d10: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
3d20: 65 28 70 50 61 72 73 65 2c 20 70 4c 2c 20 70 52  e(pParse, pL, pR
3d30: 2c 20 6f 70 78 2c 20 72 31 2c 20 72 32 2c 20 64  , opx, r1, r2, d
3d40: 65 73 74 2c 20 70 35 29 3b 0a 20 20 20 20 20 20  est, p5);.      
3d50: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
3d60: 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
3d70: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
3d80: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
3d90: 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62  (op==OP_Le); Vdb
3da0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
3db0: 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20  ==OP_Le);.      
3dc0: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
3dd0: 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
3de0: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
3df0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
3e00: 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
3e10: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
3e20: 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
3e30: 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
3e40: 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
3e50: 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
3e60: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
3e70: 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
3e80: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
3e90: 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
3ea0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
3eb0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
3ec0: 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73  gFree1);.      s
3ed0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
3ee0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
3ef0: 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 69 66  Free2);.      if
3f00: 28 20 69 3e 30 20 29 20 73 71 6c 69 74 65 33 45  ( i>0 ) sqlite3E
3f10: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
3f20: 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  se);.      if( i
3f30: 3d 3d 6e 4c 65 66 74 2d 31 20 29 7b 0a 20 20 20  ==nLeft-1 ){.   
3f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3f50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6f 70    }.      if( op
3f60: 78 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  x==TK_EQ ){.    
3f70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3f80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
3f90: 74 2c 20 64 65 73 74 2c 20 61 64 64 72 44 6f 6e  t, dest, addrDon
3fa0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
3fb0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 70 35 20  (v);.        p5 
3fc0: 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45 50 4e 55  |= SQLITE_KEEPNU
3fd0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LL;.      }else 
3fe0: 69 66 28 20 6f 70 78 3d 3d 54 4b 5f 4e 45 20 29  if( opx==TK_NE )
3ff0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4000: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4010: 50 5f 49 66 2c 20 64 65 73 74 2c 20 61 64 64 72  P_If, dest, addr
4020: 44 6f 6e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Done); VdbeCover
4030: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
4040: 70 35 20 7c 3d 20 53 51 4c 49 54 45 5f 4b 45 45  p5 |= SQLITE_KEE
4050: 50 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  PNULL;.      }el
4060: 73 65 20 69 66 28 20 6f 70 78 3d 3d 6f 70 20 29  se if( opx==op )
4070: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
4080: 28 20 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ( op==TK_LT || o
4090: 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
40a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
40b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
40c0: 64 65 73 74 2c 20 61 64 64 72 44 6f 6e 65 2c 20  dest, addrDone, 
40d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
40e0: 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
40f0: 3d 3d 54 4b 5f 4c 54 29 3b 0a 20 20 20 20 20 20  ==TK_LT);.      
4100: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
4110: 28 76 2c 20 6f 70 3d 3d 54 4b 5f 47 54 29 3b 0a  (v, op==TK_GT);.
4120: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4130: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d       assert( op=
4140: 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 54 4b  =TK_LE || op==TK
4150: 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 73  _GE );.        s
4160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4170: 28 76 2c 20 4f 50 5f 45 6c 73 65 4e 6f 74 45 71  (v, OP_ElseNotEq
4180: 2c 20 30 2c 20 61 64 64 72 44 6f 6e 65 29 3b 0a  , 0, addrDone);.
4190: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
41a0: 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
41b0: 5f 4c 45 29 3b 0a 20 20 20 20 20 20 20 20 56 64  _LE);.        Vd
41c0: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
41d0: 6f 70 3d 3d 54 4b 5f 47 45 29 3b 0a 20 20 20 20  op==TK_GE);.    
41e0: 20 20 20 20 69 66 28 20 69 3d 3d 6e 4c 65 66 74      if( i==nLeft
41f0: 2d 32 20 29 20 6f 70 78 20 3d 20 6f 70 3b 0a 20  -2 ) opx = op;. 
4200: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4210: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
4220: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
4230: 44 6f 6e 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  Done);.  }.}..#i
4240: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
4250: 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a 20  R_DEPTH>0./*.** 
4260: 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75 6d  Check that argum
4270: 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20 6c  ent nHeight is l
4280: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
4290: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
42a0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
42b0: 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49 66  epth allowed. If
42c0: 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61 76   it is not, leav
42d0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
42e0: 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2e  ge in.** pParse.
42f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
4300: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 50  xprCheckHeight(P
4310: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
4320: 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 6e  t nHeight){.  in
4330: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
4340: 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68 74  ;.  int mxHeight
4350: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
4360: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
4370: 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b 0a  IT_EXPR_DEPTH];.
4380: 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d 78    if( nHeight>mx
4390: 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73 71  Height ){.    sq
43a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
43b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22 45  arse, .       "E
43c0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 69  xpression tree i
43d0: 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61 78  s too large (max
43e0: 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22 2c  imum depth %d)",
43f0: 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29 3b   mxHeight.    );
4400: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
4410: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
4420: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54  turn rc;.}../* T
4430: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  he following thr
4440: 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68 65  ee functions, he
4450: 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68 65  ightOfExpr(), he
4460: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 29  ightOfExprList()
4470: 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f 66  .** and heightOf
4480: 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75 73  Select(), are us
4490: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
44a0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69 67  the maximum heig
44b0: 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78 70  ht.** of any exp
44c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66  ression tree ref
44d0: 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 73  erenced by the s
44e0: 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
44f0: 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  as the.** first 
4500: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
4510: 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d 20  If this maximum 
4520: 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65  height is greate
4530: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
4540: 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64  nt value pointed
4550: 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69 67  .** to by pnHeig
4560: 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 70  ht, the second p
4570: 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20 73  arameter, then s
4580: 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f 20  et *pnHeight to 
4590: 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  that.** value..*
45a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  /.static void he
45b0: 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72 20  ightOfExpr(Expr 
45c0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
45d0: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
45e0: 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67 68     if( p->nHeigh
45f0: 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a 20  t>*pnHeight ){. 
4600: 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
4610: 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 20   p->nHeight;.   
4620: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
4630: 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78 70  void heightOfExp
4640: 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20 2a  rList(ExprList *
4650: 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  p, int *pnHeight
4660: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
4670: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
4680: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72  (i=0; i<p->nExpr
4690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68 65  ; i++){.      he
46a0: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61 5b  ightOfExpr(p->a[
46b0: 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69 67  i].pExpr, pnHeig
46c0: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ht);.    }.  }.}
46d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 69  .static void hei
46e0: 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c 65  ghtOfSelect(Sele
46f0: 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65  ct *p, int *pnHe
4700: 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29  ight){.  if( p )
4710: 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  {.    heightOfEx
4720: 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 6e  pr(p->pWhere, pn
4730: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
4740: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48 61  ghtOfExpr(p->pHa
4750: 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29 3b  ving, pnHeight);
4760: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
4770: 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e 48  r(p->pLimit, pnH
4780: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
4790: 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66 66  htOfExpr(p->pOff
47a0: 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  set, pnHeight);.
47b0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
47c0: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
47d0: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
47e0: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
47f0: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e 48  p->pGroupBy, pnH
4800: 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67  eight);.    heig
4810: 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e  htOfExprList(p->
4820: 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69 67  pOrderBy, pnHeig
4830: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
4840: 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69 6f  fSelect(p->pPrio
4850: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
4860: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
4870: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
4880: 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65 20  variable in the 
4890: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
48a0: 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75 6d   as an .** argum
48b0: 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73 69  ent. An expressi
48c0: 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c 64  on with no child
48d0: 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74 20  ren, Expr.pList 
48e0: 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65 6c  or .** Expr.pSel
48f0: 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20 61  ect member has a
4900: 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41 6e   height of 1. An
4910: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
4920: 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69 67  on.** has a heig
4930: 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  ht equal to the 
4940: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
4950: 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a 20  f any other .** 
4960: 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72 20  referenced Expr 
4970: 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  plus one..**.** 
4980: 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 45  Also propagate E
4990: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
49a0: 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e 78  s up from Expr.x
49b0: 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e 66  .pList to Expr.f
49c0: 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70 72  lags,.** if appr
49d0: 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
49e0: 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74 48  ic void exprSetH
49f0: 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b 0a  eight(Expr *p){.
4a00: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20    int nHeight = 
4a10: 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70  0;.  heightOfExp
4a20: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48 65  r(p->pLeft, &nHe
4a30: 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74 4f  ight);.  heightO
4a40: 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74 2c  fExpr(p->pRight,
4a50: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69 66   &nHeight);.  if
4a60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4a70: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
4a80: 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68 74  t) ){.    height
4a90: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70 53  OfSelect(p->x.pS
4aa0: 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74 29  elect, &nHeight)
4ab0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
4ac0: 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  >x.pList ){.    
4ad0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
4ae0: 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 48  (p->x.pList, &nH
4af0: 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e 66  eight);.    p->f
4b00: 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61  lags |= EP_Propa
4b10: 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45 78  gate & sqlite3Ex
4b20: 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78  prListFlags(p->x
4b30: 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20 70  .pList);.  }.  p
4b40: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
4b50: 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ght + 1;.}../*.*
4b60: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e  * Set the Expr.n
4b70: 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65 20  Height variable 
4b80: 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53 65  using the exprSe
4b90: 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74 69  tHeight() functi
4ba0: 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68 65  on. If.** the he
4bb0: 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72 20  ight is greater 
4bc0: 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  than the maximum
4bd0: 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73 73   allowed express
4be0: 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c 65  ion depth,.** le
4bf0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
4c00: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  pParse..**.** Al
4c10: 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c 6c  so propagate all
4c20: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c   EP_Propagate fl
4c30: 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70  ags from the Exp
4c40: 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a  r.x.pList into.*
4c50: 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a  * Expr.flags. .*
4c60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4c70: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
4c80: 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ags(Parse *pPars
4c90: 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  e, Expr *p){.  i
4ca0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
4cb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70 72  ) return;.  expr
4cc0: 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20 20  SetHeight(p);.  
4cd0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
4ce0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
4cf0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f  ->nHeight);.}../
4d00: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4d10: 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20 6f  maximum height o
4d20: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
4d30: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
4d40: 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65 63  .** by the selec
4d50: 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
4d60: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
4d70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
4d80: 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
4d90: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
4da0: 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30 3b  int nHeight = 0;
4db0: 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63  .  heightOfSelec
4dc0: 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a  t(p, &nHeight);.
4dd0: 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68 74    return nHeight
4de0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42 4f  ;.}.#else /* ABO
4df0: 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66 6f  VE:  Height enfo
4e00: 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64 2e  rcement enabled.
4e10: 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74 20    BELOW: Height 
4e20: 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66 20  enforcement off 
4e30: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67 61  */./*.** Propaga
4e40: 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67  te all EP_Propag
4e50: 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74  ate flags from t
4e60: 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20  he Expr.x.pList 
4e70: 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61  into.** Expr.fla
4e80: 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gs. .*/.void sql
4e90: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4ea0: 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20  tAndFlags(Parse 
4eb0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4ec0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
4ed0: 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78 70  >x.pList && !Exp
4ee0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
4ef0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
4f00: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c 3d  .    p->flags |=
4f10: 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26 20   EP_Propagate & 
4f20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46  sqlite3ExprListF
4f30: 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74 29  lags(p->x.pList)
4f40: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
4f50: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
4f60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4f70: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
4f80: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
4f90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
4fa0: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
4fb0: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
4fc0: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
4fd0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
4fe0: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
4ff0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
5000: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
5010: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
5020: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
5030: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
5040: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
5050: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5060: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
5070: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
5080: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
5090: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
50a0: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
50b0: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
50c0: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
50d0: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
50e0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
50f0: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
5100: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
5110: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
5120: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
5130: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ing is performed
5140: 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a 2a  .  The deQuote.*
5150: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  * parameter is i
5160: 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65 6e  gnored if pToken
5170: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   is NULL or if t
5180: 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e 6f  he token does no
5190: 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20 62  t.** appear to b
51a0: 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74 68  e quoted.  If th
51b0: 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f 66  e quotes were of
51c0: 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22 20   the form "..." 
51d0: 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29 0a  (double-quotes).
51e0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f 44  ** then the EP_D
51f0: 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69 73  blQuoted flag is
5200: 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70 72   set on the expr
5210: 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a 0a  ession node..**.
5220: 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a  ** Special case:
5230: 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45    If op==TK_INTE
5240: 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20 70  GER and pToken p
5250: 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69 6e  oints to a strin
5260: 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65  g that.** can be
5270: 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74 6f   translated into
5280: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
5290: 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  r, then the toke
52a0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 72  n is not.** stor
52b0: 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e 20  ed in u.zToken. 
52c0: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69 6e   Instead, the in
52d0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73 20  teger values is 
52e0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
52f0: 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68 65  u.iValue and the
5300: 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61   EP_IntValue fla
5310: 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65 78  g is set.  No ex
5320: 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20 69  tra storage.** i
5330: 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  s allocated to h
5340: 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72 20  old the integer 
5350: 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65 71  text and the deq
5360: 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67 6e  uote flag is ign
5370: 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ored..*/.Expr *s
5380: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
5390: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
53a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
53b0: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
53c0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
53d0: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
53e0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
53f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
5400: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
5410: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
5420: 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20 54  *pToken,    /* T
5430: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
5440: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
5450: 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20  .  int dequote  
5460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5470: 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a 2f  ue to dequote */
5480: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  .){.  Expr *pNew
5490: 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
54a0: 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65   0;.  int iValue
54b0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
54c0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
54d0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
54e0: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
54f0: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
5500: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
5510: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
5520: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
5530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
5540: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
5550: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
5560: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
5570: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
5580: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5590: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
55a0: 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b  f(Expr)+nExtra);
55b0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
55c0: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
55d0: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
55e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  ;.    pNew->op =
55f0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
5600: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
5610: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
5620: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
5630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
5640: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
5650: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
5660: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
5670: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
5680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5690: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
56a0: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
56b0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
56c0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
56d0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
56e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
56f0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
5700: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
5710: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
5720: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
5730: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
5740: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
5750: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
5760: 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49 73  ote && sqlite3Is
5770: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
5780: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
5790: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
57a0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27  u.zToken[0]=='"'
57b0: 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c   ) pNew->flags |
57c0: 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a  = EP_DblQuoted;.
57d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
57e0: 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Dequote(pNew->u
57f0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
5800: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5810: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
5820: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
5830: 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20    pNew->nHeight 
5840: 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20  = 1;.#endif  .  
5850: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
5860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
5870: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
5880: 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20  ion node from a 
5890: 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20  zero-terminated 
58a0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a  token that has.*
58b0: 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64  * already been d
58c0: 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72  equoted..*/.Expr
58d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20   *sqlite3Expr(. 
58e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
58f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
5900: 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62  le for sqlite3Db
5910: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61  MallocZero() (ma
5920: 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20  y be null) */.  
5930: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
5940: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
5950: 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ssion opcode */.
5960: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5970: 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b  oken      /* Tok
5980: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69  en argument.  Mi
5990: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
59a0: 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78  {.  Token x;.  x
59b0: 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78  .z = zToken;.  x
59c0: 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71  .n = zToken ? sq
59d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
59e0: 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74  oken) : 0;.  ret
59f0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
5a00: 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c  lloc(db, op, &x,
5a10: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   0);.}../*.** At
5a20: 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c  tach subtrees pL
5a30: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74  eft and pRight t
5a40: 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20  o the Expr node 
5a50: 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pRoot..**.** If 
5a60: 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74  pRoot==NULL that
5a70: 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65   means that a me
5a80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
5a90: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
5aa0: 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63  ed..** In that c
5ab0: 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20  ase, delete the 
5ac0: 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61  subtrees pLeft a
5ad0: 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f  nd pRight..*/.vo
5ae0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  id sqlite3ExprAt
5af0: 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20  tachSubtrees(.  
5b00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45  sqlite3 *db,.  E
5b10: 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78  xpr *pRoot,.  Ex
5b20: 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70  pr *pLeft,.  Exp
5b30: 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69  r *pRight.){.  i
5b40: 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  f( pRoot==0 ){. 
5b50: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
5b60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
5b70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5b80: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
5b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5ba0: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
5bb0: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
5bc0: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
5bd0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67       pRoot->pRig
5be0: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  ht = pRight;.   
5bf0: 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20     pRoot->flags 
5c00: 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20  |= EP_Propagate 
5c10: 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b  & pRight->flags;
5c20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5c30: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52  Left ){.      pR
5c40: 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  oot->pLeft = pLe
5c50: 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ft;.      pRoot-
5c60: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f  >flags |= EP_Pro
5c70: 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e  pagate & pLeft->
5c80: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20  flags;.    }.   
5c90: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
5ca0: 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Root);.  }.}../*
5cb0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20  .** Allocate an 
5cc0: 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20  Expr node which 
5cd0: 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73  joins as many as
5ce0: 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a   two subtrees..*
5cf0: 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68  *.** One or both
5d00: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73   of the subtrees
5d10: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52   can be NULL.  R
5d20: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
5d30: 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78  to the new.** Ex
5d40: 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66  pr node.  Or, if
5d50: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
5d60: 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65  curs, set pParse
5d70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5d80: 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20  ed,.** free the 
5d90: 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74  subtrees and ret
5da0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70  urn NULL..*/.Exp
5db0: 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28  r *sqlite3PExpr(
5dc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5dd0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
5de0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
5df0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
5e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
5e10: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
5e20: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
5e30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5e40: 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  Left operand */.
5e50: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
5e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
5e70: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
5e80: 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f  const Token *pTo
5e90: 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ken     /* Argum
5ea0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a  ent token */.){.
5eb0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28    Expr *p;.  if(
5ec0: 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70   op==TK_AND && p
5ed0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
5ee0: 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61 64  {.    /* Take ad
5ef0: 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72 74  vantage of short
5f00: 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20 6f  -circuit false o
5f10: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
5f20: 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73  AND */.    p = s
5f30: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
5f40: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74 2c  arse->db, pLeft,
5f50: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
5f60: 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e{.    p = sqlit
5f70: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
5f80: 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b 46  se->db, op & TKF
5f90: 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e 2c  LG_MASK, pToken,
5fa0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
5fb0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
5fc0: 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  es(pParse->db, p
5fd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
5fe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
5ff0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
6000: 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61  rCheckHeight(pPa
6010: 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29  rse, p->nHeight)
6020: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70  ;.}../*.** Add p
6040: 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45 78  Select to the Ex
6050: 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69 65  pr.x.pSelect fie
6060: 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78 70  ld.  Or, if pExp
6070: 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a 2a  r is NULL (due.*
6080: 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * do a memory al
6090: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
60a0: 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  ) then delete th
60b0: 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  e pSelect object
60c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
60d0: 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28  3PExprAddSelect(
60e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
60f0: 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c 65  xpr *pExpr, Sele
6100: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
6110: 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
6120: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
6130: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
6140: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
6150: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
6160: 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79  lect|EP_Subquery
6170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6180: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
6190: 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78 70  ags(pParse, pExp
61a0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
61b0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
61c0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
61d0: 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
61e0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
61f0: 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63 74  rse->db, pSelect
6200: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
6210: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
6220: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  on is always eit
6230: 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53  her TRUE or FALS
6240: 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79 29  E (respectively)
6250: 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
6260: 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e   1.  If one cann
6270: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  ot determine the
6280: 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20   truth value of 
6290: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
62a0: 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  n at compile-tim
62b0: 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  e return 0..**.*
62c0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74  * This is an opt
62d0: 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69  imization.  If i
62e0: 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30  s OK to return 0
62f0: 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a   here even if.**
6300: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6310: 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73  really is always
6320: 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20   false or false 
6330: 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76  (a false negativ
6340: 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73  e)..** But it is
6350: 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e   a bug to return
6360: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
6370: 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20  sion might have 
6380: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f  different.** boo
6390: 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64  lean values in d
63a0: 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73  ifferent circums
63b0: 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20  tances (a false 
63c0: 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a  positive.).**.**
63d0: 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68   Note that if th
63e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
63f0: 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f  part of conditio
6400: 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46  nal for a.** LEF
6410: 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20  T JOIN, then we 
6420: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
6430: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
6440: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
6450: 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f 72  ** is it true or
6460: 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79   false, so alway
6470: 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  s return 0..*/.s
6480: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c  tatic int exprAl
6490: 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a 70  waysTrue(Expr *p
64a0: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
64b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
64c0: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
64d0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
64e0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
64f0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
6500: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
6510: 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a  .  return v!=0;.
6520: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
6530: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70  rAlwaysFalse(Exp
6540: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
6550: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
6560: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6570: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
6580: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
6590: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
65a0: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
65b0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d  n 0;.  return v=
65c0: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69  =0;.}../*.** Joi
65d0: 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  n two expression
65e0: 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f  s using an AND o
65f0: 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74  perator.  If eit
6600: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  her expression i
6610: 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  s.** NULL, then 
6620: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
6630: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
6640: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73  ..**.** If one s
6650: 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  ide or the other
6660: 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b   of the AND is k
6670: 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65  nown to be false
6680: 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a  , then instead.*
6690: 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61  * of returning a
66a0: 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e  n AND expression
66b0: 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  , just return a 
66c0: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
66d0: 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61  ion with.** a va
66e0: 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f  lue of false..*/
66f0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
6700: 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  prAnd(sqlite3 *d
6710: 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  b, Expr *pLeft, 
6720: 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  Expr *pRight){. 
6730: 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b   if( pLeft==0 ){
6740: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67  .    return pRig
6750: 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ht;.  }else if( 
6760: 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  pRight==0 ){.   
6770: 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20   return pLeft;. 
6780: 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
6790: 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74  lwaysFalse(pLeft
67a0: 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46  ) || exprAlwaysF
67b0: 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a  alse(pRight) ){.
67c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
67d0: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
67e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
67f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
6800: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
6810: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6820: 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
6830: 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
6840: 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c  ns[0], 0);.  }el
6850: 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  se{.    Expr *pN
6860: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
6870: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44  Alloc(db, TK_AND
6880: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6890: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
68a0: 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c  btrees(db, pNew,
68b0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
68c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77  .    return pNew
68d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
68e0: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
68f0: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
6900: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
6910: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
6920: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
6930: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
6940: 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  nction(Parse *pP
6950: 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a  arse, ExprList *
6960: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
6970: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
6980: 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  New;.  sqlite3 *
6990: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
69a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
69b0: 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n );.  pNew = sq
69c0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
69d0: 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20  b, TK_FUNCTION, 
69e0: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66  pToken, 1);.  if
69f0: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
6a00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6a10: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
6a20: 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f  ); /* Avoid memo
6a30: 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c  ry leak when mal
6a40: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
6a50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6a60: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
6a70: 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74   pList;.  assert
6a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
6a90: 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53  ty(pNew, EP_xIsS
6aa0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69  elect) );.  sqli
6ab0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
6ac0: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
6ad0: 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e   pNew);.  return
6ae0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
6af0: 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c  Assign a variabl
6b00: 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65  e number to an e
6b10: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65  xpression that e
6b20: 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72  ncodes a wildcar
6b30: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67  d.** in the orig
6b40: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
6b50: 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  nt.  .**.** Wild
6b60: 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67  cards consisting
6b70: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22   of a single "?"
6b80: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
6b90: 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61  e next sequentia
6ba0: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75  l.** variable nu
6bb0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  mber..**.** Wild
6bc0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
6bd0: 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73  m "?nnn" are ass
6be0: 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72  igned the number
6bf0: 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65   "nnn".  We make
6c00: 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69  .** sure "nnn" i
6c10: 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20  s not too be to 
6c20: 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f  avoid a denial o
6c30: 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b  f service attack
6c40: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c   when.** the SQL
6c50: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
6c60: 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61   from an externa
6c70: 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20  l source..**.** 
6c80: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
6c90: 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40   form ":aaa", "@
6ca0: 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20  aaa", or "$aaa" 
6cb0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
6cc0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
6cd0: 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  as the previous 
6ce0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
6cf0: 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20  same wildcard.  
6d00: 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68  Or if this is th
6d10: 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61  e first.** insta
6d20: 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63  nce of the wildc
6d30: 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65  ard, the next se
6d40: 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c  quential variabl
6d50: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
6d60: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
6d70: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
6d80: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
6d90: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
6da0: 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74  *pExpr){.  sqlit
6db0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6dc0: 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  >db;.  const cha
6dd0: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78  r *z;..  if( pEx
6de0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
6df0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6e00: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
6e10: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50  , EP_IntValue|EP
6e20: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6e30: 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20  nOnly) );.  z = 
6e40: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
6e50: 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20  .  assert( z!=0 
6e60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30  );.  assert( z[0
6e70: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b  ]!=0 );.  if( z[
6e80: 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  1]==0 ){.    /* 
6e90: 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20  Wildcard of the 
6ea0: 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67  form "?".  Assig
6eb0: 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61  n the next varia
6ec0: 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
6ed0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d    assert( z[0]==
6ee0: 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72  '?' );.    pExpr
6ef0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
6f00: 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  ar)(++pParse->nV
6f10: 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ar);.  }else{.  
6f20: 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20    ynVar x = 0;. 
6f30: 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74     u32 n = sqlit
6f40: 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  e3Strlen30(z);. 
6f50: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27     if( z[0]=='?'
6f60: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c   ){.      /* Wil
6f70: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
6f80: 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65  m "?nnn".  Conve
6f90: 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69  rt "nnn" to an i
6fa0: 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20  nteger and.     
6fb0: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
6fc0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
6fd0: 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  r */.      i64 i
6fe0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20  ;.      int bOk 
6ff0: 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69  = 0==sqlite3Atoi
7000: 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d  64(&z[1], &i, n-
7010: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  1, SQLITE_UTF8);
7020: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
7030: 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56  olumn = x = (ynV
7040: 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74  ar)i;.      test
7050: 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20  case( i==0 );.  
7060: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d      testcase( i=
7070: 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =1 );.      test
7080: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
7090: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
70a0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
70b0: 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ]-1 );.      tes
70c0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
70d0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
70e0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
70f0: 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  R] );.      if( 
7100: 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c  bOk==0 || i<1 ||
7110: 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   i>db->aLimit[SQ
7120: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
7130: 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20  BLE_NUMBER] ){. 
7140: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7150: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7160: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
7170: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
7180: 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20  ?1 and ?%d",.   
7190: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69           db->aLi
71a0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
71b0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
71c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20  ]);.        x = 
71d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
71e0: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
71f0: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Var ){.        p
7200: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69  Parse->nVar = (i
7210: 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt)i;.      }.  
7220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
7230: 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65  * Wildcards like
7240: 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20   ":aaa", "$aaa" 
7250: 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73  or "@aaa".  Reus
7260: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
7270: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  ble.      ** num
7280: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
7290: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
72a0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
72b0: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
72c0: 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20     ** has never 
72d0: 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c  appeared before,
72e0: 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20   reuse the same 
72f0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a  variable number.
7300: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79        */.      y
7310: 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f  nVar i;.      fo
7320: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
7330: 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nzVar; i++){.  
7340: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
7350: 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74  ->azVar[i] && st
7360: 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56  rcmp(pParse->azV
7370: 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20  ar[i],z)==0 ){. 
7380: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7390: 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79  iColumn = x = (y
73a0: 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20  nVar)i+1;.      
73b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
73c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
73d0: 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20     if( x==0 ) x 
73e0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
73f0: 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61   = (ynVar)(++pPa
7400: 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20  rse->nVar);.    
7410: 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b  }.    if( x>0 ){
7420: 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50 61  .      if( x>pPa
7430: 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20  rse->nzVar ){.  
7440: 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a        char **a;.
7450: 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69          a = sqli
7460: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
7470: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
7480: 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b  x*sizeof(a[0]));
7490: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d  .        if( a==
74a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
74b0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
74c0: 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45 72  cFailed ); /* Er
74d0: 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72  ror reported thr
74e0: 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c 65  ough mallocFaile
74f0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  d */.          r
7500: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
7510: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
7520: 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20  >azVar = a;.    
7530: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50      memset(&a[pP
7540: 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c  arse->nzVar], 0,
7550: 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61   (x-pParse->nzVa
7560: 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29  r)*sizeof(a[0]))
7570: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
7580: 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20  ->nzVar = x;.   
7590: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
75a0: 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72  [0]!='?' || pPar
75b0: 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d  se->azVar[x-1]==
75c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
75d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
75e0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31  Parse->azVar[x-1
75f0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ]);.        pPar
7600: 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d  se->azVar[x-1] =
7610: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
7620: 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  p(db, z, n);.   
7630: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a     }.    }.  } .
7640: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7650: 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Err && pParse->n
7660: 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  Var>db->aLimit[S
7670: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
7680: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
7690: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
76a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
76b0: 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62   many SQL variab
76c0: 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  les");.  }.}../*
76d0: 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20  .** Recursively 
76e0: 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73  delete an expres
76f0: 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74  sion tree..*/.st
7700: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
7710: 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74 65  LINE void sqlite
7720: 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73 71  3ExprDeleteNN(sq
7730: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
7740: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
7750: 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e 69  !=0 );.  /* Sani
7760: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
7770: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
7780: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
7790: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
77a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
77b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
77c0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
77d0: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
77e0: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
77f0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
7800: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7810: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
7820: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
7830: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
7840: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
7850: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
7860: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
7870: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
7880: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f   );.    if( p->o
7890: 70 21 3d 54 4b 5f 53 45 4c 45 43 54 5f 43 4f 4c  p!=TK_SELECT_COL
78a0: 55 4d 4e 20 29 20 73 71 6c 69 74 65 33 45 78 70  UMN ) sqlite3Exp
78b0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
78c0: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
78d0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
78e0: 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20   p->pRight);.   
78f0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
7900: 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f  erty(p, EP_MemTo
7910: 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62  ken) ) sqlite3Db
7920: 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54  Free(db, p->u.zT
7930: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45  oken);.    if( E
7940: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7950: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7960: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7970: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
7980: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
7990: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
79a0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
79b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
79c0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
79d0: 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  }.  if( !ExprHas
79e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
79f0: 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71  tatic) ){.    sq
7a00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7a10: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
7a20: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7a30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
7a40: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
7a50: 29 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  ) sqlite3ExprDel
7a60: 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a  eteNN(db, p);.}.
7a70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7a80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
7a90: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
7aa0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
7ab0: 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73  tructure .** pas
7ac0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
7ad0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20   argument. This 
7ae0: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
7af0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a   EXPR_FULLSIZE,.
7b00: 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  ** EXPR_REDUCEDS
7b10: 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45  IZE or EXPR_TOKE
7b20: 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74  NONLYSIZE..*/.st
7b30: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72  atic int exprStr
7b40: 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29  uctSize(Expr *p)
7b50: 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  {.  if( ExprHasP
7b60: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
7b70: 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  kenOnly) ) retur
7b80: 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59  n EXPR_TOKENONLY
7b90: 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72  SIZE;.  if( Expr
7ba0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
7bb0: 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74  P_Reduced) ) ret
7bc0: 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44  urn EXPR_REDUCED
7bd0: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45  SIZE;.  return E
7be0: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a  XPR_FULLSIZE;.}.
7bf0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  ./*.** The duped
7c00: 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74  Expr*Size() rout
7c10: 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e  ines each return
7c20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7c30: 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  ytes required.**
7c40: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79   to store a copy
7c50: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
7c60: 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20  n or expression 
7c70: 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66  tree.  They diff
7c80: 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63  er in.** how muc
7c90: 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73  h of the tree is
7ca0: 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a   measured..**.**
7cb0: 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74       dupedExprSt
7cc0: 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53  ructSize()     S
7cd0: 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20  ize of only the 
7ce0: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a  Expr structure .
7cf0: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
7d00: 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20  NodeSize()      
7d10: 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20   Size of Expr + 
7d20: 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a  space for token.
7d30: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
7d40: 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20  Size()          
7d50: 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20   Expr + token + 
7d60: 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e  subtree componen
7d70: 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.**.**********
7d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  *.**.** The dupe
7dd0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
7de0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
7df0: 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52  ns two values OR
7e00: 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a  -ed together:  .
7e10: 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65  ** (1) the space
7e20: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20   required for a 
7e30: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
7e40: 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20   structure only 
7e50: 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20  and .** (2) the 
7e60: 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61  EP_xxx flags tha
7e70: 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20  t indicate what 
7e80: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69  the structure si
7e90: 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a  ze should be..**
7ea0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
7eb0: 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  es is always one
7ec0: 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   of:.**.**      
7ed0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a  EXPR_FULLSIZE.**
7ee0: 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43        EXPR_REDUC
7ef0: 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65  EDSIZE   | EP_Re
7f00: 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58  duced.**      EX
7f10: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
7f20: 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a   | EP_TokenOnly.
7f30: 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
7f40: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
7f50: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
7f60: 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75  masking the retu
7f70: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  rn value.** of t
7f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
7f90: 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61   0xfff.  The fla
7fa0: 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  gs can be found 
7fb0: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a  by masking the.*
7fc0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  * return value w
7fd0: 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45  ith EP_Reduced|E
7fe0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a  P_TokenOnly..**.
7ff0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74  ** Note that wit
8000: 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  h flags==EXPRDUP
8010: 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f  _REDUCE, this ro
8020: 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20  utines works on 
8030: 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e  full-size.** (un
8040: 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62  reduced) Expr ob
8050: 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72  jects as they or
8060: 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73   originally cons
8070: 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70  tructed by the p
8080: 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67  arser..** During
8090: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
80a0: 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f  ysis, extra info
80b0: 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75  rmation is compu
80c0: 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e  ted and moved in
80d0: 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74  to.** later part
80e0: 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62  s of teh Expr ob
80f0: 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78  ject and that ex
8100: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
8110: 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65  might get choppe
8120: 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20  d.** off if the 
8130: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
8140: 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73  duced.  Note als
8150: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
8160: 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61  ot work to.** ma
8170: 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45  ke an EXPRDUP_RE
8180: 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72  DUCE copy of a r
8190: 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f  educed expressio
81a0: 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c  n.  It is only l
81b0: 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63  egal.** to reduc
81c0: 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70  e a pristine exp
81d0: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f  ression tree fro
81e0: 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54  m the parser.  T
81f0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
8200: 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70  n.** of dupedExp
8210: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f  rStructSize() co
8220: 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61  ntain multiple a
8230: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
8240: 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a  ts that attempt.
8250: 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ** to enforce th
8260: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  is constraint..*
8270: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70  /.static int dup
8280: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
8290: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
82a0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  ags){.  int nSiz
82b0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  e;.  assert( fla
82c0: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
82d0: 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29  CE || flags==0 )
82e0: 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c  ; /* Only one fl
82f0: 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64  ag value allowed
8300: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58   */.  assert( EX
8310: 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66  PR_FULLSIZE<=0xf
8320: 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ff );.  assert( 
8330: 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64  (0xfff & (EP_Red
8340: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
8350: 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  y))==0 );.  if( 
8360: 30 3d 3d 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  0==flags ){.    
8370: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
8380: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
8390: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
83a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
83b0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
83c0: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
83d0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
83e0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
83f0: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
8400: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8410: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8420: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
8430: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
8440: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
8450: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
8460: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
8470: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
8480: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
8490: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
84a0: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
84b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
84c0: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
84d0: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
84e0: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
84f0: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
8500: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
8510: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
8520: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
8530: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8540: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
8550: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
8560: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
8570: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
8580: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
8590: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
85a0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
85b0: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
85c0: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
85d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
85e0: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
85f0: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
8600: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
8610: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
8620: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
8630: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
8640: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
8650: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
8660: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
8670: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
8680: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
8690: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
86a0: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
86b0: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
86c0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
86d0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
86e0: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
86f0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
8700: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
8710: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
8720: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
8730: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
8740: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
8750: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
8760: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
8770: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
8780: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
8790: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
87a0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
87b0: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
87c0: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
87d0: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
87e0: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
87f0: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
8800: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
8810: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
8820: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
8830: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
8840: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
8850: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
8860: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
8870: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
8880: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
8890: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
88a0: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
88b0: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
88c0: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
88d0: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
88e0: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
88f0: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
8900: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
8910: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
8920: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
8930: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
8940: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
8950: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
8960: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
8970: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
8980: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
8990: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
89a0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
89b0: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
89c0: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
89d0: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
89e0: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
89f0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
8a00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
8a10: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
8a20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
8a30: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
8a40: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
8a50: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
8a60: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
8a70: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
8a80: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
8a90: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
8aa0: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
8ab0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
8ac0: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
8ad0: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
8ae0: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
8af0: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
8b00: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
8b10: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
8b20: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
8b30: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
8b40: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
8b50: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
8b60: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
8b70: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
8b80: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
8b90: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
8ba0: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
8bb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8bc0: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
8bd0: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
8be0: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
8bf0: 20 64 75 70 46 6c 61 67 73 2c 20 75 38 20 2a 2a   dupFlags, u8 **
8c00: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
8c10: 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  r *pNew;        
8c20: 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
8c30: 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  eturn */.  u8 *z
8c40: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20  Alloc;          
8c50: 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65   /* Memory space
8c60: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 62   from which to b
8c70: 75 69 6c 64 20 45 78 70 72 20 6f 62 6a 65 63 74  uild Expr object
8c80: 20 2a 2f 0a 20 20 75 33 32 20 73 74 61 74 69 63   */.  u32 static
8c90: 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 45  Flag;       /* E
8ca0: 50 5f 53 74 61 74 69 63 20 69 66 20 73 70 61 63  P_Static if spac
8cb0: 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 66  e not obtained f
8cc0: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  rom malloc */.. 
8cd0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
8ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b  ;.  assert( p );
8cf0: 0a 20 20 61 73 73 65 72 74 28 20 64 75 70 46 6c  .  assert( dupFl
8d00: 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70 46 6c 61  ags==0 || dupFla
8d10: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
8d20: 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CE );.  assert( 
8d30: 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c 20 64  pzBuffer==0 || d
8d40: 75 70 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50  upFlags==EXPRDUP
8d50: 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20 20 2f 2a  _REDUCE );..  /*
8d60: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
8d70: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e  e to write the n
8d80: 65 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72  ew Expr structur
8d90: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 7a 42 75  e. */.  if( pzBu
8da0: 66 66 65 72 20 29 7b 0a 20 20 20 20 7a 41 6c 6c  ffer ){.    zAll
8db0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
8dc0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
8dd0: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 7d 65   EP_Static;.  }e
8de0: 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c 6f 63 20  lse{.    zAlloc 
8df0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8e00: 63 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64  cRawNN(db, duped
8e10: 45 78 70 72 53 69 7a 65 28 70 2c 20 64 75 70 46  ExprSize(p, dupF
8e20: 6c 61 67 73 29 29 3b 0a 20 20 20 20 73 74 61 74  lags));.    stat
8e30: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20 20 7d 0a  icFlag = 0;.  }.
8e40: 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a    pNew = (Expr *
8e50: 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69 66 28 20  )zAlloc;..  if( 
8e60: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f 2a 20 53  pNew ){.    /* S
8e70: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
8e80: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
8e90: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
8ea0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
8eb0: 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e 20 54     ** by pNew. T
8ec0: 68 69 73 20 69 73 20 65 69 74 68 65 72 20 45 58  his is either EX
8ed0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45 58 50  PR_FULLSIZE, EXP
8ee0: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72  R_REDUCEDSIZE or
8ef0: 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b  .    ** EXPR_TOK
8f00: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b  ENONLYSIZE. nTok
8f10: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  en is set to the
8f20: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
8f30: 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20 20 2a 2a   consumed.    **
8f40: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
8f50: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
8f60: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
8f70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
8f80: 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75  t unsigned nStru
8f90: 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78  ctSize = dupedEx
8fa0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20  prStructSize(p, 
8fb0: 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20 63  dupFlags);.    c
8fc0: 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a  onst int nNewSiz
8fd0: 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20  e = nStructSize 
8fe0: 26 20 30 78 66 66 66 3b 0a 20 20 20 20 69 6e 74  & 0xfff;.    int
8ff0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28   nToken;.    if(
9000: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
9010: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
9020: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
9030: 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e   ){.      nToken
9040: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9050: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
9060: 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  + 1;.    }else{.
9070: 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30        nToken = 0
9080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9090: 64 75 70 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  dupFlags ){.    
90a0: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
90b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
90c0: 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20  Reduced)==0 );. 
90d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c       memcpy(zAll
90e0: 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29  oc, p, nNewSize)
90f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9100: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
9110: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
9120: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ze(p);.      mem
9130: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
9140: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
9150: 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c   nSize<EXPR_FULL
9160: 53 49 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20  SIZE ){ .       
9170: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
9180: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
9190: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
91a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
91b0: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45      /* Set the E
91c0: 50 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f  P_Reduced, EP_To
91d0: 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f  kenOnly, and EP_
91e0: 53 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70  Static flags app
91f0: 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20  ropriately. */. 
9200: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26     pNew->flags &
9210: 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45  = ~(EP_Reduced|E
9220: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53  P_TokenOnly|EP_S
9230: 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65  tatic|EP_MemToke
9240: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c  n);.    pNew->fl
9250: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
9260: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
9270: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
9280: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
9290: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
92a0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
92b0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
92c0: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
92d0: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
92e0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
92f0: 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e 7a 54  ken = pNew->u.zT
9300: 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 7a  oken = (char*)&z
9310: 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65 5d 3b  Alloc[nNewSize];
9320: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 54  .      memcpy(zT
9330: 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65  oken, p->u.zToke
9340: 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
9350: 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 28  }..    if( 0==((
9360: 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66  p->flags|pNew->f
9370: 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e  lags) & EP_Token
9380: 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 2f  Only) ){.      /
9390: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
93a0: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
93b0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
93c0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
93d0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
93e0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
93f0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
9400: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
9410: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
9420: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
9430: 65 63 74 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a  ect, dupFlags);.
9440: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9450: 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69       pNew->x.pLi
9460: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
9470: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 78  ListDup(db, p->x
9480: 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c 61 67 73  .pList, dupFlags
9490: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
94a0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ..    /* Fill in
94b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
94c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
94d0: 2f 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  /.    if( ExprHa
94e0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
94f0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
9500: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
9510: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
9520: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
9530: 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20 20 20   dupFlags);.    
9540: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
9550: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
9560: 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20  educed) ){.     
9570: 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d     pNew->pLeft =
9580: 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20 20 20 20   p->pLeft ?.    
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d    exprDup(db, p-
95b0: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
95c0: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
95d0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4e   : 0;.        pN
95e0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 2d 3e  ew->pRight = p->
95f0: 70 52 69 67 68 74 20 3f 0a 20 20 20 20 20 20 20  pRight ?.       
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
9620: 52 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52  Right, EXPRDUP_R
9630: 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 20  EDUCE, &zAlloc) 
9640: 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  : 0;.      }.   
9650: 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20     if( pzBuffer 
9660: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 42 75  ){.        *pzBu
9670: 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20  ffer = zAlloc;. 
9680: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
9690: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 45 78 70  {.      if( !Exp
96a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
96b0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
96c0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
96d0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
96e0: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 65  prDup(db, p->pLe
96f0: 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ft, 0);.        
9700: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
9710: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9720: 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b  , p->pRight, 0);
9730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9740: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
9750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
9760: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
9770: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
9780: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
9790: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
97a0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
97b0: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
97c0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
97d0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
97e0: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
97f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
9800: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
9810: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
9820: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
9830: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
9840: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
9850: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
9860: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
9870: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
9880: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
9890: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
98a0: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
98b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
98c0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
98d0: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
98e0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
98f0: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
9900: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
9910: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
9920: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
9930: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
9940: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
9950: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
9960: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
9970: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
9980: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
9990: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
99a0: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
99b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
99c0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
99d0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
99e0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
99f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
9a00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
9a10: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
9a20: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
9a30: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
9a40: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9a50: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
9a60: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
9a70: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
9a80: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
9a90: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
9aa0: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
9ab0: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
9ac0: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
9ad0: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
9ae0: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
9af0: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
9b00: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
9b10: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
9b20: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
9b30: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
9b40: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9b50: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
9b60: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
9b70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9b80: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
9b90: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
9ba0: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
9bb0: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
9bc0: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
9bd0: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
9be0: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
9bf0: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
9c00: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
9c10: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
9c20: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
9c30: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
9c40: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
9c50: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
9c60: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
9c70: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
9c80: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
9c90: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
9ca0: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
9cb0: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
9cc0: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
9cd0: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
9ce0: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
9cf0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
9d00: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
9d10: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
9d20: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
9d30: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
9d40: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
9d50: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
9d60: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
9d70: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
9d80: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
9d90: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
9da0: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
9db0: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
9dc0: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
9dd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20  );.  return p ? 
9de0: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66  exprDup(db, p, f
9df0: 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b 0a 7d 0a  lags, 0) : 0;.}.
9e00: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
9e10: 33 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c  3ExprListDup(sql
9e20: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
9e30: 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  st *p, int flags
9e40: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
9e50: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
9e60: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9e70: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
9e80: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
9e90: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
9ea0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
9eb0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
9ec0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
9ed0: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
9ee0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
9ef0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9f00: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69   pNew->nExpr = i
9f10: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69   = p->nExpr;.  i
9f20: 66 28 20 28 66 6c 61 67 73 20 26 20 45 58 50 52  f( (flags & EXPR
9f30: 44 55 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29  DUP_REDUCE)==0 )
9f40: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
9f50: 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20  Expr; i+=i){}.  
9f60: 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20  pNew->a = pItem 
9f70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
9f80: 63 52 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69  cRawNN(db,  i*si
9f90: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
9fa0: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
9fb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
9fc0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
9fd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
9fe0: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
9ff0: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
a000: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
a010: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
a020: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
a030: 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c   *pOldExpr = pOl
a040: 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  dItem->pExpr;.  
a050: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
a060: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
a070: 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c  db, pOldExpr, fl
a080: 61 67 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ags);.    pItem-
a090: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
a0a0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
a0b0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
a0c0: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
a0d0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a0e0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
a0f0: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65  zSpan);.    pIte
a100: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
a110: 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  OldItem->sortOrd
a120: 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  er;.    pItem->d
a130: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  one = 0;.    pIt
a140: 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d  em->bSpanIsTab =
a150: 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e   pOldItem->bSpan
a160: 49 73 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d  IsTab;.    pItem
a170: 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ->u = pOldItem->
a180: 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  u;.  }.  return 
a190: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
a1a0: 66 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67  f cursors, trigg
a1b0: 65 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73  ers, views and s
a1c0: 75 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c  ubqueries are al
a1d0: 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a  l omitted from.*
a1e0: 2a 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65  * the build, the
a1f0: 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  n none of the fo
a200: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
a210: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a  , except for .**
a220: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
a230: 70 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c  p(), can be call
a240: 65 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ed. sqlite3Selec
a250: 74 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69  tDup() is someti
a260: 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  mes.** called wi
a270: 74 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65  th a NULL argume
a280: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  nt..*/.#if !defi
a290: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a2a0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
a2b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
a2c0: 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65  IGGER) \. || !de
a2d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a2e0: 54 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c  T_SUBQUERY).SrcL
a2f0: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
a300: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
a310: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  db, SrcList *p, 
a320: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72  int flags){.  Sr
a330: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
a340: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
a350: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  e;.  assert( db!
a360: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
a370: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
a380: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
a390: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
a3a0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
a3b0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
a3c0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
a3d0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
a3e0: 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  NN(db, nByte );.
a3f0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
a400: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
a410: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
a420: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
a430: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
a440: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
a450: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
a460: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
a470: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
a480: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
a490: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
a4a0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
a4b0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
a4c0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65   pNewItem->pSche
a4d0: 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ma = pOldItem->p
a4e0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77  Schema;.    pNew
a4f0: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
a500: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a510: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
a520: 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
a530: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
a540: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
a550: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
a560: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
a570: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
a580: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
a590: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  b, pOldItem->zAl
a5a0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
a5b0: 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65  em->fg = pOldIte
a5c0: 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49  m->fg;.    pNewI
a5d0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
a5e0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
a5f0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
a600: 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f  addrFillSub = pO
a610: 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ldItem->addrFill
a620: 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Sub;.    pNewIte
a630: 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70  m->regReturn = p
a640: 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  OldItem->regRetu
a650: 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  rn;.    if( pNew
a660: 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
a670: 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e  edBy ){.      pN
a680: 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65  ewItem->u1.zInde
a690: 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44  xedBy = sqlite3D
a6a0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
a6b0: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
a6c0: 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dBy);.    }.    
a6d0: 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64  pNewItem->pIBInd
a6e0: 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  ex = pOldItem->p
a6f0: 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  IBIndex;.    if(
a700: 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73   pNewItem->fg.is
a710: 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
a720: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46   pNewItem->u1.pF
a730: 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20  uncArg = .      
a740: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
a750: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
a760: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
a770: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  , flags);.    }.
a780: 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49      pTab = pNewI
a790: 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64  tem->pTab = pOld
a7a0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
a7b0: 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20  if( pTab ){.    
a7c0: 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a    pTab->nRef++;.
a7d0: 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74      }.    pNewIt
a7e0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
a7f0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
a800: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  b, pOldItem->pSe
a810: 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  lect, flags);.  
a820: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
a830: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
a840: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  (db, pOldItem->p
a850: 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  On, flags);.    
a860: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
a870: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
a880: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
a890: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
a8a0: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
a8b0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
a8c0: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
a8d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
a8e0: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
a8f0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
a900: 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49   IdList *p){.  I
a910: 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  dList *pNew;.  i
a920: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
a930: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
a940: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
a950: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
a960: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
a970: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
a980: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
a990: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
a9a0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49  New->nId = p->nI
a9b0: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
a9c0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
a9d0: 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73  wNN(db, p->nId*s
a9e0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
a9f0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
aa00: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
aa10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
aa20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
aa30: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74  .  }.  /* Note t
aa40: 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65 20  hat because the 
aa50: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f  size of the allo
aa60: 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b  cation for p->a[
aa70: 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  ] is not.  ** ne
aa80: 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65  cessarily a powe
aa90: 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65  r of two, sqlite
aaa0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20  3IdListAppend() 
aab0: 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
aac0: 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75  d.  ** on the du
aad0: 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64 20  plicate created 
aae0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
aaf0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
ab00: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
ab10: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
ab20: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
ab30: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
ab40: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
ab50: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
ab60: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
ab70: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
ab80: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
ab90: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
aba0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
abb0: 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c  wItem->idx = pOl
abc0: 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a  dItem->idx;.  }.
abd0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
abe0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
abf0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
ac00: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
ac10: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
ac20: 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70  Select *pNew, *p
ac30: 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
ac40: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
ac50: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
ac60: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
ac70: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
ac80: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  b, sizeof(*p) );
ac90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
aca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
acb0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
acc0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
acd0: 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c  b, p->pEList, fl
ace0: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ags);.  pNew->pS
acf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
ad00: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  istDup(db, p->pS
ad10: 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e  rc, flags);.  pN
ad20: 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  ew->pWhere = sql
ad30: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
ad40: 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73  p->pWhere, flags
ad50: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
ad60: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
ad70: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
ad80: 70 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29  pGroupBy, flags)
ad90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
ada0: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
adb0: 75 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e  up(db, p->pHavin
adc0: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  g, flags);.  pNe
add0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
ade0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
adf0: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
ae00: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
ae10: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
ae20: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
ae30: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
ae40: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
ae50: 70 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a  pPrior, flags);.
ae60: 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
ae70: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
ae80: 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  New;.  pNew->pNe
ae90: 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  xt = 0;.  pNew->
aea0: 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
aeb0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
aec0: 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20  Limit, flags);. 
aed0: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
aee0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
aef0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20  db, p->pOffset, 
af00: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
af10: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e  iLimit = 0;.  pN
af20: 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b  ew->iOffset = 0;
af30: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
af40: 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  s = p->selFlags 
af50: 26 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65  & ~SF_UsesEpheme
af60: 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64  ral;.  pNew->add
af70: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d  rOpenEphm[0] = -
af80: 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  1;.  pNew->addrO
af90: 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b  penEphm[1] = -1;
afa0: 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74  .  pNew->nSelect
afb0: 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74  Row = p->nSelect
afc0: 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69  Row;.  pNew->pWi
afd0: 74 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c  th = withDup(db,
afe0: 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71   p->pWith);.  sq
aff0: 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
b000: 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c  me(pNew, p->zSel
b010: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
b020: 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65  pNew;.}.#else.Se
b030: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
b040: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
b050: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
b060: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73  nt flags){.  ass
b070: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
b080: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
b090: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
b0a0: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
b0b0: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
b0c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
b0d0: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
b0e0: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
b0f0: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
b100: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
b110: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
b120: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
b130: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
b140: 65 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66  entire list is f
b150: 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c  reed and.** NULL
b160: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
b170: 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65  f non-NULL is re
b180: 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20  turned, then it 
b190: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
b1a0: 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e   that the new en
b1b0: 74 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66  try was successf
b1c0: 75 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a  ully appended..*
b1d0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
b1e0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b1f0: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
b200: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
b210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
b220: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
b230: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
b240: 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
b250: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
b260: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
b270: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
b280: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
b290: 6e 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  n to be appended
b2a0: 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  . Might be NULL 
b2b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
b2c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
b2e0: 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  0 );.  if( pList
b2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
b300: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
b310: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
b320: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
b330: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
b340: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
b350: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
b360: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20   pList->nExpr = 
b370: 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20  0;.    pList->a 
b380: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b390: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
b3a0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
b3b0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
b3c0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
b3d0: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
b3e0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
b3f0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
b400: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
b410: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
b420: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
b430: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
b440: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
b450: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
b460: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
b470: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
b480: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
b490: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
b4a0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
b4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
b4c0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
b4d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
b4e0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
b4f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
b500: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b510: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
b520: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
b530: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
b540: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
b550: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
b560: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
b570: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
b580: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
b590: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
b5a0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
b5b0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
b5c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
b5d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
b5e0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
b5f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
b600: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
b610: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
b620: 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
b630: 66 6f 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65  for the last ele
b640: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65  ment on the give
b650: 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76  n ExprList..*/.v
b660: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
b670: 69 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28  istSetSortOrder(
b680: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
b690: 20 69 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20   iSortOrder){.  
b6a0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b6b0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  n;.  assert( SQL
b6c0: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
b6d0: 3c 30 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f  <0 && SQLITE_SO_
b6e0: 41 53 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45  ASC>=0 && SQLITE
b6f0: 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20  _SO_DESC>0 );.  
b700: 61 73 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72  assert( p->nExpr
b710: 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72  >0 );.  if( iSor
b720: 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20  tOrder<0 ){.    
b730: 61 73 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e  assert( p->a[p->
b740: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
b750: 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  er==SQLITE_SO_AS
b760: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  C );.    return;
b770: 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e  .  }.  p->a[p->n
b780: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
b790: 72 20 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64  r = (u8)iSortOrd
b7a0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
b7b0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
b7c0: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
b7d0: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
b7e0: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
b7f0: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
b800: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
b810: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
b820: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
b830: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
b840: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
b850: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
b860: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
b870: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
b880: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
b890: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
b8a0: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
b8b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
b8c0: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
b8d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b8e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
b8f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
b900: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
b910: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
b920: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
b930: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
b940: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
b950: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
b960: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
b970: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
b980: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
b990: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
b9a0: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
b9b0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
b9c0: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
b9d0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
b9e0: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
b9f0: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
ba00: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ba10: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
ba20: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
ba30: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
ba40: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
ba50: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
ba60: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
ba70: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
ba80: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
ba90: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
baa0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
bab0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
bac0: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
bad0: 6f 74 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ote ) sqlite3Deq
bae0: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
baf0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
bb00: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
bb10: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
bb20: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
bb30: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
bb40: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
bb50: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
bb60: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
bb70: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
bb80: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
bb90: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
bba0: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
bbb0: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
bbc0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
bbd0: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
bbe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bbf0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
bc00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bc10: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
bc20: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bc30: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
bc40: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bc50: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
bc60: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
bc70: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
bc80: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
bc90: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
bca0: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
bcb0: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
bcc0: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
bcd0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bce0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
bcf0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
bd00: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
bd10: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
bd20: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
bd30: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
bd40: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
bd50: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
bd60: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
bd70: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
bd80: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
bd90: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
bda0: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
bdb0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
bdc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
bdd0: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
bde0: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
bdf0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
be00: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
be10: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
be50: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
be60: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
be70: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
be80: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
be90: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
bea0: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
beb0: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
bec0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
bed0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
bee0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
bef0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
bf00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
bf10: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
bf20: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
bf30: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
bf40: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
bf50: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
bf60: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
bf70: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
bf80: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
bf90: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
bfa0: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
bfb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
bfc0: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
bfd0: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
bfe0: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
bff0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
c000: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
c010: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
c020: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
c030: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
c040: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
c050: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion list..*/.sta
c060: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
c070: 49 4e 45 20 76 6f 69 64 20 65 78 70 72 4c 69 73  INE void exprLis
c080: 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c 69 74 65  tDeleteNN(sqlite
c090: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
c0a0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
c0b0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
c0c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
c0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
c0e0: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
c0f0: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
c100: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
c110: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
c120: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
c130: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
c140: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
c150: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
c160: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c170: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
c180: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
c190: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
c1a0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
c1b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c1c0: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
c1d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c1e0: 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f 69 64 20   pList);.}.void 
c1f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c200: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
c210: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
c220: 73 74 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74  st){.  if( pList
c230: 20 29 20 65 78 70 72 4c 69 73 74 44 65 6c 65 74   ) exprListDelet
c240: 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  eNN(db, pList);.
c250: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c260: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
c270: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
c280: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
c290: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
c2a0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
c2b0: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
c2c0: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
c2d0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
c2e0: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
c2f0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
c300: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
c310: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
c320: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
c330: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
c340: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73  Expr;.       ass
c350: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
c360: 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78  .       m |= pEx
c370: 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  pr->flags;.    }
c380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
c390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
c3a0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
c3b0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73  ker callbacks us
c3c0: 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72  ed to check expr
c3d0: 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65  essions to.** se
c3e0: 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22 63  e if they are "c
c3f0: 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d  onstant" for som
c400: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
c410: 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a  constant.  The.*
c420: 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76  * Walker.eCode v
c430: 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20  alue determines 
c440: 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e  the type of "con
c450: 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f  stant" we are lo
c460: 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a  oking.** for..**
c470: 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61  .** These callba
c480: 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ck routines are 
c490: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
c4a0: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  t the following:
c4b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
c4c0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
c4d0: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
c4e0: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
c4f0: 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c  de==1.**     sql
c500: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
c510: 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20  ntNotJoin()     
c520: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
c530: 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73  Code==2.**     s
c540: 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c  qlite3ExprIsTabl
c550: 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  eConstant()     
c560: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
c570: 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20  >eCode==3.**    
c580: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
c590: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
c5a0: 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  ()        pWalke
c5b0: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35  r->eCode==4 or 5
c5c0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61  .**.** In all ca
c5d0: 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63  ses, the callbac
c5e0: 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43  ks set Walker.eC
c5f0: 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20  ode=0 and abort 
c600: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
c610: 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f  n.** is found to
c620: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61   not be a consta
c630: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  nt..**.** The sq
c640: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
c650: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20  antOrFunction() 
c660: 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c  is used for eval
c670: 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f  uating expressio
c680: 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  ns.** in a CREAT
c690: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
c6a0: 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65  t.  The Walker.e
c6b0: 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35 20  Code value is 5 
c6c0: 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20  when parsing.** 
c6d0: 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68 65  an existing sche
c6e0: 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72  ma and 4 when pr
c6f0: 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73  ocessing a new s
c700: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75  tatement.  A bou
c710: 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
c720: 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20  raises an error 
c730: 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  for new statemen
c740: 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e  ts, but is silen
c750: 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  tly converted.**
c760: 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69   to NULL for exi
c770: 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20  sting schemas.  
c780: 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69  This allows sqli
c790: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
c7a0: 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69   that .** contai
c7b0: 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  n a bound parame
c7c0: 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65 79  ter because they
c7d0: 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64 20   were generated 
c7e0: 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
c7f0: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74  s.** of SQLite t
c800: 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20 6e  o be parsed by n
c810: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
c820: 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20   SQLite without 
c830: 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c  raising a.** mal
c840: 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72  formed schema er
c850: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
c860: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
c870: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
c880: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
c890: 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57  pr){..  /* If pW
c8a0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20  alker->eCode is 
c8b0: 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  2 then any term 
c8c0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
c8d0: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
c8e0: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
c8f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
c900: 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69  f a left join di
c910: 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20 65  squalifies the e
c920: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66  xpression.  ** f
c930: 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  rom being consid
c940: 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a  ered constant. *
c950: 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d  /.  if( pWalker-
c960: 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70  >eCode==2 && Exp
c970: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
c980: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
c990: 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d   ){.    pWalker-
c9a0: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
c9b0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
c9c0: 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  ;.  }..  switch(
c9d0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
c9e0: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75    /* Consider fu
c9f0: 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f  nctions to be co
ca00: 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68  nstant if all th
ca10: 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72  eir arguments ar
ca20: 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a  e constant.    *
ca30: 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57 61  * and either pWa
ca40: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
ca50: 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74  r 5 or the funct
ca60: 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20  ion has the.    
ca70: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  ** SQLITE_FUNC_C
ca80: 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20  ONST flag. */.  
ca90: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
caa0: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57  ON:.      if( pW
cab0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20  alker->eCode>=4 
cac0: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
cad0: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
cae0: 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  tFunc) ){.      
caf0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
cb00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
cb10: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  se{.        pWal
cb20: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
cb30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
cb40: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
cb50: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  }.    case TK_ID
cb60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
cb70: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
cb80: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
cb90: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
cba0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65  COLUMN:.      te
cbb0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
cbc0: 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20  p==TK_ID );.    
cbd0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
cbe0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
cbf0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
cc00: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
cc10: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
cc20: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cc30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
cc40: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
cc50: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
cc60: 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78  >eCode==3 && pEx
cc70: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c  pr->iTable==pWal
cc80: 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20  ker->u.iCur ){. 
cc90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
cca0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
ccb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ccc0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
ccd0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
cce0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
ccf0: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
cd00: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20  TK_VARIABLE:.   
cd10: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
cd20: 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20  eCode==5 ){.    
cd30: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
cd40: 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61  convert bound pa
cd50: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 70  rameters that ap
cd60: 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43  pear inside of C
cd70: 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a  REATE.        **
cd80: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f   statements into
cd90: 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72   a NULL when par
cda0: 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45 20  sing the CREATE 
cdb0: 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f  statement text o
cdc0: 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ut.        ** of
cdd0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
cde0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  er table */.    
cdf0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
ce00: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TK_NULL;.      }
ce10: 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72  else if( pWalker
ce20: 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20  ->eCode==4 ){.  
ce30: 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64        /* A bound
ce40: 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20   parameter in a 
ce50: 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
ce60: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
ce70: 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a   from.        **
ce80: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
ce90: 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72 72  () causes an err
cea0: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57  or */.        pW
ceb0: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
cec0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ced0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
cee0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
cef0: 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20  l through */.   
cf00: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
cf10: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
cf20: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
cf30: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
cf40: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
cf50: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
cf60: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
cf70: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
cf80: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
cf90: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
cfa0: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
cfb0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
cfc0: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
cfd0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f  tic int selectNo
cfe0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
cff0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
d000: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
d010: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d020: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
d030: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
d040: 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
d050: 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20  Abort;.}.static 
d060: 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28  int exprIsConst(
d070: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69  Expr *p, int ini
d080: 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29  tFlag, int iCur)
d090: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
d0a0: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
d0b0: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
d0c0: 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a  ode = initFlag;.
d0d0: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
d0e0: 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  k = exprNodeIsCo
d0f0: 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c  nstant;.  w.xSel
d100: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
d110: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
d120: 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d  nt;.  w.u.iCur =
d130: 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33   iCur;.  sqlite3
d140: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b  WalkExpr(&w, p);
d150: 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64  .  return w.eCod
d160: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
d170: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
d180: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
d190: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
d1a0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
d1b0: 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20  ant.** and 0 if 
d1c0: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
d1d0: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
d1e0: 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46  n calls..**.** F
d1f0: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
d200: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
d210: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
d220: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
d230: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
d240: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
d250: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
d260: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
d270: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
d280: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
d290: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
d2a0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
d2b0: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
d2c0: 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a  Const(p, 1, 0);.
d2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
d2e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
d2f0: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
d300: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
d310: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
d320: 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  .** that does no
d330: 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20   originate from 
d340: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
d350: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69  clauses of a joi
d360: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  n..** Return 0 i
d370: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
d380: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
d390: 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72  ion calls or ter
d3a0: 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e  ms from.** an ON
d3b0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
d3c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d3d0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
d3e0: 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a  tJoin(Expr *p){.
d3f0: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
d400: 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d  onst(p, 2, 0);.}
d410: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
d420: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
d430: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
d440: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
d450: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
d460: 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c  ** for any singl
d470: 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62  e row of the tab
d480: 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20 69  le with cursor i
d490: 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Cur.  In other w
d4a0: 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70  ords, the.** exp
d4b0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  ression must not
d4c0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f   refer to any no
d4d0: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
d4e0: 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79  function nor any
d4f0: 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20  .** table other 
d500: 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e  than iCur..*/.in
d510: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  t sqlite3ExprIsT
d520: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70  ableConstant(Exp
d530: 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b  r *p, int iCur){
d540: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
d550: 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72  Const(p, 3, iCur
d560: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
d570: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
d580: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
d590: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
d5a0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
d5b0: 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63  ant.** or a func
d5c0: 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63  tion call with c
d5d0: 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74  onstant argument
d5e0: 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30  s.  Return and 0
d5f0: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
d600: 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a   any variables..
d610: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
d620: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
d630: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
d640: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
d650: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
d660: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
d670: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
d680: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
d690: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
d6a0: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
d6b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
d6c0: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
d6d0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c  unction(Expr *p,
d6e0: 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61   u8 isInit){.  a
d6f0: 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30  ssert( isInit==0
d700: 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b   || isInit==1 );
d710: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
d720: 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69  Const(p, 4+isIni
d730: 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  t, 0);.}..#ifdef
d740: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
d750: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
d760: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
d770: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
d780: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
d790: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
d7a0: 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66  a.** subquery of
d7b0: 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74   some kind.  Ret
d7c0: 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 61  urn 0 if there a
d7d0: 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73  re no subqueries
d7e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d7f0: 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71  ExprContainsSubq
d800: 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  uery(Expr *p){. 
d810: 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
d820: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
d830: 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
d840: 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
d850: 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  allback = sqlite
d860: 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20  3ExprWalkNoop;. 
d870: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
d880: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
d890: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
d8a0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
d8b0: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
d8c0: 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  eCode==0;.}.#end
d8d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
d8e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
d8f0: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
d900: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
d910: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
d920: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
d930: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
d940: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
d950: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
d960: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
d970: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
d980: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
d990: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
d9a0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
d9b0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
d9c0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
d9d0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
d9e0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
d9f0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
da00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
da10: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
da20: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
da30: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
da40: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
da50: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
da60: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
da70: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
da80: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
da90: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
daa0: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
dab0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
dac0: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
dad0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
dae0: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
daf0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
db00: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
db10: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
db20: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
db30: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
db40: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
db50: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
db60: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
db70: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
db80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
db90: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
dba0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
dbb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dbc0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
dbd0: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
dbe0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
dbf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
dc00: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
dc10: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
dc20: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
dc30: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
dc40: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
dc50: 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
dc60: 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
dc70: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
dc80: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
dc90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
dca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dcb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
dcc0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
dcd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
dce0: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
dcf0: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
dd00: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
dd10: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
dd20: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
dd30: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
dd40: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
dd50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
dd60: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
dd70: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
dd80: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
dd90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
dda0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
ddb0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
ddc0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
ddd0: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
dde0: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
ddf0: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
de00: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
de10: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
de20: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
de30: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
de40: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
de50: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
de60: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
de70: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
de80: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
de90: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
dea0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
deb0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
dec0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
ded0: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
dee0: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
def0: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
df00: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
df10: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
df20: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
df30: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
df40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
df50: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
df60: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
df70: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
df80: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
df90: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
dfa0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
dfb0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
dfc0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
dfd0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
dfe0: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
dff0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
e000: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
e010: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
e020: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
e030: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
e040: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
e050: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
e060: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
e070: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21  assert( p->pTab!
e080: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
e090: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
e0a0: 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75  ty(p, EP_CanBeNu
e0b0: 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ll) ||.         
e0c0: 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e      (p->iColumn>
e0d0: 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61  =0 && p->pTab->a
e0e0: 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  Col[p->iColumn].
e0f0: 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20  notNull==0);.   
e100: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
e110: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
e120: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
e130: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
e140: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e150: 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77  constant which w
e160: 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61  ould be.** uncha
e170: 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e  nged by OP_Affin
e180: 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66  ity with the aff
e190: 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74  inity given in t
e1a0: 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
e1b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ument..**.** Thi
e1c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
e1d0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
e1e0: 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74  f the OP_Affinit
e1f0: 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63  y operation.** c
e200: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20  an be omitted.  
e210: 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65  When in doubt re
e220: 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66  turn FALSE.  A f
e230: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a  alse negative.**
e240: 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41   is harmless.  A
e250: 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c   false positive,
e260: 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65   however, can re
e270: 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  sult in the wron
e280: 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a  g.** answer..*/.
e290: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e  int sqlite3ExprN
e2a0: 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
e2b0: 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20  ange(const Expr 
e2c0: 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20  *p, char aff){. 
e2d0: 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66   u8 op;.  if( af
e2e0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  f==SQLITE_AFF_BL
e2f0: 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  OB ) return 1;. 
e300: 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54   while( p->op==T
e310: 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70  K_UPLUS || p->op
e320: 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70  ==TK_UMINUS ){ p
e330: 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20   = p->pLeft; }. 
e340: 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69   op = p->op;.  i
e350: 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  f( op==TK_REGIST
e360: 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32  ER ) op = p->op2
e370: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
e380: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
e390: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72  TEGER: {.      r
e3a0: 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54  eturn aff==SQLIT
e3b0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
e3c0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
e3d0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a  _NUMERIC;.    }.
e3e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
e3f0: 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T: {.      retur
e400: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
e410: 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53  F_REAL || aff==S
e420: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
e430: 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  C;.    }.    cas
e440: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
e450: 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d       return aff=
e460: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
e470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e480: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
e490: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
e4a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
e4b0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73  LUMN: {.      as
e4c0: 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e  sert( p->iTable>
e4d0: 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e  =0 );  /* p cann
e4e0: 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20  ot be part of a 
e4f0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
e500: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
e510: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20   p->iColumn<0.  
e520: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
e530: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45  =SQLITE_AFF_INTE
e540: 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  GER || aff==SQLI
e550: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b  TE_AFF_NUMERIC);
e560: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
e570: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lt: {.      retu
e580: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
e590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
e5a0: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
e5b0: 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f  n string is a ro
e5c0: 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  w-id column name
e5d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e5e0: 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68  IsRowid(const ch
e5f0: 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71  ar *z){.  if( sq
e600: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
e610: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
e620: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
e630: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e640: 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20  , "ROWID")==0 ) 
e650: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
e660: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e670: 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65  , "OID")==0 ) re
e680: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
e690: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20   0;.}../*.** pX 
e6a0: 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e  is the RHS of an
e6b0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
e6c0: 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43 54  f pX is a SELECT
e6d0: 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74   statement .** t
e6e0: 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c  hat can be simpl
e6f0: 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65 63  ified to a direc
e700: 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20  t table access, 
e710: 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61  then return.** a
e720: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e730: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e740: 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20  .  If pX is not 
e750: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e760: 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  nt,.** or if the
e770: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e780: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61  t needs to be ma
e790: 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20  nifested into a 
e7a0: 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62  transient.** tab
e7b0: 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  le, then return 
e7c0: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  NULL..*/.#ifndef
e7d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
e7e0: 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c  QUERY.static Sel
e7f0: 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65  ect *isCandidate
e800: 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70  ForInOpt(Expr *p
e810: 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  X){.  Select *p;
e820: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
e830: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
e840: 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70  List;.  Table *p
e850: 54 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Tab;.  int i;.  
e860: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
e870: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
e880: 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
e890: 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20 73 75 62  0;  /* Not a sub
e8a0: 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 45  query */.  if( E
e8b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
e8c0: 58 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  X, EP_VarSelect)
e8d0: 20 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f    ) return 0;  /
e8e0: 2a 20 43 6f 72 72 65 6c 61 74 65 64 20 73 75 62  * Correlated sub
e8f0: 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58 2d 3e 78  q */.  p = pX->x
e900: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20  .pSelect;.  if( 
e910: 70 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  p->pPrior ) retu
e920: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
e930: 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 6d 70     /* Not a comp
e940: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
e950: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
e960: 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
e970: 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
e980: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
e990: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
e9a0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
e9b0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
e9c0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 74 65  stinct );.    te
e9d0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
e9e0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
e9f0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
ea00: 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
ea10: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
ea20: 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49 4e 43 54  ; /* No DISTINCT
ea30: 20 6b 65 79 77 6f 72 64 20 61 6e 64 20 6e 6f 20   keyword and no 
ea40: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
ea50: 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73  ons */.  }.  ass
ea60: 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79  ert( p->pGroupBy
ea70: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
ea80: 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 47 52      /* Has no GR
ea90: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
eaa0: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
eab0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
eac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ead0: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
eae0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
eaf0: 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  >pOffset==0 );  
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb10: 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 6e  No LIMIT means n
eb20: 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 66  o OFFSET */.  if
eb30: 28 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  ( p->pWhere ) re
eb40: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
eb50: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 57       /* Has no W
eb60: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
eb70: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
eb80: 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
eb90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =0 );.  if( pSrc
eba0: 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75  ->nSrc!=1 ) retu
ebb0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
ebc0: 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  * Single term in
ebd0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
ebe0: 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 30 5d    if( pSrc->a[0]
ebf0: 2e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  .pSelect ) retur
ec00: 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  n 0;     /* FROM
ec10: 20 69 73 20 6e 6f 74 20 61 20 73 75 62 71 75 65   is not a subque
ec20: 72 79 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  ry or view */.  
ec30: 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 61 5b 30  pTab = pSrc->a[0
ec40: 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73 65 72 74  ].pTab;.  assert
ec50: 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  ( pTab!=0 );.  a
ec60: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
ec70: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
ec80: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
ec90: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
eca0: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
ecb0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
ecc0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
ecd0: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
ece0: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
ecf0: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
ed00: 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  p->pEList;..  /*
ed10: 20 41 6c 6c 20 53 45 4c 45 43 54 20 72 65 73 75   All SELECT resu
ed20: 6c 74 73 20 6d 75 73 74 20 62 65 20 63 6f 6c 75  lts must be colu
ed30: 6d 6e 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  mns. */.  for(i=
ed40: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
ed50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
ed60: 70 72 20 2a 70 52 65 73 20 3d 20 70 45 4c 69 73  pr *pRes = pELis
ed70: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
ed80: 20 20 20 69 66 28 20 70 52 65 73 2d 3e 6f 70 21     if( pRes->op!
ed90: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74  =TK_COLUMN ) ret
eda0: 75 72 6e 20 30 3b 0a 20 20 20 20 61 73 73 65 72  urn 0;.    asser
edb0: 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d  t( pRes->iTable=
edc0: 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  =pSrc->a[0].iCur
edd0: 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61  sor );  /* Not a
ede0: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
edf0: 75 65 72 79 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  uery */.  }.  re
ee00: 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66  turn p;.}.#endif
ee10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ee20: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a  SUBQUERY */../*.
ee30: 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e  ** Code an OP_On
ee40: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  ce instruction a
ee50: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  nd allocate spac
ee60: 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20  e for its flag. 
ee70: 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61  Return the .** a
ee80: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
ee90: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
eea0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  /.int sqlite3Cod
eeb0: 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61  eOnce(Parse *pPa
eec0: 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  rse){.  Vdbe *v 
eed0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
eee0: 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f  (pParse);      /
eef0: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
ef00: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
ef10: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
ef20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ef30: 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e  P_Once, pParse->
ef40: 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 23 69 66  nOnce++);.}..#if
ef50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ef60: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
ef70: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
ef80: 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
ef90: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
efa0: 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
efb0: 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
efc0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
efd0: 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
efe0: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
eff0: 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
f000: 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
f010: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
f020: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
f030: 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
f040: 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
f050: 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
f060: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
f070: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
f080: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
f090: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
f0a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
f0b0: 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
f0c0: 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
f0d0: 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
f0e0: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71   int addr1;.  sq
f0f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f100: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
f110: 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20  , regHasNull);. 
f120: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
f130: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f140: 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20  _Rewind, iCur); 
f150: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f160: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f170: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
f180: 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48  n, iCur, 0, regH
f190: 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  asNull);.  sqlit
f1a0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
f1b0: 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  , OPFLAG_TYPEOFA
f1c0: 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65  RG);.  VdbeComme
f1d0: 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e  nt((v, "first_en
f1e0: 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75  try_in(%d)", iCu
f1f0: 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r));.  sqlite3Vd
f200: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f210: 64 72 31 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  dr1);.}.#endif..
f220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f230: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
f240: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
f250: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
f260: 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
f270: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
f280: 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
f290: 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
f2a0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
f2b0: 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
f2c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f2d0: 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
f2e0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
f2f0: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
f300: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
f310: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
f320: 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
f330: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
f340: 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
f350: 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
f360: 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
f370: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
f380: 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
f390: 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
f3a0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
f3b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
f3c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
f3d0: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
f3e0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
f3f0: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
f400: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
f410: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
f420: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
f430: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
f440: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
f450: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
f460: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
f470: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
f480: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
f490: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
f4a0: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
f4b0: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
f4c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
f4d0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
f4e0: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
f4f0: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
f500: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
f510: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
f520: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
f530: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
f540: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
f550: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
f560: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
f570: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
f580: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
f590: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
f5a0: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
f5b0: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
f5c0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
f5d0: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
f5e0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
f5f0: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
f600: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
f610: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
f620: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
f630: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
f640: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
f650: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
f660: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
f670: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
f680: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
f690: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
f6a0: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
f6b0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
f6c0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
f6d0: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
f6e0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
f6f0: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
f700: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
f710: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
f720: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
f730: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
f740: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
f750: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f760: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
f770: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
f780: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
f790: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
f7a0: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
f7b0: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
f7c0: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
f7d0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
f7f0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
f800: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
f810: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
f820: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
f830: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
f840: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
f850: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
f860: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
f870: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
f880: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
f890: 6e 31 3e 2c 20 3c 63 6f 6c 75 6d 6e 32 3e 2e 2e  n1>, <column2>..
f8a0: 2e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  . FROM <table>.*
f8b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
f8c0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
f8d0: 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
f8e0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
f8f0: 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
f900: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
f910: 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
f920: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
f930: 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
f940: 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
f950: 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
f960: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
f970: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
f980: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
f990: 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
f9a0: 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
f9b0: 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
f9c0: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  n exactly one of
f9d0: 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
f9e0: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
f9f0: 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
fa00: 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  P.  If inFlags c
fa10: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
fa20: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
fa30: 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
fa40: 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
fa50: 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66   used for a.** f
fa60: 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  ast membership t
fa70: 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
fa80: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
fa90: 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20   is set, the.** 
faa0: 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  IN index will be
fab0: 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
fac0: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
fad0: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
fae0: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ** IN operator..
faf0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
fb00: 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
fb10: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
fb20: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
fb30: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
fb40: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
fb50: 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
fb60: 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
fb70: 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
fb80: 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
fb90: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
fba0: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
fbb0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 73  selected columns
fbc0: 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a   are guaranteed.
fbd0: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
fbe0: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
fbf0: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
fc00: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
fc10: 20 64 75 65 20 74 6f 0a 2a 2a 20 61 20 55 4e 49   due to.** a UNI
fc20: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
fc30: 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  r index..**.** W
fc40: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
fc50: 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
fc60: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
fc70: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
fc80: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
fc90: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
fca0: 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
fcb0: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
fcc0: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
fcd0: 3c 63 6f 6c 75 6d 6e 73 3e 20 69 73 20 61 20 73  <columns> is a s
fce0: 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20 50 52  ingle INTEGER PR
fcf0: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
fd00: 20 6f 72 20 61 6e 20 0a 2a 2a 20 69 6e 64 65 78   or an .** index
fd10: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 77 69   can be found wi
fd20: 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
fd30: 20 3c 63 6f 6c 75 6d 6e 73 3e 20 61 73 20 69 74   <columns> as it
fd40: 73 20 6c 65 66 74 2d 6d 6f 73 74 2e 0a 2a 2a 0a  s left-most..**.
fd50: 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
fd60: 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
fd70: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
fd80: 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
fd90: 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
fda0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
fdb0: 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
fdc0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
fdd0: 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
fde0: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
fdf0: 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
fe00: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
fe10: 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
fe20: 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
fe30: 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
fe40: 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
fe50: 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
fe60: 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
fe70: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
fe80: 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
fe90: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
fea0: 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
feb0: 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
fec0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
fed0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
fee0: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
fef0: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
ff00: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
ff10: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
ff20: 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
ff30: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
ff40: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
ff50: 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
ff60: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
ff70: 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
ff80: 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
ff90: 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
ffa0: 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
ffb0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
ffc0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
ffd0: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
ffe0: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
fff0: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
10000 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
10010 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
10020 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
10030 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
10040 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
10050 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
10060 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
10070 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
10080 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
10090 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
100a0 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
100b0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
100c0 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
100d0 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
100e0 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
100f0 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
10100 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
10110 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
10120 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
10130 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
10140 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
10150 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
10160 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
10170 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
10180 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
10190 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
101a0 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
101b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 69 4d  **.** If the aiM
101c0 61 70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ap parameter is 
101d0 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 75 73  not NULL, it mus
101e0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
101f0 72 61 79 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ray containing.*
10200 2a 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 66 6f  * one element fo
10210 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 72 65  r each column re
10220 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
10230 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
10240 6e 20 74 68 65 20 52 48 53 0a 2a 2a 20 6f 66 20  n the RHS.** of 
10250 74 68 65 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72  the IN(...) oper
10260 61 74 6f 72 2e 20 54 68 65 20 69 27 74 68 20 65  ator. The i'th e
10270 6e 74 72 79 20 6f 66 20 74 68 65 20 61 72 72 61  ntry of the arra
10280 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  y is populated w
10290 69 74 68 20 74 68 65 0a 2a 2a 20 6f 66 66 73 65  ith the.** offse
102a0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63  t of the index c
102b0 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 61 74 63 68  olumn that match
102c0 65 73 20 74 68 65 20 69 27 74 68 20 63 6f 6c 75  es the i'th colu
102d0 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  mn returned by t
102e0 68 65 0a 2a 2a 20 53 45 4c 45 43 54 2e 20 46 6f  he.** SELECT. Fo
102f0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
10300 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
10310 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 20   selected index 
10320 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 3f 2c  are:.**.**   (?,
10330 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43 54 20  ?,?) IN (SELECT 
10340 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31 29  a, b, c FROM t1)
10350 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44  .**   CREATE IND
10360 45 58 20 69 31 20 4f 4e 20 74 31 28 62 2c 20 63  EX i1 ON t1(b, c
10370 2c 20 61 29 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  , a);.**.** then
10380 20 61 69 4d 61 70 5b 5d 20 69 73 20 70 6f 70 75   aiMap[] is popu
10390 6c 61 74 65 64 20 77 69 74 68 20 7b 32 2c 20 30  lated with {2, 0
103a0 2c 20 31 7d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  , 1}..*/.#ifndef
103b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
103c0 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
103d0 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 0a 20 20  3FindInIndex(.  
103e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
103f0 20 20 45 78 70 72 20 2a 70 58 2c 20 0a 20 20 75    Expr *pX, .  u
10400 33 32 20 69 6e 46 6c 61 67 73 2c 20 0a 20 20 69  32 inFlags, .  i
10410 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  nt *prRhsHasNull
10420 2c 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 0a 29  ,.  int *aiMap.)
10430 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
10460 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
10470 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
10480 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
10490 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
104a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
104b0 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
104c0 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
104d0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
104e0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
104f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
10500 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
10510 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
10520 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10540 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
10550 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
10560 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
10570 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
10580 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
10590 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
105a0 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
105b0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
105c0 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
105d0 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
105e0 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
105f0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  0;..  /* If the 
10600 52 48 53 20 6f 66 20 74 68 69 73 20 49 4e 28 2e  RHS of this IN(.
10610 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ..) operator is 
10620 61 20 53 45 4c 45 43 54 2c 20 61 6e 64 20 69 66  a SELECT, and if
10630 20 69 74 20 6d 61 74 74 65 72 73 20 0a 20 20 2a   it matters .  *
10640 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
10650 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75   the SELECT resu
10660 6c 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  lt contains NULL
10670 20 76 61 6c 75 65 73 2c 20 63 68 65 63 6b 20 77   values, check w
10680 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
10690 6f 74 20 4e 55 4c 4c 20 69 73 20 61 63 74 75 61  ot NULL is actua
106a0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 28 69 74  lly possible (it
106b0 20 6d 61 79 20 6e 6f 74 20 62 65 2c 20 66 6f 72   may not be, for
106c0 20 65 78 61 6d 70 6c 65 2c 20 64 75 65 20 0a 20   example, due . 
106d0 20 2a 2a 20 74 6f 20 4e 4f 54 20 4e 55 4c 4c 20   ** to NOT NULL 
106e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74  constraints in t
106f0 68 65 20 73 63 68 65 6d 61 29 2e 20 49 66 20 6e  he schema). If n
10700 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
10710 65 20 70 6f 73 73 69 62 6c 65 2c 0a 20 20 2a 2a  e possible,.  **
10720 20 73 65 74 20 70 72 52 68 73 48 61 73 4e 75 6c   set prRhsHasNul
10730 6c 20 74 6f 20 30 20 62 65 66 6f 72 65 20 63 6f  l to 0 before co
10740 6e 74 69 6e 75 69 6e 67 2e 20 20 2a 2f 0a 20 20  ntinuing.  */.  
10750 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
10760 20 26 26 20 28 70 58 2d 3e 66 6c 61 67 73 20 26   && (pX->flags &
10770 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
10780 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10790 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
107a0 74 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63  t = pX->x.pSelec
107b0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 66  t->pEList;.    f
107c0 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
107d0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
107e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
107f0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
10800 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
10810 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
10820 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 45 4c 69  .    if( i==pELi
10830 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
10840 20 20 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20     prRhsHasNull 
10850 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
10860 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
10870 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
10880 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
10890 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
108a0 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
108b0 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
108c0 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
108d0 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
108e0 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
108f0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  able.  */.  if( 
10900 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
10910 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64  && (p = isCandid
10920 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29  ateForInOpt(pX))
10930 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
10940 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
10950 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  >db;            
10960 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
10970 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  nnection */.    
10980 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
109b0 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
109c0 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
109d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
109f0 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
10a00 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
10a10 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  *pEList = p->pEL
10a20 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 6e 45 78  ist;.    int nEx
10a30 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
10a40 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  pr;..    assert(
10a50 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a70 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
10a80 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
10a90 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
10aa0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
10ab0 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
10ac0 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
10ad0 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
10ae0 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
10af0 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
10b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b10 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
10b20 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
10b30 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
10b40 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
10b50 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64 65  ab;..    /* Code
10b60 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69   an OP_Transacti
10b70 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c  on and OP_TableL
10b80 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e  ock for <table>.
10b90 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71   */.    iDb = sq
10ba0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
10bb0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
10bc0 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  hema);.    sqlit
10bd0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
10be0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
10bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c  .    sqlite3Tabl
10c00 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
10c10 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
10c20 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
10c30 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
10c40 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
10c50 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c  lled from two pl
10c60 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61  aces. In both ca
10c70 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20 20  ses the vdbe.   
10c80 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
10c90 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20  been allocated. 
10ca0 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65  So assume sqlite
10cb0 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61 6c  3GetVdbe() is al
10cc0 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63  ways.    ** succ
10cd0 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20  essful here..   
10ce0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76   */.    assert(v
10cf0 29 3b 0a 20 20 20 20 69 66 28 20 6e 45 78 70 72  );.    if( nExpr
10d00 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
10d10 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [0].pExpr->iColu
10d20 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  mn<0 ){.      in
10d30 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
10d40 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
10d50 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
10d60 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
10d70 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
10d80 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
10d90 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
10da0 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65  enRead);.      e
10db0 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
10dc0 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71  ROWID;..      sq
10dd0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10de0 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
10df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
10e00 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
10e30 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
10e40 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
10e50 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 1;.      int 
10e60 69 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  i;..      /* Che
10e70 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
10e80 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
10e90 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
10ea0 6d 20 65 61 63 68 20 0a 20 20 20 20 20 20 2a 2a  m each .      **
10eb0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
10ec0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61  he same as the a
10ed0 66 66 69 6e 69 74 79 20 6f 66 20 65 61 63 68 20  ffinity of each 
10ee0 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20  column. If.     
10ef0 20 2a 2a 20 69 74 20 6e 6f 74 2c 20 69 74 20 69   ** it not, it i
10f00 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
10f10 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
10f20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
10f30 3d 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 61  =0; i<nExpr && a
10f40 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 69 2b 2b 29  ffinity_ok; i++)
10f50 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
10f60 70 4c 68 73 20 3d 20 73 71 6c 69 74 65 33 45 78  pLhs = sqlite3Ex
10f70 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70 58  prVectorField(pX
10f80 2d 3e 70 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20  ->pLeft, i);.   
10f90 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
10fa0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
10fb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
10fc0 20 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66       char idxaff
10fd0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
10fe0 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  ol].affinity;.  
10ff0 20 20 20 20 20 20 63 68 61 72 20 63 6d 70 61 66        char cmpaf
11000 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
11010 72 65 41 66 66 69 6e 69 74 79 28 70 4c 68 73 2c  reAffinity(pLhs,
11020 20 69 64 78 61 66 66 29 3b 0a 20 20 20 20 20 20   idxaff);.      
11030 20 20 73 77 69 74 63 68 28 20 63 6d 70 61 66 66    switch( cmpaff
11040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
11050 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
11060 4f 42 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OB:.            
11070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
11080 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
11090 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 20 20 20  _TEXT:.         
110a0 20 20 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d     affinity_ok =
110b0 20 28 69 64 78 61 66 66 3d 3d 53 51 4c 49 54 45   (idxaff==SQLITE
110c0 5f 41 46 46 5f 54 45 58 54 29 3b 0a 20 20 20 20  _AFF_TEXT);.    
110d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
110e0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
110f0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 66  :.            af
11100 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69  finity_ok = sqli
11110 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
11120 6e 69 74 79 28 69 64 78 61 66 66 29 3b 0a 20 20  nity(idxaff);.  
11130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11140 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
11150 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
11160 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
11170 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
11180 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
11190 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
111a0 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
111b0 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
111c0 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
111d0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
111e0 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
111f0 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 0a 20 20 20  quence.  */..   
11200 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
11210 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26  ->pIndex; pIdx &
11220 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66  & eType==0 && af
11230 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d  finity_ok; pIdx=
11240 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
11250 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
11260 6e 4b 65 79 43 6f 6c 3c 6e 45 78 70 72 20 29 20  nKeyCol<nExpr ) 
11270 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
11280 20 20 69 66 28 20 6d 75 73 74 42 65 55 6e 69 71    if( mustBeUniq
11290 75 65 20 26 26 20 28 70 49 64 78 2d 3e 6e 4b 65  ue && (pIdx->nKe
112a0 79 43 6f 6c 21 3d 6e 45 78 70 72 20 7c 7c 20 21  yCol!=nExpr || !
112b0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
112c0 64 78 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dx)) ){.        
112d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
112e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
112f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b  or(i=0; i<nExpr;
11300 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
11310 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 73 71   Expr *pLhs = sq
11320 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 46  lite3ExprVectorF
11330 69 65 6c 64 28 70 58 2d 3e 70 4c 65 66 74 2c 20  ield(pX->pLeft, 
11340 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  i);.          Ex
11350 70 72 20 2a 70 52 68 73 20 3d 20 70 45 4c 69 73  pr *pRhs = pELis
11360 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
11370 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
11380 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33   *pReq = sqlite3
11390 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
113a0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68  lSeq(pParse, pLh
113b0 73 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 20 20  s, pRhs);.      
113c0 20 20 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 20 20      int j;..    
113d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
113e0 65 71 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  eq || pParse->nE
113f0 72 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rr );.          
11400 69 66 28 20 70 52 65 71 3d 3d 30 20 29 20 62 72  if( pReq==0 ) br
11410 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  eak;..          
11420 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72  for(j=0; j<nExpr
11430 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
11440 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
11450 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 70 52 68 73 2d  Column[j]!=pRhs-
11460 3e 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  >iColumn ) conti
11470 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
11480 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
11490 7a 43 6f 6c 6c 5b 6a 5d 20 29 3b 0a 20 20 20 20  zColl[j] );.    
114a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
114b0 74 65 33 53 74 72 49 43 6d 70 28 70 52 65 71 2d  te3StrICmp(pReq-
114c0 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
114d0 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f  Coll[j])!=0 ) co
114e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
114f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11510 20 69 66 28 20 6a 3d 3d 6e 45 78 70 72 20 29 20   if( j==nExpr ) 
11520 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
11530 20 69 66 28 20 61 69 4d 61 70 20 29 20 61 69 4d   if( aiMap ) aiM
11540 61 70 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 20  ap[i] = j;.     
11550 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
11560 28 20 69 3d 3d 6e 45 78 70 72 20 29 7b 0a 20 20  ( i==nExpr ){.  
11570 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64 64          int iAdd
11580 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f  r = sqlite3CodeO
11590 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62  nce(pParse); Vdb
115a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
115b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
115c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
115d0 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20  OpenRead, iTab, 
115e0 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
115f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11600 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
11610 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78  nfo(pParse, pIdx
11620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
11630 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
11640 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29  ", pIdx->zName))
11650 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
11660 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  rt( IN_INDEX_IND
11670 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e  EX_DESC == IN_IN
11680 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20  DEX_INDEX_ASC+1 
11690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79  );.          eTy
116a0 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  pe = IN_INDEX_IN
116b0 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e  DEX_ASC + pIdx->
116c0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a  aSortOrder[0];..
116d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
116e0 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20  RhsHasNull ){.  
116f0 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73            *prRhs
11700 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  HasNull = ++pPar
11710 73 65 2d 3e 6e 4d 65 6d 3b 0a 23 69 66 64 65 66  se->nMem;.#ifdef
11720 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
11730 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
11740 20 20 20 20 20 20 20 20 20 20 20 20 69 36 34 20              i64 
11750 6d 61 73 6b 20 3d 20 28 31 3c 3c 6e 45 78 70 72  mask = (1<<nExpr
11760 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )-1;.           
11770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11780 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c  p4Dup8(v, OP_Col
11790 75 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20  umnsUsed, .     
117a0 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c             iTab,
117b0 20 30 2c 20 30 2c 20 28 75 38 2a 29 26 6d 61 73   0, 0, (u8*)&mas
117c0 6b 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65  k, P4_INT64);.#e
117d0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
117e0 20 69 66 28 20 6e 45 78 70 72 3d 3d 31 20 29 7b   if( nExpr==1 ){
117f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
11800 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c  qlite3SetHasNull
11810 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70  Flag(v, iTab, *p
11820 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20  rRhsHasNull);.  
11830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11850 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11860 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
11870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11880 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
11890 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73  /* If no preexis
118a0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76  ting index is av
118b0 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
118c0 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61  IN clause.  ** a
118d0 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  nd IN_INDEX_NOOP
118e0 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72   is an allowed r
118f0 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  eply.  ** and th
11900 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
11910 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
11920 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65  st, not a subque
11930 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ry.  ** and the 
11940 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  RHS is not const
11950 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f  ant or has two o
11960 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20  r fewer terms,. 
11970 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e   ** then it is n
11980 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e  ot worth creatin
11990 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  g an ephemeral t
119a0 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65  able to evaluate
119b0 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65  .  ** the IN ope
119c0 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20  rator so return 
119d0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20  IN_INDEX_NOOP.. 
119e0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
119f0 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67  =0.   && (inFlag
11a00 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  s & IN_INDEX_NOO
11a10 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70  P_OK).   && !Exp
11a20 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
11a30 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20   EP_xIsSelect). 
11a40 20 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e    && (!sqlite3In
11a50 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58  RhsIsConstant(pX
11a60 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74  ) || pX->x.pList
11a70 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b  ->nExpr<=2).  ){
11a80 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f  .    eType = IN_
11a90 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  INDEX_NOOP;.  }.
11aa0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
11ab0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
11ac0 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
11ad0 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
11ae0 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
11af0 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
11b00 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
11b10 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
11b20 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
11b30 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
11b40 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
11b50 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
11b60 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
11b70 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
11b80 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
11b90 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
11ba0 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
11bb0 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
11bc0 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
11bd0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
11be0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
11bf0 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
11c00 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
11c10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
11c20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
11c30 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
11c40 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
11c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11c60 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
11c70 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
11c80 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
11c90 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
11ca0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
11cb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
11cc0 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
11cd0 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
11ce0 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
11cf0 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
11d00 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
11d10 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
11d20 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
11d30 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
11d40 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 0a 20 20 69  = iTab;.  }..  i
11d50 66 28 20 61 69 4d 61 70 20 26 26 20 65 54 79 70  f( aiMap && eTyp
11d60 65 21 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e!=IN_INDEX_INDE
11d70 58 5f 41 53 43 20 26 26 20 65 54 79 70 65 21 3d  X_ASC && eType!=
11d80 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
11d90 45 53 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ESC ){.    int i
11da0 2c 20 6e 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c  , n;.    n = sql
11db0 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
11dc0 7a 65 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  ze(pX->pLeft);. 
11dd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
11de0 20 69 2b 2b 29 20 61 69 4d 61 70 5b 69 5d 20 3d   i++) aiMap[i] =
11df0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
11e00 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
11e10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11e20 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
11e30 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 45  *.** Argument pE
11e40 78 70 72 20 69 73 20 61 6e 20 28 3f 2c 20 3f 2e  xpr is an (?, ?.
11e50 2e 2e 29 20 49 4e 28 2e 2e 2e 29 20 65 78 70 72  ..) IN(...) expr
11e60 65 73 73 69 6f 6e 2e 20 54 68 69 73 20 0a 2a 2a  ession. This .**
11e70 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
11e80 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
11e90 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
11ea0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
11eb0 6e 67 20 0a 2a 2a 20 74 68 65 20 61 66 66 69 6e  ng .** the affin
11ec0 69 74 69 65 73 20 74 6f 20 62 65 20 75 73 65 64  ities to be used
11ed0 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
11ee0 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
11ef0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  on..**.** It is 
11f00 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
11f10 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
11f20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
11f30 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
11f40 73 74 72 69 6e 67 20 69 73 20 65 76 65 6e 74 75  string is eventu
11f50 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
11f60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
11f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
11f80 20 2a 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79   *exprINAffinity
11f90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11fa0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
11fb0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
11fc0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 69 6e  xpr->pLeft;.  in
11fd0 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
11fe0 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
11ff0 4c 65 66 74 29 3b 0a 20 20 53 65 6c 65 63 74 20  Left);.  Select 
12000 2a 70 53 65 6c 65 63 74 20 3d 20 28 70 45 78 70  *pSelect = (pExp
12010 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  r->flags & EP_xI
12020 73 53 65 6c 65 63 74 29 20 3f 20 70 45 78 70 72  sSelect) ? pExpr
12030 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 3b  ->x.pSelect : 0;
12040 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  .  char *zRet;..
12050 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
12060 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
12070 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62  zRet = sqlite3Db
12080 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
12090 65 2d 3e 64 62 2c 20 6e 56 61 6c 2b 31 29 3b 0a  e->db, nVal+1);.
120a0 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20    if( zRet ){.  
120b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
120c0 28 69 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b  (i=0; i<nVal; i+
120d0 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
120e0 70 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pA = sqlite3Expr
120f0 56 65 63 74 6f 72 46 69 65 6c 64 28 70 4c 65 66  VectorField(pLef
12100 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 63 68 61  t, i);.      cha
12110 72 20 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70  r a = sqlite3Exp
12120 72 41 66 66 69 6e 69 74 79 28 70 41 29 3b 0a 20  rAffinity(pA);. 
12130 20 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74       if( pSelect
12140 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74   ){.        zRet
12150 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  [i] = sqlite3Com
12160 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 53 65  pareAffinity(pSe
12170 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  lect->pEList->a[
12180 69 5d 2e 70 45 78 70 72 2c 20 61 29 3b 0a 20 20  i].pExpr, a);.  
12190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
121a0 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 61 3b 0a     zRet[i] = a;.
121b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121c0 20 20 7a 52 65 74 5b 6e 56 61 6c 5d 20 3d 20 27    zRet[nVal] = '
121d0 5c 30 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  \0';.  }.  retur
121e0 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
121f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12200 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
12210 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 50 61  *.** Load the Pa
12220 72 73 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  rse object passe
12230 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
12240 72 67 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20  rgument with an 
12250 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67  error .** messag
12260 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  e of the form:.*
12270 2a 0a 2a 2a 20 20 20 22 73 75 62 2d 73 65 6c 65  *.**   "sub-sele
12280 63 74 20 72 65 74 75 72 6e 73 20 4e 20 63 6f 6c  ct returns N col
12290 75 6d 6e 73 20 2d 20 65 78 70 65 63 74 65 64 20  umns - expected 
122a0 4d 22 0a 2a 2f 20 20 20 0a 76 6f 69 64 20 73 71  M".*/   .void sq
122b0 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45 72  lite3SubselectEr
122c0 72 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ror(Parse *pPars
122d0 65 2c 20 69 6e 74 20 6e 41 63 74 75 61 6c 2c 20  e, int nActual, 
122e0 69 6e 74 20 6e 45 78 70 65 63 74 29 7b 0a 20 20  int nExpect){.  
122f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
12300 20 3d 20 22 73 75 62 2d 73 65 6c 65 63 74 20 72   = "sub-select r
12310 65 74 75 72 6e 73 20 25 64 20 63 6f 6c 75 6d 6e  eturns %d column
12320 73 20 2d 20 65 78 70 65 63 74 65 64 20 25 64 22  s - expected %d"
12330 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
12340 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 46 6d 74  Msg(pParse, zFmt
12350 2c 20 6e 41 63 74 75 61 6c 2c 20 6e 45 78 70 65  , nActual, nExpe
12360 63 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ct);.}.#endif../
12370 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
12380 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
12390 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
123a0 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
123b0 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a  ession, EXISTS,.
123c0 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ** or IN operato
123d0 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
123e0 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
123f0 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
12400 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
12410 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
12420 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
12430 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
12440 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
12450 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
12460 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
12470 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
12480 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
12490 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
124a0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
124b0 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
124c0 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
124d0 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
124e0 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
124f0 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
12500 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
12510 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
12520 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
12530 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
12540 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
12550 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
12560 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70  n-zero, then exp
12570 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
12580 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
12590 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
125a0 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c   "<rowid> IN (?,
125b0 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c   ?, ?)", where <
125c0 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65  rowid> is a refe
125d0 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65  rence.** to some
125e0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c   integer key col
125f0 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42  umn of a table B
12600 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
12610 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69  ase, use an.** i
12620 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20  ntkey B-Tree to 
12630 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
12640 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20   IN(...) values 
12650 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
12660 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29  sual.** (slower)
12670 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
12680 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a   keys B-Tree..**
12690 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e  .** If rMayHaveN
126a0 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ull is non-zero,
126b0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
126c0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
126d0 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20  s an IN.** (not 
126e0 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
126f0 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65  TS) and that the
12700 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61   RHS might conta
12710 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c  ins NULLs..** Al
12720 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
12730 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
12740 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  e the register g
12750 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
12760 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e  Null.** to NULL.
12770 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
12780 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  es will take car
12790 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
127a0 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76  is register.** v
127b0 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
127c0 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
127d0 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
127e0 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
127f0 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
12800 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
12810 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
12820 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
12830 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  For IN operators
12840 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
12850 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75  occurs, the retu
12860 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a  rn value is 0..*
12870 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12880 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
12890 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
128a0 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
128b0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
128c0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
128d0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
128e0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
128f0 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
12900 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
12910 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
12920 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20  t rHasNullFlag, 
12930 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
12940 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
12950 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
12960 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
12970 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
12980 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
12990 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
129a0 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
129b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70   */.){.  int jmp
129c0 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20  IfDynamic = -1; 
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
129f0 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
12a00 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12a30 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
12a40 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
12a50 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
12a60 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12a70 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
12a80 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
12a90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12aa0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
12ab0 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
12ac0 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
12ad0 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
12ae0 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
12af0 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
12b00 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
12b10 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
12b20 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
12b30 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
12b40 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
12b50 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
12b60 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
12b70 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
12b80 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
12b90 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
12ba0 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
12bb0 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
12bc0 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
12bd0 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
12be0 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
12bf0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
12c00 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
12c10 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
12c20 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
12c30 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
12c40 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
12c50 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
12c60 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
12c70 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
12c80 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
12c90 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e   ){.    jmpIfDyn
12ca0 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43 6f  amic = sqlite3Co
12cb0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
12cc0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12cd0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
12ce0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
12cf0 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  N.  if( pParse->
12d00 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
12d10 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
12d20 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
12d30 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
12d40 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
12d50 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d   %d",.        jm
12d60 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
12d70 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
12d80 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
12d90 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
12da0 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20  "SCALAR",.      
12db0 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53    pParse->iNextS
12dc0 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
12dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12de0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
12df0 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
12e00 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
12e10 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
12e20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
12e30 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
12e40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
12e50 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
12e60 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
12e70 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12e80 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65  s of OP_OpenEphe
12e90 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
12ea0 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  n */.      Expr 
12eb0 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
12ec0 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48  pLeft; /* the LH
12ed0 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
12ee0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65  ator */.      Ke
12ef0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
12f00 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79  = 0;      /* Key
12f10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
12f20 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 3b 20        int nVal; 
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 76 65 63    /* Size of vec
12f50 74 6f 72 20 70 4c 65 66 74 20 2a 2f 0a 20 20 20  tor pLeft */.   
12f60 20 20 20 0a 20 20 20 20 20 20 6e 56 61 6c 20 3d     .      nVal =
12f70 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74   sqlite3ExprVect
12f80 6f 72 53 69 7a 65 28 70 4c 65 66 74 29 3b 0a 20  orSize(pLeft);. 
12f90 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
12fa0 52 6f 77 69 64 20 7c 7c 20 6e 56 61 6c 3d 3d 31  Rowid || nVal==1
12fb0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68   );..      /* Wh
12fc0 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
12fd0 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
12fe0 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
12ff0 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
13000 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
13010 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
13020 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
13030 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
13040 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
13050 6c 65 64 20 77 69 74 68 20 69 6e 64 65 78 20 6b  led with index k
13060 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
13070 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
13080 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
13090 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65  SELECT or the <e
130a0 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20  xprlist>..      
130b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
130c0 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f  he 'x' expressio
130d0 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
130e0 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45  lue, or the SELE
130f0 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73  CT....      ** s
13100 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
13110 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
13120 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69   then the affini
13130 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20  ty of that.     
13140 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73   ** column is us
13150 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20  ed to build the 
13160 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62  index keys. If b
13170 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a  oth 'x' and the.
13180 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e        ** SELECT.
13190 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
131a0 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
131b0 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
131c0 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a  is used.      **
131d0 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d   if either colum
131e0 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72  n has NUMERIC or
131f0 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74   INTEGER affinit
13200 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20  y. If neither.  
13210 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74      ** 'x' nor t
13220 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61  he SELECT... sta
13230 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d  tement are colum
13240 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63  ns, then numeric
13250 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20   affinity.      
13260 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ** is used..    
13270 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72    */.      pExpr
13280 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
13290 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
132a0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
132b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
132c0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a  OpenEphemeral, .
132d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
132e0 3e 69 54 61 62 6c 65 2c 20 28 69 73 52 6f 77 69  >iTable, (isRowi
132f0 64 3f 30 3a 6e 56 61 6c 29 29 3b 0a 20 20 20 20  d?0:nVal));.    
13300 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52    pKeyInfo = isR
13310 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74  owid ? 0 : sqlit
13320 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
13330 50 61 72 73 65 2d 3e 64 62 2c 20 6e 56 61 6c 2c  Parse->db, nVal,
13340 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
13350 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
13360 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
13370 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
13380 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
13390 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
133a0 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
133b0 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
133c0 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
133d0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
133e0 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
133f0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
13400 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
13410 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
13420 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
13430 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65     */.        Se
13440 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20  lect *pSelect = 
13450 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
13460 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
13470 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 53 65  st *pEList = pSe
13480 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20  lect->pEList;.. 
13490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
134a0 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
134b0 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e     if( pEList->n
134c0 45 78 70 72 21 3d 6e 56 61 6c 20 29 7b 0a 20 20  Expr!=nVal ){.  
134d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
134e0 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
134f0 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  arse, pEList->nE
13500 78 70 72 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20  xpr, nVal);.    
13510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13520 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
13530 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
13540 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
13550 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13560 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
13570 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
13580 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  able);.         
13590 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 20 3d   dest.zAffSdst =
135a0 20 65 78 70 72 49 4e 41 66 66 69 6e 69 74 79 28   exprINAffinity(
135b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
135c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
135d0 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
135e0 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
135f0 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
13600 20 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74           pSelect
13610 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
13620 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
13630 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ( pSelect->selFl
13640 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
13650 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  t );.          t
13660 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
13670 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
13680 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
13690 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
136a0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ) */.          i
136b0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
136c0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
136d0 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
136e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
136f0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
13700 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74 29  , dest.zAffSdst)
13710 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
13720 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
13730 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
13740 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13750 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
13760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13770 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
13780 62 2c 20 64 65 73 74 2e 7a 41 66 66 53 64 73 74  b, dest.zAffSdst
13790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
137a0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ert( pKeyInfo!=0
137b0 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20   ); /* OOM will 
137c0 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65 72  cause exit after
137d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
137e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
137f0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
13800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
13810 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
13820 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
13830 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13840 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
13850 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
13860 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13870 3d 30 3b 20 69 3c 6e 56 61 6c 3b 20 69 2b 2b 29  =0; i<nVal; i++)
13880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
13890 70 72 20 2a 70 20 3d 20 28 6e 56 61 6c 3e 31 29  pr *p = (nVal>1)
138a0 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   ? sqlite3ExprVe
138b0 63 74 6f 72 46 69 65 6c 64 28 70 4c 65 66 74 2c  ctorField(pLeft,
138c0 20 69 29 20 3a 20 70 4c 65 66 74 3b 0a 20 20 20   i) : pLeft;.   
138d0 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
138e0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  o->aColl[i] = sq
138f0 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
13900 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 20 20 20  reCollSeq(.     
13910 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
13920 65 2c 20 70 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  e, p, pEList->a[
13930 69 5d 2e 70 45 78 70 72 0a 20 20 20 20 20 20 20  i].pExpr.       
13940 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
13950 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
13960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
13970 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
13980 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
13990 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
139a0 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
139b0 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
139c0 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
139d0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
139e0 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
139f0 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
13a00 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
13a10 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
13a20 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
13a30 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
13a40 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
13a50 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
13a60 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
13a70 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
13a80 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
13a90 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
13aa0 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
13ab0 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
13ac0 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
13ad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13ae0 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20   char affinity; 
13af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
13b00 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48  finity of the LH
13b10 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20  S of the IN */. 
13b20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
13b30 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
13b40 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
13b50 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
13b60 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
13b70 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
13b80 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
13b90 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 61 66   r3;..        af
13ba0 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
13bb0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
13bc0 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ft);.        if(
13bd0 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
13be0 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
13bf0 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
13c00 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OB;.        }.  
13c10 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
13c20 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
13c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
13c40 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
13c50 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
13c60 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
13c70 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
13c80 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
13c90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
13ca0 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
13cb0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  }..        /* Lo
13cc0 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
13cd0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
13ce0 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
13cf0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
13d00 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13d10 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20  se);.        r2 
13d20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13d30 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
13d40 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
13d50 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
13d60 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
13d70 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20   0, r2);.       
13d80 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
13d90 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
13da0 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
13db0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
13dc0 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
13dd0 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
13de0 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54         int iValT
13df0 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20  oIns;..         
13e00 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72 65   /* If the expre
13e10 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e  ssion is not con
13e20 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69  stant then we wi
13e30 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ll need to.     
13e40 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
13e50 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77 61  the test that wa
13e60 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76  s generated abov
13e70 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
13e80 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  e.          ** t
13e90 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78  his code only ex
13ea0 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65  ecutes once.  Be
13eb0 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d  cause for a non-
13ec0 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20  constant.       
13ed0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
13ee0 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75   we need to reru
13ef0 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63 68  n this code each
13f00 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20   time..         
13f10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
13f20 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d  ( jmpIfDynamic>=
13f30 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
13f40 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
13f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13f60 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13f70 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66  eToNoop(v, jmpIf
13f80 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20  Dynamic);.      
13f90 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d        jmpIfDynam
13fa0 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ic = -1;.       
13fb0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
13fc0 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
13fd0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69  expression and i
13fe0 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
13ff0 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a  e temp table */.
14000 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
14010 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65 33  Rowid && sqlite3
14020 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
14030 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29  2, &iValToIns) )
14040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
14050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14060 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c  v, OP_InsertInt,
14070 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
14080 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a  r2, iValToIns);.
14090 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
140a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33 20  .            r3 
140b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
140c0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
140d0 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  pE2, r1);.      
140e0 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
140f0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
14100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14110 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
14120 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20  eInt, r3,.      
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14150 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
14160 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  (v)+2);.        
14170 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
14180 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
14190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
141a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
141b0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
141c0 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20  le, r2, r3);.   
141d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
141f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
14200 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
14210 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66  , r3, 1, r2, &af
14220 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20  finity, 1);.    
14230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14240 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
14250 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
14260 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r3, 1);.       
14270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14290 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d  dxInsert, pExpr-
142a0 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20  >iTable, r2);.  
142b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
142c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
142d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
142e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
142f0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
14300 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
14310 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14320 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r2);.      }.
14330 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
14340 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  fo ){.        sq
14350 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
14360 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  4(v, addr, (void
14370 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
14380 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
14390 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
143a0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
143b0 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
143c0 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
143d0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
143e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61     /* If this ha
143f0 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
14400 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
14410 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
14420 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
14430 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
14440 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
14450 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
14460 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
14470 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
14480 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20  ell in iColumn. 
14490 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45   If this is an E
144a0 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20  XISTS, write.   
144b0 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
144c0 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20   0 (not exists) 
144d0 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69 6e  or 1 (exists) in
144e0 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
144f0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
14500 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79  cord that memory
14510 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
14520 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14530 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20   Select *pSel;  
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
14560 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e   statement to en
14570 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65  code */.      Se
14580 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65      /* How to de
145b0 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20 72  al with SELECt r
145c0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 69  esult */.      i
145d0 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
14600 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
14610 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
14620 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
14630 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
14640 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
14650 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
14660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14670 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
14680 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  ISTS || pExpr->o
14690 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
146a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
146b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
146c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
146d0 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 53 65  t) );..      pSe
146e0 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  l = pExpr->x.pSe
146f0 6c 65 63 74 3b 0a 20 20 20 20 20 20 6e 52 65 67  lect;.      nReg
14700 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b   = pExpr->op==TK
14710 5f 53 45 4c 45 43 54 20 3f 20 70 53 65 6c 2d 3e  _SELECT ? pSel->
14720 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  pEList->nExpr : 
14730 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
14740 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
14750 64 65 73 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  dest, 0, pParse-
14760 3e 6e 4d 65 6d 2b 31 29 3b 0a 20 20 20 20 20 20  >nMem+1);.      
14770 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
14780 6e 52 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20  nReg;.      if( 
14790 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
147a0 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
147b0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
147c0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
147d0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
147e0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
147f0 20 64 65 73 74 2e 6e 53 64 73 74 20 3d 20 6e 52   dest.nSdst = nR
14800 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
14810 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14820 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73   OP_Null, 0, des
14830 74 2e 69 53 44 50 61 72 6d 2c 20 64 65 73 74 2e  t.iSDParm, dest.
14840 69 53 44 50 61 72 6d 2b 6e 52 65 67 2d 31 29 3b  iSDParm+nReg-1);
14850 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
14860 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
14870 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
14880 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14890 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
148a0 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
148b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
148c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
148d0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
148e0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
148f0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
14900 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
14910 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
14920 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14930 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
14940 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
14950 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
14960 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
14970 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
14980 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
14990 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74       &sqlite3Int
149c0 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20  Tokens[1]);.    
149d0 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
149e0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e   0;.      pSel->
149f0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
14a00 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20  MultiValue;.    
14a10 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
14a20 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
14a30 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
14a40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14a50 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
14a60 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
14a70 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
14a80 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
14a90 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
14aa0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ab0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61  }.  }..  if( rHa
14ac0 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20  sNullFlag ){.   
14ad0 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
14ae0 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d  llFlag(v, pExpr-
14af0 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c  >iTable, rHasNul
14b00 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  lFlag);.  }..  i
14b10 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
14b20 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14b30 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14b40 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
14b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
14b60 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
14b70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
14b80 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
14b90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
14ba0 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
14bb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
14bc0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 45 78 70 72 20  UERY./*.** Expr 
14bd0 70 49 6e 20 69 73 20 61 6e 20 49 4e 28 2e 2e 2e  pIn is an IN(...
14be0 29 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 54 68  ) expression. Th
14bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
14c00 6b 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ks that the .** 
14c10 73 75 62 2d 73 65 6c 65 63 74 20 6f 6e 20 74 68  sub-select on th
14c20 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 28  e RHS of the IN(
14c30 29 20 6f 70 65 72 61 74 6f 72 20 68 61 73 20 74  ) operator has t
14c40 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
14c50 66 20 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 61 73  f .** columns as
14c60 20 74 68 65 20 76 65 63 74 6f 72 20 6f 6e 20 74   the vector on t
14c70 68 65 20 4c 48 53 2e 20 4f 72 2c 20 69 66 20 74  he LHS. Or, if t
14c80 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
14c90 28 29 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 20  () is not .** a 
14ca0 73 75 62 2d 71 75 65 72 79 2c 20 74 68 61 74 20  sub-query, that 
14cb0 74 68 65 20 4c 48 53 20 69 73 20 61 20 76 65 63  the LHS is a vec
14cc0 74 6f 72 20 6f 66 20 73 69 7a 65 20 31 2e 0a 2a  tor of size 1..*
14cd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
14ce0 72 43 68 65 63 6b 49 4e 28 50 61 72 73 65 20 2a  rCheckIN(Parse *
14cf0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 49  pParse, Expr *pI
14d00 6e 29 7b 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f  n){.  int nVecto
14d10 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  r = sqlite3ExprV
14d20 65 63 74 6f 72 53 69 7a 65 28 70 49 6e 2d 3e 70  ectorSize(pIn->p
14d30 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 28 70 49  Left);.  if( (pI
14d40 6e 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49  n->flags & EP_xI
14d50 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
14d60 69 66 28 20 6e 56 65 63 74 6f 72 21 3d 70 49 6e  if( nVector!=pIn
14d70 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
14d80 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
14d90 20 20 20 20 73 71 6c 69 74 65 33 53 75 62 73 65      sqlite3Subse
14da0 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
14db0 2c 20 70 49 6e 2d 3e 78 2e 70 53 65 6c 65 63 74  , pIn->x.pSelect
14dc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  ->pEList->nExpr,
14dd0 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20 20 20   nVector);.     
14de0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
14df0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65  .  }else if( nVe
14e00 63 74 6f 72 21 3d 31 20 29 7b 0a 20 20 20 20 69  ctor!=1 ){.    i
14e10 66 28 20 28 70 49 6e 2d 3e 70 4c 65 66 74 2d 3e  f( (pIn->pLeft->
14e20 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53 65  flags & EP_xIsSe
14e30 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73  lect) ){.      s
14e40 71 6c 69 74 65 33 53 75 62 73 65 6c 65 63 74 45  qlite3SubselectE
14e50 72 72 6f 72 28 70 50 61 72 73 65 2c 20 6e 56 65  rror(pParse, nVe
14e60 63 74 6f 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65  ctor, 1);.    }e
14e70 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
14e80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14e90 65 2c 20 22 69 6e 76 61 6c 69 64 20 75 73 65 20  e, "invalid use 
14ea0 6f 66 20 72 6f 77 20 76 61 6c 75 65 22 29 3b 0a  of row value");.
14eb0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14ec0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
14ed0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
14ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ef0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
14f00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
14f10 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
14f20 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
14f30 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
14f40 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
14f50 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
14f60 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
14f70 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
14f80 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78  ) is a scalar ex
14f90 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72  pression.  The r
14fa0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
14fb0 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72  RHS).** is an ar
14fc0 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
14fd0 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65  ore values.  The
14fe0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
14ff0 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  rue if the LHS i
15000 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77  s.** contained w
15010 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
15020 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
15030 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
15040 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a  nknown (NULL).**
15050 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e   if the LHS is N
15060 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48  ULL or if the LH
15070 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
15080 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
15090 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53  S and the.** RHS
150a0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
150b0 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
150c0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
150d0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
150e0 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
150f0 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
15100 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
15110 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
15120 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
15130 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
15140 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
15150 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
15160 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
15170 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
15180 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
15190 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
151a0 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
151b0 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
151c0 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
151d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
151e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
151f0 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
15200 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
15210 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
15220 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15230 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
15240 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
15250 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
15260 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
15270 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
15280 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
15290 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
152a0 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
152b0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
152c0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
152d0 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
152e0 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
152f0 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
15300 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
15310 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
15320 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
15330 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
15340 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
15350 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
15360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
15370 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
15380 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20  .  int r1;      
15390 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
153a0 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
153b0 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  er */.  Vdbe *v;
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
153d0 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
153e0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
153f0 0a 20 20 69 6e 74 20 2a 61 69 4d 61 70 20 3d 20  .  int *aiMap = 
15400 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 20  0;       /* Map 
15410 66 72 6f 6d 20 76 65 63 74 6f 72 20 66 69 65 6c  from vector fiel
15420 64 20 74 6f 20 69 6e 64 65 78 20 63 6f 6c 75 6d  d to index colum
15430 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  n */.  char *zAf
15440 66 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  f = 0;       /* 
15450 41 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20  Affinity string 
15460 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20  for comparisons 
15470 2a 2f 0a 20 20 69 6e 74 20 6e 56 65 63 74 6f 72  */.  int nVector
15480 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ;          /* Si
15490 7a 65 20 6f 66 20 76 65 63 74 6f 72 73 20 66 6f  ze of vectors fo
154a0 72 20 74 68 69 73 20 49 4e 28 2e 2e 2e 29 20 6f  r this IN(...) o
154b0 70 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  p */.  Expr *pLe
154c0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
154d0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  t;.  int i;..  i
154e0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
154f0 65 63 6b 49 4e 28 70 50 61 72 73 65 2c 20 70 45  eckIN(pParse, pE
15500 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  xpr) ) return;. 
15510 20 7a 41 66 66 20 3d 20 65 78 70 72 49 4e 41 66   zAff = exprINAf
15520 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 70  finity(pParse, p
15530 45 78 70 72 29 3b 0a 20 20 69 66 28 20 7a 41 66  Expr);.  if( zAf
15540 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  f==0 ) return;. 
15550 20 6e 56 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nVector = sqlit
15560 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
15570 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
15580 20 20 61 69 4d 61 70 20 3d 20 28 69 6e 74 2a 29    aiMap = (int*)
15590 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
155a0 65 72 6f 28 0a 20 20 20 20 20 20 70 50 61 72 73  ero(.      pPars
155b0 65 2d 3e 64 62 2c 20 6e 56 65 63 74 6f 72 2a 28  e->db, nVector*(
155c0 73 69 7a 65 6f 66 28 69 6e 74 29 20 2b 20 73 69  sizeof(int) + si
155d0 7a 65 6f 66 28 63 68 61 72 29 29 20 2b 20 31 0a  zeof(char)) + 1.
155e0 20 20 29 3b 0a 20 20 69 66 28 20 61 69 4d 61 70    );.  if( aiMap
155f0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
15600 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
15610 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20  >db, zAff);.    
15620 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
15630 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d  * Attempt to com
15640 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 41 66  pute the RHS. Af
15650 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 69  ter this step, i
15660 66 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  f anything other
15670 20 74 68 61 6e 0a 20 20 2a 2a 20 49 4e 5f 49 4e   than.  ** IN_IN
15680 44 45 58 5f 4e 4f 4f 50 20 69 73 20 72 65 74 75  DEX_NOOP is retu
15690 72 6e 65 64 2c 20 74 68 65 20 74 61 62 6c 65 20  rned, the table 
156a0 6f 70 65 6e 65 64 20 69 74 68 20 63 75 72 73 6f  opened ith curso
156b0 72 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  r pExpr->iTable 
156c0 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  .  ** contains t
156d0 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
156e0 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 20  ake up the RHS. 
156f0 49 66 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  If IN_INDEX_NOOP
15700 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 20 20   is returned,.  
15710 2a 2a 20 74 68 65 20 52 48 53 20 68 61 73 20 6e  ** the RHS has n
15720 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
15730 64 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  d.  */.  v = pPa
15740 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
15750 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
15760 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63      /* OOM detec
15770 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69  ted prior to thi
15780 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56  s routine */.  V
15790 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
157a0 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70  v, "begin IN exp
157b0 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20  r"));.  eType = 
157c0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
157d0 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ex(pParse, pExpr
157e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
15800 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
15810 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f  IP | IN_INDEX_NO
15820 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20  OP_OK,.         
15830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15840 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d      destIfFalse=
15850 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20  =destIfNull ? 0 
15860 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20  : &rRhsHasNull, 
15870 61 69 4d 61 70 29 3b 0a 0a 20 20 61 73 73 65 72  aiMap);..  asser
15880 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  t( pParse->nErr 
15890 7c 7c 20 6e 56 65 63 74 6f 72 3d 3d 31 20 7c 7c  || nVector==1 ||
158a0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
158b0 5f 45 50 48 0a 20 20 20 20 20 20 20 7c 7c 20 65  _EPH.       || e
158c0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49  Type==IN_INDEX_I
158d0 4e 44 45 58 5f 41 53 43 20 7c 7c 20 65 54 79 70  NDEX_ASC || eTyp
158e0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45  e==IN_INDEX_INDE
158f0 58 5f 44 45 53 43 20 0a 20 20 29 3b 0a 0a 20 20  X_DESC .  );..  
15900 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c  /* Code the LHS,
15910 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
15920 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
15930 29 22 2e 20 49 66 20 74 68 65 20 4c 48 53 20 69  )". If the LHS i
15940 73 20 61 20 0a 20 20 2a 2a 20 76 65 63 74 6f 72  s a .  ** vector
15950 2c 20 74 68 65 6e 20 69 74 20 69 73 20 73 74 6f  , then it is sto
15960 72 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 20  red in an array 
15970 6f 66 20 6e 56 65 63 74 6f 72 20 72 65 67 69 73  of nVector regis
15980 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 0a 20  ters starting . 
15990 20 2a 2a 20 61 74 20 72 31 2e 0a 20 20 2a 2f 0a   ** at r1..  */.
159a0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
159b0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
159c0 65 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 73  e, nVector);.  s
159d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
159e0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ush(pParse);.  i
159f0 66 28 20 6e 56 65 63 74 6f 72 3e 31 20 26 26 20  f( nVector>1 && 
15a00 28 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  (pLeft->flags & 
15a10 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
15a20 0a 20 20 20 20 69 6e 74 20 72 65 67 53 65 6c 65  .    int regSele
15a30 63 74 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  ct = sqlite3Code
15a40 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
15a50 2c 20 70 4c 65 66 74 2c 20 30 2c 20 30 29 3b 0a  , pLeft, 0, 0);.
15a60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15a70 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20  Vector; i++){.  
15a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15a90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
15aa0 2c 20 72 65 67 53 65 6c 65 63 74 2b 69 2c 20 72  , regSelect+i, r
15ab0 31 2b 61 69 4d 61 70 5b 69 5d 2c 20 30 29 3b 0a  1+aiMap[i], 0);.
15ac0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15ad0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56     for(i=0; i<nV
15ae0 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ector; i++){.   
15af0 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20     Expr *pLhs = 
15b00 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
15b10 72 46 69 65 6c 64 28 70 4c 65 66 74 2c 20 69 29  rField(pLeft, i)
15b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15b30 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
15b40 70 4c 68 73 2c 20 72 31 2b 61 69 4d 61 70 5b 69  pLhs, r1+aiMap[i
15b50 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
15b60 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
15b70 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
15b80 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
15b90 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
15ba0 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
15bb0 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
15bc0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
15bd0 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
15be0 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
15bf0 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
15c00 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sons..  */.  if(
15c10 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
15c20 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
15c30 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
15c40 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
15c50 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
15c60 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
15c70 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
15c80 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
15c90 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
15ca0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15cb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
15cc0 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
15cd0 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
15ce0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
15cf0 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
15d00 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15d10 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
15d20 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
15d30 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
15d40 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
15d50 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
15d60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
15d70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
15d80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15d90 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31  v, OP_BitAnd, r1
15da0 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r1, regCkNull)
15db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15dc0 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
15dd0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
15de0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
15df0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
15e00 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
15e10 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
15e20 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
15e30 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
15e40 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
15e50 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
15e60 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
15e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e80 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
15e90 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
15ea0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
15eb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
15ec0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
15ed0 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
15ee0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
15ef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15f00 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
15f10 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72  , r1, labelOk, r
15f20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
15f40 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
15f50 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
15f60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
15f70 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  , ii<pList->nExp
15f80 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  r-1);.        Vd
15f90 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
15fa0 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ii==pList->nExpr
15fb0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
15fc0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15fd0 28 76 2c 20 7a 41 66 66 5b 30 5d 29 3b 0a 20 20  (v, zAff[0]);.  
15fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ff0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
16000 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
16010 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
16020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16030 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65  v, OP_Ne, r1, de
16040 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
16070 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
16080 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
16090 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
160a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
160b0 28 76 2c 20 7a 41 66 66 5b 30 5d 20 7c 20 53 51  (v, zAff[0] | SQ
160c0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
160d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
160e0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
160f0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
16100 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  gToFree);.    }.
16110 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
16120 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
16130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16140 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b  OP_IsNull, regCk
16150 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c  Null, destIfNull
16160 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16170 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16180 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73  3VdbeGoto(v, des
16190 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
161a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
161b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
161c0 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
161d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
161e0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
161f0 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  kNull);.  }else{
16200 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e  .  .    /* If an
16210 79 20 76 61 6c 75 65 20 6f 6e 20 74 68 65 20 4c  y value on the L
16220 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  HS is NULL, the 
16230 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 49 4e  result of the IN
16240 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 0a 20  (...) operator. 
16250 20 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69     ** must be ei
16260 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55  ther false or NU
16270 4c 4c 2e 20 49 66 20 74 68 65 73 65 20 74 77 6f  LL. If these two
16280 20 61 72 65 20 68 61 6e 64 6c 65 64 20 69 64 65   are handled ide
16290 6e 74 69 63 61 6c 6c 79 2c 0a 20 20 20 20 2a 2a  ntically,.    **
162a0 20 74 65 73 74 20 74 68 65 20 4c 48 53 20 66 6f   test the LHS fo
162b0 72 20 4e 55 4c 4c 73 20 61 6e 64 20 6a 75 6d 70  r NULLs and jump
162c0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 64 65 73   directly to des
162d0 74 49 66 4e 75 6c 6c 20 69 66 20 61 6e 79 20 61  tIfNull if any a
162e0 72 65 0a 20 20 20 20 2a 2a 20 66 6f 75 6e 64 2e  re.    ** found.
162f0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16300 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 4e 55  Otherwise, if NU
16310 4c 4c 20 61 6e 64 20 66 61 6c 73 65 20 61 72 65  LL and false are
16320 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
16330 6e 74 6c 79 2c 20 61 6e 64 20 74 68 65 0a 20 20  ntly, and the.  
16340 20 20 2a 2a 20 49 4e 28 2e 2e 2e 29 20 6f 70 65    ** IN(...) ope
16350 72 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 20  ration is not a 
16360 76 65 63 74 6f 72 20 6f 70 65 72 61 74 69 6f 6e  vector operation
16370 2c 20 61 6e 64 20 74 68 65 20 4c 48 53 20 6f 66  , and the LHS of
16380 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72   the.    ** oper
16390 61 74 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ator is NULL, th
163a0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
163b0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 69 6e   false if the in
163c0 64 65 78 20 69 73 20 0a 20 20 20 20 2a 2a 20 63  dex is .    ** c
163d0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c  ompletely empty,
163e0 20 6f 72 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69   or NULL otherwi
163f0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
16400 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
16410 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
16420 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 65 63   for(i=0; i<nVec
16430 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tor; i++){.     
16440 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c     Expr *p = sql
16450 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 46 69  ite3ExprVectorFi
16460 65 6c 64 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  eld(pExpr->pLeft
16470 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
16480 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  ( sqlite3ExprCan
16490 42 65 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20  BeNull(p) ){.   
164a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
164b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
164c0 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70 5b  sNull, r1+aiMap[
164d0 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  i], destIfNull);
164e0 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
164f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
16500 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16510 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 65 63    }else if( nVec
16520 74 6f 72 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  tor==1 && sqlite
16530 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
16540 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
16550 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
16560 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16570 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
16580 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65  l, r1); VdbeCove
16590 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
165a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
165b0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
165c0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
165d0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
165e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
165f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16600 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74  VdbeGoto(v, dest
16610 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
16620 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
16630 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
16640 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65    }.  .    if( e
16650 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
16660 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
16670 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
16680 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
16690 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
166a0 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ree */.      sql
166b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
166c0 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20  , OP_SeekRowid, 
166d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
166e0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
166f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
16700 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
16710 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
16720 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
16730 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
16740 74 72 65 65 2e 20 41 70 70 6c 79 20 74 68 65 20  tree. Apply the 
16750 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20  comparison.     
16760 20 2a 2a 20 61 66 66 69 6e 69 74 69 65 73 20 74   ** affinities t
16770 6f 20 65 61 63 68 20 76 61 6c 75 65 20 6f 6e 20  o each value on 
16780 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 6f  the LHS of the o
16790 70 65 72 61 74 6f 72 2e 20 20 2a 2f 0a 20 20 20  perator.  */.   
167a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
167b0 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
167c0 69 74 79 2c 20 72 31 2c 20 6e 56 65 63 74 6f 72  ity, r1, nVector
167d0 2c 20 30 2c 20 7a 41 66 66 2c 20 6e 56 65 63 74  , 0, zAff, nVect
167e0 6f 72 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  or);.      .    
167f0 20 20 69 66 28 20 6e 56 65 63 74 6f 72 3e 31 20    if( nVector>1 
16800 26 26 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  && destIfNull!=d
16810 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
16820 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
16830 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
16840 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
16850 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
16860 64 72 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 20  drNext;..       
16870 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 69   /* Search the i
16880 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79  ndex for the key
16890 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64  . */.        add
168a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
168b0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
168c0 6f 75 6e 64 2c 20 69 49 64 78 2c 20 30 2c 20 72  ound, iIdx, 0, r
168d0 31 2c 20 6e 56 65 63 74 6f 72 29 3b 0a 20 20 20  1, nVector);.   
168e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
168f0 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  e(v);..        /
16900 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
16910 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b 65  the specified ke
16920 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  y is not present
16930 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 0a   in the index, .
16940 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
16950 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
16960 49 4e 28 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  IN(..) operator 
16970 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
16980 55 4c 4c 20 6f 72 0a 20 20 20 20 20 20 20 20 2a  ULL or.        *
16990 2a 20 30 2e 20 54 68 65 20 76 64 62 65 20 63 6f  * 0. The vdbe co
169a0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
169b0 6f 77 20 66 69 67 75 72 65 73 20 6f 75 74 20 77  ow figures out w
169c0 68 69 63 68 2e 20 20 2a 2f 0a 20 20 20 20 20 20  hich.  */.      
169d0 20 20 61 64 64 72 4e 65 78 74 20 3d 20 31 2b 73    addrNext = 1+s
169e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
169f0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
16a00 49 64 78 2c 20 64 65 73 74 49 66 46 61 6c 73 65  Idx, destIfFalse
16a10 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
16a20 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
16a30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16a40 6e 56 65 63 74 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nVector; i++){. 
16a50 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
16a60 3b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c  ;.          Coll
16a70 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
16a80 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
16a90 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
16aa0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
16ab0 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
16ac0 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28 70  xprVectorField(p
16ad0 4c 65 66 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Left, i);.      
16ae0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
16af0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
16b00 50 61 72 73 65 2c 20 70 29 3b 0a 0a 20 20 20 20  Parse, p);..    
16b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16b20 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
16b30 6c 75 6d 6e 2c 20 69 49 64 78 2c 20 69 2c 20 72  lumn, iIdx, i, r
16b40 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
16b50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
16b60 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2b 69 2c 20  v, OP_Eq, r1+i, 
16b70 30 2c 20 72 32 2c 20 28 76 6f 69 64 2a 29 70 43  0, r2, (void*)pC
16b80 6f 6c 6c 2c 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  oll,P4_COLLSEQ);
16b90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16ba0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16bb0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
16bc0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ULL);.          
16bd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16be0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16bf0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16c00 4f 50 5f 4e 65 78 74 2c 20 69 49 64 78 2c 20 61  OP_Next, iIdx, a
16c10 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
16c20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16c30 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
16c40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16c50 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16c60 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
16c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16c80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73  dbeJumpHere(v, s
16c90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16ca0 74 41 64 64 72 28 76 29 2d 33 29 3b 0a 20 20 20  tAddr(v)-3);.   
16cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
16cc0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16cd0 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
16ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
16cf0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16d00 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
16d10 74 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  tIfNull);..     
16d20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 77 61     /* The key wa
16d30 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 69  s found in the i
16d40 6e 64 65 78 2e 20 49 66 20 69 74 20 63 6f 6e 74  ndex. If it cont
16d50 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20 76 61  ains any NULL va
16d60 6c 75 65 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a  lues,.        **
16d70 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
16d80 20 6f 66 20 74 68 65 20 49 4e 28 2e 2e 2e 29 20   of the IN(...) 
16d90 6f 70 65 72 61 74 6f 72 20 69 73 20 4e 55 4c 4c  operator is NULL
16da0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
16db0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75  .        ** resu
16dc0 6c 74 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 20  lt is 1.  */.   
16dd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16de0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16df0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
16e00 3d 30 3b 20 69 3c 6e 56 65 63 74 6f 72 3b 20 69  =0; i<nVector; i
16e10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
16e20 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
16e30 45 78 70 72 56 65 63 74 6f 72 46 69 65 6c 64 28  ExprVectorField(
16e40 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69 29  pExpr->pLeft, i)
16e50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16e60 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
16e70 4e 75 6c 6c 28 70 29 20 29 7b 0a 20 20 20 20 20  Null(p) ){.     
16e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16e90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16ea0 73 4e 75 6c 6c 2c 20 72 31 2b 61 69 4d 61 70 5b  sNull, r1+aiMap[
16eb0 69 5d 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  i], destIfNull);
16ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
16ed0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16ef0 20 20 7d 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65    }..      }else
16f00 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
16f10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
16f20 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
16f30 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77  ns if it is know
16f40 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  n at compile tim
16f50 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20  e that the RHS. 
16f60 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74         ** cannot
16f70 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
16f80 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
16f90 6e 73 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ns as a result. 
16fa0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 22 4e 4f         ** of "NO
16fb0 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
16fc0 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  nts in the datab
16fd0 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
16fe0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16ff0 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
17000 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
17010 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
17020 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a  FALSE.        **
17030 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
17040 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
17050 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  .  */.        sq
17060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
17070 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt(.            
17080 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
17090 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
170a0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20  estIfFalse, r1, 
170b0 6e 56 65 63 74 6f 72 0a 20 20 20 20 20 20 20 20  nVector.        
170c0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
170d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
170e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
170f0 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e   /* In this bran
17100 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ch, the RHS of t
17110 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74  he IN might cont
17120 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20  ain a NULL and. 
17130 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
17140 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c  esence of a NULL
17150 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65   on the RHS make
17160 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69  s a difference i
17170 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
17180 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20   outcome..      
17190 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
171a0 20 61 64 64 72 31 3b 0a 0a 20 20 20 20 20 20 20   addr1;..       
171b0 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
171c0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
171d0 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
171e0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
171f0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
17200 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  en the answer is
17210 20 54 52 55 45 20 74 68 65 20 70 72 65 73 65 6e   TRUE the presen
17220 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74  ce of NULLs in t
17230 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20 20  he RHS does.    
17240 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65      ** not matte
17250 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  r.  If the LHS i
17260 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
17270 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65 6e  in the RHS, then
17280 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
17290 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20 69  answer is NULL i
172a0 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  f the RHS contai
172b0 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65  ns NULLs and the
172c0 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20 20   answer is.     
172d0 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74     ** FALSE if t
172e0 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
172f0 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ree..        */.
17300 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d 20          addr1 = 
17310 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17320 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
17330 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
17340 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20   0, r1, 1);.    
17350 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
17360 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
17370 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17380 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68  , OP_IsNull, rRh
17390 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
173a0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56  Null);.        V
173b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
173c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
173d0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
173e0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
173f0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17400 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
17410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17420 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
17430 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17440 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
17450 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
17460 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  rse);.  sqlite3D
17470 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
17480 2c 20 61 69 4d 61 70 29 3b 0a 20 20 73 71 6c 69  , aiMap);.  sqli
17490 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
174a0 2d 3e 64 62 2c 20 7a 41 66 66 29 3b 0a 20 20 56  ->db, zAff);.  V
174b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
174c0 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  end IN expr"));.
174d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
174e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
174f0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
17500 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
17510 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65  G_POINT./*.** Ge
17520 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
17530 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
17540 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
17550 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
17560 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
17570 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
17580 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
17590 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
175a0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
175b0 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
175c0 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
175d0 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
175e0 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
175f0 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
17600 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
17610 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
17620 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
17630 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
17640 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
17650 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
17660 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
17670 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
17680 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
17690 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
176a0 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
176b0 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
176c0 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
176d0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
176e0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
176f0 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
17700 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
17710 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
17720 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
17730 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
17740 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
17750 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c   -value;.    sql
17760 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
17770 70 38 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p8(v, OP_Real, 0
17780 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29  , iMem, 0, (u8*)
17790 26 76 61 6c 75 65 2c 20 50 34 5f 52 45 41 4c 29  &value, P4_REAL)
177a0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
177b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
177c0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
177d0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
177e0 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
177f0 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
17800 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
17810 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
17820 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69   Expr.u.zToken i
17830 73 20 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e  s always UTF8 an
17840 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  d zero-terminate
17850 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
17860 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61  d codeInteger(Pa
17870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
17880 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65  r *pExpr, int ne
17890 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  gFlag, int iMem)
178a0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
178b0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
178c0 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
178d0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
178e0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78  .    int i = pEx
178f0 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20  pr->u.iValue;.  
17900 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29    assert( i>=0 )
17910 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61  ;.    if( negFla
17920 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20  g ) i = -i;.    
17930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17940 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17950 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c   i, iMem);.  }el
17960 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20  se{.    int c;. 
17970 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20     i64 value;.  
17980 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
17990 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
179a0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  n;.    assert( z
179b0 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73  !=0 );.    c = s
179c0 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
179d0 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a  I64(z, &value);.
179e0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20      if( c==0 || 
179f0 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67  (c==2 && negFlag
17a00 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ) ){.      if( n
17a10 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20  egFlag ){ value 
17a20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53  = c==2 ? SMALLES
17a30 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65  T_INT64 : -value
17a40 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
17a50 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
17a60 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20  v, OP_Int64, 0, 
17a70 69 4d 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76  iMem, 0, (u8*)&v
17a80 61 6c 75 65 2c 20 50 34 5f 49 4e 54 36 34 29 3b  alue, P4_INT64);
17a90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  .    }else{.#ifd
17aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
17ab0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
17ac0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17ad0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65  Msg(pParse, "ove
17ae0 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20  rsized integer: 
17af0 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f  %s%s", negFlag ?
17b00 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23   "-" : "", z);.#
17b10 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
17b20 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54  ITE_OMIT_HEX_INT
17b30 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73  EGER.      if( s
17b40 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
17b50 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a  z,"0x",2)==0 ){.
17b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17b70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17b80 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f  "hex literal too
17b90 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20   big: %s", z);. 
17ba0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
17bb0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
17bc0 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
17bd0 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
17be0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
17bf0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
17c00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17c10 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 56 65 72  DEBUG)./*.** Ver
17c20 69 66 79 20 74 68 65 20 63 6f 6e 73 69 73 74 65  ify the consiste
17c30 6e 63 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ncy of the colum
17c40 6e 20 63 61 63 68 65 0a 2a 2f 0a 73 74 61 74 69  n cache.*/.stati
17c50 63 20 69 6e 74 20 63 61 63 68 65 49 73 56 61 6c  c int cacheIsVal
17c60 69 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  id(Parse *pParse
17c70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
17c80 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 53 51   for(i=n=0; i<SQ
17c90 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
17ca0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
17cb0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
17cc0 5b 69 5d 2e 69 52 65 67 3e 30 20 29 20 6e 2b 2b  [i].iReg>0 ) n++
17cd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
17ce0 3d 3d 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61  ==pParse->nColCa
17cf0 63 68 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  che;.}.#endif../
17d00 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63  *.** Clear a cac
17d10 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  he entry..*/.sta
17d20 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
17d30 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
17d40 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79  pParse, struct y
17d50 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20  ColCache *p){.  
17d60 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29  if( p->tempReg )
17d70 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
17d80 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
17d90 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
17da0 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20  mpReg) ){.      
17db0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
17dc0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
17dd0 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  g++] = p->iReg;.
17de0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d      }.    p->tem
17df0 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pReg = 0;.  }.  
17e00 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 70  p->iReg = 0;.  p
17e10 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65  Parse->nColCache
17e20 2d 2d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  --;.  assert( pP
17e30 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
17e40 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49  Failed || cacheI
17e50 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
17e60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ;.}.../*.** Reco
17e70 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
17e80 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
17e90 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
17ea0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
17eb0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
17ec0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
17ed0 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
17ee0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
17ef0 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
17f00 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
17f10 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
17f20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
17f30 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
17f40 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
17f50 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
17f60 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
17f70 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
17f80 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
17f90 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
17fa0 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
17fb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
17fc0 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
17fd0 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
17fe0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
18000 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
18010 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
18020 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
18030 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
18040 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
18050 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
18060 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
18070 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
18080 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
18090 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
180a0 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
180b0 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
180c0 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
180d0 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
180e0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
180f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
18100 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
18110 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
18120 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
18130 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
18140 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
18150 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
18160 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
18170 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
18180 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
18190 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
181a0 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
181b0 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
181c0 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
181d0 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
181e0 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
181f0 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
18200 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
18210 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
18220 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
18230 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
18240 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
18250 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
18260 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c  t( p->iReg==0 ||
18270 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62   p->iTable!=iTab
18280 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   || p->iColumn!=
18290 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iCol );.  }.#end
182a0 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e  if..  /* Find an
182b0 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20   empty slot and 
182c0 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20  replace it */.  
182d0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
182e0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
182f0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
18300 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
18310 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30    if( p->iReg==0
18320 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65   ){.      p->iLe
18330 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
18340 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
18350 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
18360 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  b;.      p->iCol
18370 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
18380 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
18390 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
183a0 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
183b0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
183c0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
183d0 20 20 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61    pParse->nColCa
183e0 63 68 65 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  che++;.      ass
183f0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
18400 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
18410 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70 50   cacheIsValid(pP
18420 61 72 73 65 29 20 29 3b 0a 20 20 20 20 20 20 72  arse) );.      r
18430 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
18440 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
18450 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79  he last recently
18460 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72   used */.  minLr
18470 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a  u = 0x7fffffff;.
18480 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20    idxLru = -1;. 
18490 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
184a0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
184b0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
184c0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
184d0 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69     if( p->lru<mi
184e0 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64  nLru ){.      id
184f0 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20  xLru = i;.      
18500 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b  minLru = p->lru;
18510 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18520 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d   ALWAYS(idxLru>=
18530 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  0) ){.    p = &p
18540 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
18550 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d  [idxLru];.    p-
18560 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65  >iLevel = pParse
18570 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20  ->iCacheLevel;. 
18580 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
18590 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c  Tab;.    p->iCol
185a0 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
185b0 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
185c0 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
185d0 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d   0;.    p->lru =
185e0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43   pParse->iCacheC
185f0 6e 74 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  nt++;.    assert
18600 28 20 63 61 63 68 65 49 73 56 61 6c 69 64 28 70  ( cacheIsValid(p
18610 50 61 72 73 65 29 20 29 3b 0a 20 20 20 20 72 65  Parse) );.    re
18620 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  turn;.  }.}../*.
18630 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
18640 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65   registers betwe
18650 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52  en iReg..iReg+nR
18660 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f  eg-1 are being o
18670 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50  verwritten..** P
18680 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f  urge the range o
18690 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d  f registers from
186a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
186b0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
186c0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
186d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
186e0 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e   int iReg, int n
186f0 52 65 67 29 7b 0a 20 20 73 74 72 75 63 74 20 79  Reg){.  struct y
18700 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 69  ColCache *p;.  i
18710 66 28 20 69 52 65 67 3c 3d 30 20 7c 7c 20 70 50  f( iReg<=0 || pP
18720 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3d  arse->nColCache=
18730 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
18740 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
18750 43 61 63 68 65 5b 53 51 4c 49 54 45 5f 4e 5f 43  Cache[SQLITE_N_C
18760 4f 4c 43 41 43 48 45 2d 31 5d 3b 0a 20 20 77 68  OLCACHE-1];.  wh
18770 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20  ile(1){.    if( 
18780 70 2d 3e 69 52 65 67 20 3e 3d 20 69 52 65 67 20  p->iReg >= iReg 
18790 26 26 20 70 2d 3e 69 52 65 67 20 3c 20 69 52 65  && p->iReg < iRe
187a0 67 2b 6e 52 65 67 20 29 20 63 61 63 68 65 45 6e  g+nReg ) cacheEn
187b0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
187c0 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d   p);.    if( p==
187d0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
187e0 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  e ) break;.    p
187f0 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
18800 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75   Remember the cu
18810 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63  rrent column cac
18820 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79  he context.  Any
18830 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64   new entries add
18840 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74  ed.** added to t
18850 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
18860 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20  after this call 
18870 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e  are removed when
18880 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
18890 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73  nding pop occurs
188a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
188b0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50  3ExprCachePush(P
188c0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
188d0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
188e0 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53  evel++;.#ifdef S
188f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
18900 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
18910 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
18920 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
18930 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20     printf("PUSH 
18940 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
18950 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
18960 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
18970 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20  .** Remove from 
18980 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
18990 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61   any entries tha
189a0 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e  t were added sin
189b0 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72  ce the.** the pr
189c0 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78  evious sqlite3Ex
189d0 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72  prCachePush oper
189e0 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ation.  In other
189f0 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a   words, restore.
18a00 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  ** the cache to 
18a10 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
18a20 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f   in prior the mo
18a30 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a  st recent Push..
18a40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18a50 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73  xprCachePop(Pars
18a60 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
18a70 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
18a80 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73  olCache *p;.  as
18a90 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43  sert( pParse->iC
18aa0 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a  acheLevel>=1 );.
18ab0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
18ac0 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20  Level--;.#ifdef 
18ad0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
18ae0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
18af0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
18b00 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
18b10 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20      printf("POP 
18b20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
18b30 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
18b40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
18b50 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
18b60 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
18b70 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
18b80 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
18b90 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70  if( p->iReg && p
18ba0 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d  ->iLevel>pParse-
18bb0 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a  >iCacheLevel ){.
18bc0 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
18bd0 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
18be0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18bf0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
18c00 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
18c10 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
18c20 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
18c30 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
18c40 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
18c50 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
18c60 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
18c70 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
18c80 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
18c90 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
18ca0 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
18cb0 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
18cc0 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
18cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
18ce0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
18cf0 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
18d00 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
18d10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
18d20 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
18d30 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
18d40 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
18d50 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
18d60 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
18d70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
18d80 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
18d90 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
18da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
18db0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18dc0 74 68 61 74 20 77 69 6c 6c 20 6c 6f 61 64 20 69  that will load i
18dd0 6e 74 6f 20 72 65 67 69 73 74 65 72 20 72 65 67  nto register reg
18de0 4f 75 74 20 61 20 76 61 6c 75 65 20 74 68 61 74  Out a value that
18df0 20 69 73 0a 2a 2a 20 61 70 70 72 6f 70 72 69 61   is.** appropria
18e00 74 65 20 66 6f 72 20 74 68 65 20 69 49 64 78 43  te for the iIdxC
18e10 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
18e20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 76  index pIdx..*/.v
18e30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
18e40 6f 64 65 4c 6f 61 64 49 6e 64 65 78 43 6f 6c 75  odeLoadIndexColu
18e50 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
18e60 72 73 65 2c 20 20 2f 2a 20 54 68 65 20 70 61 72  rse,  /* The par
18e70 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18e80 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
18e90 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77    /* The index w
18ea0 68 6f 73 65 20 63 6f 6c 75 6d 6e 20 69 73 20 74  hose column is t
18eb0 6f 20 62 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  o be loaded */. 
18ec0 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
18ed0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
18ee0 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 72  ing to a table r
18ef0 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ow */.  int iIdx
18f00 43 6f 6c 2c 20 20 20 20 2f 2a 20 54 68 65 20 63  Col,    /* The c
18f10 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
18f20 65 78 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  ex to be loaded 
18f30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
18f40 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68       /* Store th
18f50 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 76  e index column v
18f60 61 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67  alue in this reg
18f70 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 31  ister */.){.  i1
18f80 36 20 69 54 61 62 43 6f 6c 20 3d 20 70 49 64 78  6 iTabCol = pIdx
18f90 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 49 64 78 43  ->aiColumn[iIdxC
18fa0 6f 6c 5d 3b 0a 20 20 69 66 28 20 69 54 61 62 43  ol];.  if( iTabC
18fb0 6f 6c 3d 3d 58 4e 5f 45 58 50 52 20 29 7b 0a 20  ol==XN_EXPR ){. 
18fc0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
18fd0 3e 61 43 6f 6c 45 78 70 72 20 29 3b 0a 20 20 20  >aColExpr );.   
18fe0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
18ff0 43 6f 6c 45 78 70 72 2d 3e 6e 45 78 70 72 3e 69  ColExpr->nExpr>i
19000 49 64 78 43 6f 6c 20 29 3b 0a 20 20 20 20 70 50  IdxCol );.    pP
19010 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 20 3d  arse->iSelfTab =
19020 20 69 54 61 62 43 75 72 3b 0a 20 20 20 20 73 71   iTabCur;.    sq
19030 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
19040 79 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e  y(pParse, pIdx->
19050 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 69 49 64 78  aColExpr->a[iIdx
19060 43 6f 6c 5d 2e 70 45 78 70 72 2c 20 72 65 67 4f  Col].pExpr, regO
19070 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
19080 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19090 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
190a0 65 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  e(pParse->pVdbe,
190b0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 69   pIdx->pTable, i
190c0 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20  TabCur,.        
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 61 62              iTab
190f0 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
19100 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
19110 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72  ate code to extr
19120 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  act the value of
19130 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
19140 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a  umn of a table..
19150 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
19160 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
19170 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20  OfTable(.  Vdbe 
19180 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  *v,        /* Th
19190 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e  e VDBE under con
191a0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  struction */.  T
191b0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f  able *pTab,    /
191c0 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74  * The table cont
191d0 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
191e0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
191f0 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  r,    /* The tab
19200 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74  le cursor.  Or t
19210 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72  he PK cursor for
19220 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a   WITHOUT ROWID *
19230 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
19240 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
19250 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78  the column to ex
19260 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  tract */.  int r
19270 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78  egOut      /* Ex
19280 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20  tract the value 
19290 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74  into this regist
192a0 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  er */.){.  if( i
192b0 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70  Col<0 || iCol==p
192c0 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
192d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
192e0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
192f0 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74   iTabCur, regOut
19300 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19310 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75  int op = IsVirtu
19320 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43  al(pTab) ? OP_VC
19330 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d  olumn : OP_Colum
19340 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69  n;.    int x = i
19350 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61  Col;.    if( !Ha
19360 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20  sRowid(pTab) && 
19370 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29  !IsVirtual(pTab)
19380 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73 71   ){.      x = sq
19390 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
193a0 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61 72  ex(sqlite3Primar
193b0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 2c  yKeyIndex(pTab),
193c0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
193d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
193e0 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62 43  Op3(v, op, iTabC
193f0 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a  ur, x, regOut);.
19400 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d    }.  if( iCol>=
19410 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
19420 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c  ColumnDefault(v,
19430 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67   pTab, iCol, reg
19440 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
19450 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19460 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
19470 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  ct the iColumn-t
19480 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a  h column from.**
19490 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
194a0 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  store the column
194b0 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67 69   value in a regi
194c0 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e 20  ster. .**.** An 
194d0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
194e0 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
194f0 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
19500 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69 73  ster iReg.  This
19510 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61 6e  .** is not garan
19520 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f 6c  teeed for GetCol
19530 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73 75  umn() - the resu
19540 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  lt can be stored
19550 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69 73   in.** any regis
19560 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72 65  ter.  But the re
19570 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74 65  sult is guarante
19580 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72 65  ed to land in re
19590 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20 66  gister iReg.** f
195a0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  or GetColumnToRe
195b0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  g()..**.** There
195c0 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
195d0 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20   cursor to pTab 
195e0 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74  in iTable when t
195f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
19600 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43  s called.  If iC
19610 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64  olumn<0 then cod
19620 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
19630 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68 65  hat extracts the
19640 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73   rowid..*/.int s
19650 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
19660 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  tColumn(.  Parse
19670 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
19680 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
19690 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
196a0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
196b0 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Tab,     /* Desc
196c0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74  ription of the t
196d0 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64  able we are read
196e0 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ing from */.  in
196f0 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f  t iColumn,     /
19700 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
19710 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  able column */. 
19720 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
19730 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
19740 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
19750 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
19760 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53  Reg,        /* S
19770 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72  tore results her
19780 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20  e */.  u8 p5    
19790 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61          /* P5 va
197a0 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d  lue for OP_Colum
197b0 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b 0a  n + FLAGS */.){.
197c0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
197d0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
197e0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
197f0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
19800 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
19810 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
19820 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
19830 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
19840 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26  if( p->iReg>0 &&
19850 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
19860 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
19870 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
19880 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
19890 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
198a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
198b0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
198c0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
198d0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
198e0 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
198f0 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
19900 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
19910 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
19920 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
19930 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
19940 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
19950 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
19960 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
19970 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
19980 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
19990 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
199a0 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
199b0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
199c0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
199d0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  .}.void sqlite3E
199e0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
199f0 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20 2a  ToReg(.  Parse *
19a00 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
19a10 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
19a20 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
19a30 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
19a40 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
19a50 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
19a60 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
19a70 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
19a80 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
19a90 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
19aa0 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
19ab0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
19ac0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
19ad0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
19ae0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
19af0 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g         /* Sto
19b00 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
19b10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  */.){.  int r1 =
19b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19b30 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  GetColumn(pParse
19b40 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e 2c  , pTab, iColumn,
19b50 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20 30   iTable, iReg, 0
19b60 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52 65  );.  if( r1!=iRe
19b70 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  g ) sqlite3VdbeA
19b80 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70 56  ddOp2(pParse->pV
19b90 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72  dbe, OP_SCopy, r
19ba0 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f 2a  1, iReg);.}.../*
19bb0 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63 6f  .** Clear all co
19bc0 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72 69  lumn cache entri
19bd0 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
19be0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
19bf0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  r(Parse *pParse)
19c00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
19c10 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
19c20 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  ;..#if SQLITE_DE
19c30 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73 65  BUG.  if( pParse
19c40 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
19c50 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
19c60 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  ace ){.    print
19c70 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20 20  f("CLEAR\n");.  
19c80 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
19c90 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
19ca0 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
19cb0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
19cc0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
19cd0 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20 20   p->iReg ){.    
19ce0 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61    cacheEntryClea
19cf0 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
19d00 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
19d10 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   Record the fact
19d20 20 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74   that an affinit
19d30 79 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63  y change has occ
19d40 75 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a  urred on iCount.
19d50 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61  ** registers sta
19d60 72 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72  rting with iStar
19d70 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
19d80 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
19d90 69 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20  ityChange(Parse 
19da0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74  *pParse, int iSt
19db0 61 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29  art, int iCount)
19dc0 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
19dd0 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
19de0 65 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e  e, iStart, iCoun
19df0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  t);.}../*.** Gen
19e00 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  erate code to mo
19e10 76 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ve content from 
19e20 72 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e  registers iFrom.
19e30 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a  ..iFrom+nReg-1.*
19e40 2a 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69  * over to iTo..i
19e50 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20  To+nReg-1. Keep 
19e60 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
19e70 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
19e80 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
19e90 43 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a  CodeMove(Parse *
19ea0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
19eb0 6d 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20  m, int iTo, int 
19ec0 6e 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28  nReg){.  assert(
19ed0 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67   iFrom>=iTo+nReg
19ee0 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d   || iFrom+nReg<=
19ef0 69 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTo );.  sqlite3
19f00 56 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73  VdbeAddOp3(pPars
19f10 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76  e->pVdbe, OP_Mov
19f20 65 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e  e, iFrom, iTo, n
19f30 52 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Reg);.  sqlite3E
19f40 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
19f50 50 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52  Parse, iFrom, nR
19f60 65 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  eg);.}..#if defi
19f70 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
19f80 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
19f90 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
19fa0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
19fb0 74 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69  true if any regi
19fc0 73 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67  ster in the rang
19fd0 65 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e  e iFrom..iTo (in
19fe0 63 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75  clusive).** is u
19ff0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
1a000 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
1a010 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a020 69 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68  ine is used with
1a030 69 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  in assert() and 
1a040 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
1a050 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f  s only.** and do
1a060 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
1a070 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e   a normal build.
1a080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a090 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
1a0a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1a0b0 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
1a0c0 54 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  To){.  int i;.  
1a0d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
1a0e0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
1a0f0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
1a100 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
1a110 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
1a120 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d  ++){.    int r =
1a130 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66   p->iReg;.    if
1a140 28 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c  ( r>=iFrom && r<
1a150 3d 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b  =iTo ) return 1;
1a160 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
1a170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a180 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1a190 54 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49  TE_DEBUG || SQLI
1a1a0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
1a1b0 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76   */.../*.** Conv
1a1c0 65 72 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ert an expressio
1a1d0 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52  n node to a TK_R
1a1e0 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69  EGISTER.*/.stati
1a1f0 63 20 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67  c void exprToReg
1a200 69 73 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69  ister(Expr *p, i
1a210 6e 74 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f  nt iReg){.  p->o
1a220 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d  p2 = p->op;.  p-
1a230 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45  >op = TK_REGISTE
1a240 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  R;.  p->iTable =
1a250 20 69 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65   iReg;.  ExprCle
1a260 61 72 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  arProperty(p, EP
1a270 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 73 74 61 74 69  _Skip);.}..stati
1a280 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
1a290 65 74 77 65 65 6e 28 50 61 72 73 65 2a 2c 45 78  etween(Parse*,Ex
1a2a0 70 72 2a 2c 69 6e 74 2c 76 6f 69 64 28 2a 29 28  pr*,int,void(*)(
1a2b0 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c 69 6e 74  Parse*,Expr*,int
1a2c0 2c 69 6e 74 29 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  ,int),int);../*.
1a2d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1a2e0 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
1a2f0 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61  t Vdbe to evalua
1a300 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  te the given.** 
1a310 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74 74  expression.  Att
1a320 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74 68  empt to store th
1a330 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67  e results in reg
1a340 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e 0a  ister "target"..
1a350 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
1a360 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65 73  gister where res
1a370 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 2e  ults are stored.
1a380 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69 73  .**.** With this
1a390 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65 20   routine, there 
1a3a0 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65 20  is no guarantee 
1a3b0 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69 6c  that results wil
1a3c0 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20 69  l.** be stored i
1a3d0 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  n target.  The r
1a3e0 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20 73  esult might be s
1a3f0 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f 74  tored in some ot
1a400 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72 20  her.** register 
1a410 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e 69  if it is conveni
1a420 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20 54  ent to do so.  T
1a430 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
1a440 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65 63  ion.** must chec
1a450 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  k the return cod
1a460 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72  e and move the r
1a470 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64 65  esults to the de
1a480 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74 65  sired.** registe
1a490 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1a4a0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
1a4b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1a4c0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1a4d0 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1a4e0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1a4f0 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20 75  be;  /* The VM u
1a500 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1a510 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  n */.  int op;  
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 62   /* The opcode b
1a540 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
1a550 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72 67  int inReg = targ
1a560 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  et;       /* Res
1a570 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20 72  ults stored in r
1a580 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a 2f  egister inReg */
1a590 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1a5a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
1a5b0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
1a5c0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
1a5d0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
1a5e0 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 20  t regFree2 = 0; 
1a5f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
1a600 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73  n-zero free this
1a610 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
1a620 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31 2c  ter */.  int r1,
1a630 20 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20   r2;            
1a640 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72 65     /* Various re
1a650 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 2a  gister numbers *
1a660 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1a670 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a  = pParse->db; /*
1a680 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1a690 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
1a6a0 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20 20  pr tempX;       
1a6b0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
1a6c0 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  rary expression 
1a6d0 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 35  node */.  int p5
1a6e0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1a6f0 20 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72   target>0 && tar
1a700 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65  get<=pParse->nMe
1a710 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  m );.  if( v==0 
1a720 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a730 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1a740 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72  cFailed );.    r
1a750 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1a760 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
1a770 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c      op = TK_NULL
1a780 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1a790 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1a7a0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20   }.  switch( op 
1a7b0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1a7c0 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  GG_COLUMN: {.   
1a7d0 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67     AggInfo *pAgg
1a7e0 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
1a7f0 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74  ggInfo;.      st
1a800 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
1a810 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e   *pCol = &pAggIn
1a820 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  fo->aCol[pExpr->
1a830 69 41 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28  iAgg];.      if(
1a840 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65   !pAggInfo->dire
1a850 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ctMode ){.      
1a860 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
1a870 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20  iMem>0 );.      
1a880 20 20 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e    inReg = pCol->
1a890 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72  iMem;.        br
1a8a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
1a8b0 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75   if( pAggInfo->u
1a8c0 73 65 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a  seSortingIdx ){.
1a8d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a8e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a8f0 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f  Column, pAggInfo
1a900 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  ->sortingIdxPTab
1a910 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a930 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
1a940 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
1a950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a960 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74     }.      /* Ot
1a970 68 65 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68  herwise, fall th
1a980 72 75 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43  ru into the TK_C
1a990 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20  OLUMN case */.  
1a9a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1a9b0 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1a9c0 69 6e 74 20 69 54 61 62 20 3d 20 70 45 78 70 72  int iTab = pExpr
1a9d0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
1a9e0 69 66 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20  if( iTab<0 ){.  
1a9f0 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1aa00 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20  ->ckBase>0 ){.  
1aa10 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
1aa20 61 74 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73  ating CHECK cons
1aa30 74 72 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72  traints or inser
1aa40 74 69 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61  ting into partia
1aa50 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  l index */.     
1aa60 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
1aa70 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50  pr->iColumn + pP
1aa80 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20  arse->ckBase;.  
1aa90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1aaa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1aab0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 69 6e          /* Codin
1aac0 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  g an expression 
1aad0 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
1aae0 61 6e 20 69 6e 64 65 78 20 77 68 65 72 65 20 63  an index where c
1aaf0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 20 20  olumn names.    
1ab00 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
1ab10 69 6e 64 65 78 20 72 65 66 65 72 20 74 6f 20 74  index refer to t
1ab20 68 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63  he table to whic
1ab30 68 20 74 68 65 20 69 6e 64 65 78 20 62 65 6c 6f  h the index belo
1ab40 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ngs */.         
1ab50 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
1ab60 69 53 65 6c 66 54 61 62 3b 0a 20 20 20 20 20 20  iSelfTab;.      
1ab70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ab80 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
1ab90 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
1aba0 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
1abb0 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
1abe0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
1abf0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
1ac20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ac30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1ac40 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1ac50 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
1ac60 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
1ac70 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
1ac80 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1ac90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
1aca0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
1acb0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
1acc0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1acd0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1ace0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1acf0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
1ad00 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
1ad10 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
1ad20 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
1ad30 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1ad40 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
1ad50 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
1ad60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1ad70 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1ad80 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1ad90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
1ada0 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 74 61 72  oadString(v, tar
1adb0 67 65 74 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  get, pExpr->u.zT
1adc0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1add0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1ade0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
1adf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ae00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1ae10 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1ae20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ae30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ae40 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1ae50 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1ae60 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
1ae70 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
1ae80 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
1ae90 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
1aea0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1aeb0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1aec0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1aed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1aee0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
1aef0 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
1af00 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
1af10 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
1af20 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1af30 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
1af40 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
1af50 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
1af60 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
1af70 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
1af80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
1af90 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
1afa0 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
1afb0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
1afc0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
1afd0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1afe0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1aff0 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
1b000 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
1b010 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
1b020 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1b030 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1b040 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1b050 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1b060 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1b070 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1b080 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b090 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
1b0a0 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
1b0b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
1b0c0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
1b0d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b0e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
1b0f0 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
1b100 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
1b110 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1b120 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
1b130 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1b140 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
1b150 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
1b160 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
1b170 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
1b180 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
1b190 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
1b1a0 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
1b1b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1b1c0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
1b1d0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
1b1e0 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
1b1f0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
1b200 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1b210 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b220 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1b230 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
1b240 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
1b250 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1b260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b270 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20  T_CAST.    case 
1b280 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20  TK_CAST: {.     
1b290 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
1b2a0 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43  of the form:   C
1b2b0 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b  AST(pLeft AS tok
1b2c0 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52  en) */.      inR
1b2d0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1b2e0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1b2f0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1b300 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1b310 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65  if( inReg!=targe
1b320 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1b330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b340 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1b350 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1b360 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
1b370 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  et;.      }.    
1b380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b390 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20  Op2(v, OP_Cast, 
1b3a0 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3c0 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
1b3d0 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ype(pExpr->u.zTo
1b3e0 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ken, 0));.      
1b3f0 74 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73  testcase( usedAs
1b400 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
1b410 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67  se, inReg, inReg
1b420 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) );.      sqlit
1b430 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1b440 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1b450 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20  , inReg, 1);.   
1b460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b470 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1b480 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20  _OMIT_CAST */.  
1b490 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1b4a0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1b4b0 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d  .      op = (op=
1b4c0 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20  =TK_IS) ? TK_EQ 
1b4d0 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 70  : TK_NE;.      p
1b4e0 35 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  5 = SQLITE_NULLE
1b4f0 51 3b 0a 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c  Q;.      /* fall
1b500 2d 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20  -through */.    
1b510 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1b520 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1b530 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1b540 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1b550 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1b560 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1b570 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
1b580 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1b590 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1b5a0 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 4c  3ExprIsVector(pL
1b5b0 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eft) ){.        
1b5c0 63 6f 64 65 56 65 63 74 6f 72 43 6f 6d 70 61 72  codeVectorCompar
1b5d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
1b5e0 20 74 61 72 67 65 74 2c 20 6f 70 2c 20 70 35 29   target, op, p5)
1b5f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b600 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1b610 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1b620 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 26  pParse, pLeft, &
1b630 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1b640 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1b650 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1b660 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1b670 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1b680 20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61         codeCompa
1b690 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1b6a0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1b6b0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1b6c0 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20   r1, r2, inReg, 
1b6d0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20 7c  SQLITE_STOREP2 |
1b6e0 20 70 35 29 3b 0a 20 20 20 20 20 20 20 20 61 73   p5);.        as
1b6f0 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1b700 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1b710 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1b720 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1b730 5f 4c 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Lt);.        as
1b740 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1b750 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1b760 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1b770 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1b780 5f 4c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Le);.        as
1b790 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
1b7a0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1b7b0 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
1b7c0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1b7d0 5f 47 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Gt);.        as
1b7e0 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47  sert(TK_GE==OP_G
1b7f0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1b800 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ge); VdbeCov
1b810 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1b820 5f 47 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Ge);.        as
1b830 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1b840 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1b850 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
1b860 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1b870 5f 45 71 29 3b 0a 20 20 20 20 20 20 20 20 61 73  _Eq);.        as
1b880 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1b890 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1b8a0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1b8b0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1b8c0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  _Ne);.        te
1b8d0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1b8e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
1b8f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1b900 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
1b910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b920 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
1b930 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
1b940 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
1b950 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
1b960 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
1b970 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
1b980 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
1b990 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
1b9a0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1b9b0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
1b9c0 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
1b9d0 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
1b9e0 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
1b9f0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
1ba00 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
1ba10 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
1ba20 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d );            
1ba30 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ba40 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73  _AND );.      as
1ba50 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f  sert( TK_OR==OP_
1ba60 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  Or );           
1ba70 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ba80 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20  =TK_OR );.      
1ba90 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d  assert( TK_PLUS=
1baa0 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20  =OP_Add );      
1bab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1bac0 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20  p==TK_PLUS );.  
1bad0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
1bae0 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
1baf0 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73  t );     testcas
1bb00 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20  e( op==TK_MINUS 
1bb10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1bb20 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61   TK_REM==OP_Rema
1bb30 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65  inder );      te
1bb40 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52  stcase( op==TK_R
1bb50 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
1bb60 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
1bb70 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20  P_BitAnd );     
1bb80 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1bb90 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20  K_BITAND );.    
1bba0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
1bbb0 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20  OR==OP_BitOr ); 
1bbc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1bbd0 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b   op==TK_BITOR );
1bbe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1bbf0 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69  K_SLASH==OP_Divi
1bc00 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74  de );       test
1bc10 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41  case( op==TK_SLA
1bc20 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  SH );.      asse
1bc30 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f  rt( TK_LSHIFT==O
1bc40 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20  P_ShiftLeft );  
1bc50 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1bc60 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_LSHIFT );.    
1bc70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48    assert( TK_RSH
1bc80 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67  IFT==OP_ShiftRig
1bc90 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  ht );  testcase(
1bca0 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29   op==TK_RSHIFT )
1bcb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bcc0 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f  TK_CONCAT==OP_Co
1bcd0 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73  ncat );      tes
1bce0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f  tcase( op==TK_CO
1bcf0 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31  NCAT );.      r1
1bd00 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bd10 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1bd20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1bd30 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1bd40 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1bd50 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1bd60 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1bd70 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1bd80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bd90 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31  p3(v, op, r2, r1
1bda0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1bdb0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1bdc0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1bdd0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1bde0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1bdf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1be00 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1be10 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
1be20 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
1be30 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
1be40 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
1be50 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
1be60 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
1be70 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
1be80 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  r(pParse, pLeft,
1be90 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66   1, target);.#if
1bea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1beb0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
1bec0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1bed0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c  pLeft->op==TK_FL
1bee0 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OAT ){.        a
1bef0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1bf00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1bf10 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
1bf20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
1bf30 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  v, pLeft->u.zTok
1bf40 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  en, 1, target);.
1bf50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1bf60 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  se{.        temp
1bf70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45  X.op = TK_INTEGE
1bf80 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  R;.        tempX
1bf90 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56  .flags = EP_IntV
1bfa0 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  alue|EP_TokenOnl
1bfb0 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  y;.        tempX
1bfc0 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20  .u.iValue = 0;. 
1bfd0 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1bfe0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1bff0 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20  pParse, &tempX, 
1c000 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1c010 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1c020 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1c030 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1c040 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1c050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c060 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
1c070 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c  ubtract, r2, r1,
1c080 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1c090 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1c0a0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1c0b0 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   }.      inReg =
1c0c0 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62   target;.      b
1c0d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c0e0 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a  case TK_BITNOT:.
1c0f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1c100 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1c110 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42   TK_BITNOT==OP_B
1c120 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63  itNot );   testc
1c130 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e  ase( op==TK_BITN
1c140 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OT );.      asse
1c150 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
1c160 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65  ot );         te
1c170 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1c180 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1c190 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c1a0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1c1b0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1c1c0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73  ree1);.      tes
1c1d0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1c1e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  =0 );.      inRe
1c1f0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
1c200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c210 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69  Op2(v, op, r1, i
1c220 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nReg);.      bre
1c230 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c240 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
1c250 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
1c260 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  L: {.      int a
1c270 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ddr;.      asser
1c280 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50  t( TK_ISNULL==OP
1c290 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73  _IsNull );   tes
1c2a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1c2b0 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73  NULL );.      as
1c2c0 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  sert( TK_NOTNULL
1c2d0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20  ==OP_NotNull ); 
1c2e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1c2f0 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  _NOTNULL );.    
1c300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c310 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1c320 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 1, target);. 
1c330 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1c340 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1c350 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1c360 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1c370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c380 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1c390 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
1c3a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1c3b0 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   op, r1);.      
1c3c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1c3d0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
1c3e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1c3f0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1c400 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  _NOTNULL);.     
1c410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c420 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
1c430 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1c440 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1c450 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
1c460 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c470 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c480 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
1c490 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
1c4a0 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70  pInfo = pExpr->p
1c4b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  AggInfo;.      i
1c4c0 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  f( pInfo==0 ){. 
1c4d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1c4e0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c4f0 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1c500 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ue) );.        s
1c510 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1c520 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
1c530 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28  f aggregate: %s(
1c540 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  )", pExpr->u.zTo
1c550 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1c560 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  e{.        inReg
1c570 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b   = pInfo->aFunc[
1c580 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65  pExpr->iAgg].iMe
1c590 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
1c5a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c5b0 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1c5c0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1c5d0 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1c5e0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1c5f0 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1c600 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   */.      int nF
1c610 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
1c620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
1c630 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1c640 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
1c650 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
1c660 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
1c670 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65   definition obje
1c680 63 74 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  ct */.      cons
1c690 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
1c6a0 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
1c6b0 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  on name */.     
1c6c0 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d   u32 constMask =
1c6d0 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20   0;     /* Mask 
1c6e0 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  of function argu
1c6f0 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20 63  ments that are c
1c700 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20  onstant */.     
1c710 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1c720 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1c730 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1c740 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
1c750 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  );      /* The t
1c760 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65  ext encoding use
1c770 64 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  d by this databa
1c780 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  se */.      Coll
1c790 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20  Seq *pColl = 0; 
1c7a0 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e     /* A collatin
1c7b0 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20  g sequence */.. 
1c7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1c7d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c7e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1c7f0 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
1c800 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c810 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
1c820 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
1c830 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20  pFarg = 0;.     
1c840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c850 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78  pFarg = pExpr->x
1c860 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  .pList;.      }.
1c870 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46        nFarg = pF
1c880 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78  arg ? pFarg->nEx
1c890 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73  pr : 0;.      as
1c8a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1c8b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1c8c0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
1c8d0 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
1c8e0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1c8f0 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
1c900 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
1c910 7a 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  zId, nFarg, enc,
1c920 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   0);.#ifdef SQLI
1c930 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
1c940 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
1c950 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
1c960 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
1c970 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ain ){.        p
1c980 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
1c990 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 75  dFunction(db, "u
1c9a0 6e 6b 6e 6f 77 6e 22 2c 20 6e 46 61 72 67 2c 20  nknown", nFarg, 
1c9b0 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
1c9c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
1c9d0 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
1c9e0 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 20  f->xFinalize!=0 
1c9f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ca00 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ca10 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63  e, "unknown func
1ca20 74 69 6f 6e 3a 20 25 73 28 29 22 2c 20 7a 49 64  tion: %s()", zId
1ca30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1ca40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1ca50 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
1ca60 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
1ca70 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
1ca80 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
1ca90 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
1caa0 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
1cab0 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
1cac0 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61 74  ecessary evaluat
1cad0 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ion of.      ** 
1cae0 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74  arguments past t
1caf0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c  he first non-NUL
1cb00 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  L argument..    
1cb10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1cb20 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
1cb30 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41   SQLITE_FUNC_COA
1cb40 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20  LESCE ){.       
1cb50 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65   int endCoalesce
1cb60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1cb70 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1cb80 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72      assert( nFar
1cb90 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20  g>=2 );.        
1cba0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1cbb0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
1cbc0 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [0].pExpr, targe
1cbd0 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t);.        for(
1cbe0 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=1; i<nFarg; i+
1cbf0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1cc00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cc10 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74  v, OP_NotNull, t
1cc20 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73  arget, endCoales
1cc30 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  ce);.          V
1cc40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1cc50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cc60 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
1cc70 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c  (pParse, target,
1cc80 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
1cc90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1cca0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1ccb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ccc0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1ccd0 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
1cce0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ccf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1cd00 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1cd10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cd20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1cd30 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65  esolveLabel(v, e
1cd40 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
1cd50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cd60 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68    }..      /* Th
1cd70 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e  e UNLIKELY() fun
1cd80 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1cd90 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  .  The result is
1cda0 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1cdb0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1cdc0 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
1cdd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
1cde0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
1cdf0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
1ce00 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
1ce10 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31  assert( nFarg>=1
1ce20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65   );.        inRe
1ce30 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1ce40 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1ce50 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
1ce60 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1ce70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ce80 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
1ce90 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
1cea0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1ceb0 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
1cec0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
1ced0 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
1cee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
1cef0 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b  stcase( i==31 );
1cf00 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
1cf10 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33  Mask |= MASKBIT3
1cf20 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2(i);.        }.
1cf30 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
1cf40 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
1cf50 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
1cf60 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
1cf70 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
1cf80 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
1cf90 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
1cfa0 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
1cfb0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
1cfc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1cfd0 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
1cfe0 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b     if( constMask
1cff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31   ){.          r1
1d000 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
1d010 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
1d020 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61  rse->nMem += nFa
1d030 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rg;.        }els
1d040 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e{.          r1 
1d050 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1d060 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
1d070 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  arg);.        }.
1d080 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
1d090 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70  length() and typ
1d0a0 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  eof() functions 
1d0b0 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72  with a column ar
1d0c0 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  gument,.        
1d0d0 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61  ** set the P5 pa
1d0e0 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f  rameter to the O
1d0f0 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
1d100 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  to OPFLAG_LENGTH
1d110 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ARG.        ** o
1d120 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  r OPFLAG_TYPEOFA
1d130 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  RG respectively,
1d140 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
1d150 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20  ssary data.     
1d160 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20     ** loading.. 
1d170 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d180 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
1d190 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
1d1a0 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
1d1b0 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
1d1c0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d1d0 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20    u8 exprOp;.   
1d1e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1d1f0 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
1d200 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61       assert( pFa
1d210 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  rg->a[0].pExpr!=
1d220 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  0 );.          e
1d230 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61  xprOp = pFarg->a
1d240 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  [0].pExpr->op;. 
1d250 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
1d260 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  rOp==TK_COLUMN |
1d270 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47  | exprOp==TK_AGG
1d280 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1d290 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
1d2a0 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
1d2b0 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
1d2c0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
1d2d0 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
1d2e0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
1d2f0 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
1d300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
1d310 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
1d320 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41  uncFlags & OPFLA
1d330 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
1d340 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
1d350 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1d360 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 = .           
1d370 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e         pDef->fun
1d380 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47  cFlags & (OPFLAG
1d390 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
1d3a0 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
1d3b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d3c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
1d3d0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1d3e0 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
1d3f0 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
1d400 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
1d410 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d420 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1d430 20 70 46 61 72 67 2c 20 72 31 2c 20 30 2c 0a 20   pFarg, r1, 0,. 
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1d460 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
1d470 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1d480 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
1d490 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1d4a0 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
1d4b0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
1d4c0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
1d4d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
1d4e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
1d4f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d500 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1d510 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
1d520 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
1d530 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
1d540 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
1d550 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
1d560 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
1d570 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d580 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
1d590 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
1d5a0 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
1d5b0 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
1d5c0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
1d5d0 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
1d5e0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
1d5f0 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
1d600 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
1d610 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
1d620 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
1d630 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
1d640 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
1d650 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
1d660 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
1d670 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
1d680 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
1d690 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
1d6a0 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
1d6b0 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
1d6c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1d6d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
1d6e0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
1d6f0 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
1d700 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
1d710 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
1d720 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
1d730 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
1d740 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
1d750 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
1d760 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
1d770 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
1d780 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
1d790 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
1d7a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1d7b0 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
1d7c0 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1d7d0 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
1d7e0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
1d7f0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
1d800 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
1d810 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
1d820 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
1d830 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
1d840 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
1d850 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
1d860 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
1d870 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
1d880 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
1d890 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1d8a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1d8b0 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
1d8c0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
1d8d0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
1d8e0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
1d8f0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
1d900 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
1d910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d920 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
1d930 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
1d940 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
1d950 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
1d960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d970 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
1d980 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61  nction0, constMa
1d990 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9b0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1d9c0 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
1d9d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1d9e0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
1d9f0 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
1da00 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
1da10 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
1da20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1da30 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1da40 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
1da50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1da60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1da70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1da80 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1da90 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
1daa0 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
1dab0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  : {.      int nC
1dac0 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
1dad0 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
1dae0 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
1daf0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
1db00 43 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  CT );.      if( 
1db10 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
1db20 20 28 6e 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e   (nCol = pExpr->
1db30 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  x.pSelect->pELis
1db40 74 2d 3e 6e 45 78 70 72 29 21 3d 31 20 29 7b 0a  t->nExpr)!=1 ){.
1db50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1db60 75 62 73 65 6c 65 63 74 45 72 72 6f 72 28 70 50  ubselectError(pP
1db70 61 72 73 65 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  arse, nCol, 1);.
1db80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1db90 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
1dba0 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
1dbb0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1dbc0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
1dbd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dbe0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1dbf0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  N: {.      int d
1dc00 65 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c  estIfFalse = sql
1dc10 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1dc20 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  l(v);.      int 
1dc30 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1dc40 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1dc50 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
1dc60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dc70 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72   OP_Null, 0, tar
1dc80 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
1dc90 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
1dca0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
1dcb0 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
1dcc0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1dcd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dce0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1dcf0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1dd00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1dd10 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
1dd20 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73  fFalse);.      s
1dd30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dd40 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74  (v, OP_AddImm, t
1dd50 61 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  arget, 0);.     
1dd60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1dd70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
1dd80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1dd90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1dda0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ddb0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a  T_SUBQUERY */...
1ddc0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
1ddd0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
1dde0 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
1ddf0 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
1de00 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
1de10 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
1de20 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
1de30 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
1de40 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1de50 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
1de60 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1de70 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
1de80 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
1de90 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1dea0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
1deb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1dec0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1ded0 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
1dee0 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
1def0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 30  pr, target, 0, 0
1df00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1df10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1df20 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65  K_SPAN:.    case
1df30 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
1df40 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
1df50 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
1df60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1df70 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1df80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1df90 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
1dfa0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
1dfb0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1dfc0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1dfd0 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1dfe0 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1dff0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1e000 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1e010 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1e020 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1e030 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1e040 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1e050 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1e060 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1e070 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1e080 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1e090 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1e0a0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1e0b0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1e0c0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1e0d0 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1e0e0 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1e0f0 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1e100 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1e110 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1e120 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1e130 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1e140 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1e150 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
1e160 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
1e170 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
1e180 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
1e190 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
1e1a0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
1e1b0 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
1e1c0 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
1e1d0 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
1e1e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
1e1f0 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
1e200 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
1e210 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
1e220 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
1e230 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
1e240 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
1e250 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
1e260 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
1e270 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
1e280 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
1e290 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1e2a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
1e2b0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
1e2c0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
1e2d0 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
1e2e0 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
1e2f0 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
1e300 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
1e310 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
1e320 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
1e330 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
1e340 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
1e350 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
1e360 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
1e370 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
1e380 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
1e390 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
1e3a0 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
1e3b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1e3c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1e3d0 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
1e3e0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
1e3f0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1e400 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
1e410 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1e420 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
1e430 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
1e440 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
1e450 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
1e460 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
1e470 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
1e480 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
1e490 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
1e4a0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
1e4b0 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
1e4c0 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
1e4d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e4e0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
1e4f0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1e500 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
1e510 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
1e520 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
1e530 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
1e540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1e550 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
1e560 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
1e570 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
1e580 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
1e590 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
1e5a0 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
1e5b0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
1e5c0 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
1e5d0 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
1e5e0 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
1e5f0 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
1e600 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
1e610 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
1e620 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
1e630 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e640 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
1e650 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
1e660 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
1e670 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
1e680 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
1e690 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
1e6a0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
1e6b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
1e6c0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
1e6d0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
1e6e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
1e6f0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
1e700 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
1e710 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e720 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1e730 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
1e740 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
1e750 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
1e760 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
1e770 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
1e780 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
1e790 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
1e7a0 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
1e7b0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
1e7c0 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
1e7d0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1e7e0 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
1e7f0 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
1e800 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
1e810 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
1e820 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
1e830 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
1e840 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
1e850 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1e860 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
1e870 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
1e880 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
1e890 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
1e8a0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
1e8b0 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
1e8c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e8d0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
1e8e0 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
1e8f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1e900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e910 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
1e920 5f 56 45 43 54 4f 52 3a 20 7b 0a 20 20 20 20 20  _VECTOR: {.     
1e930 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1e940 28 70 50 61 72 73 65 2c 20 22 69 6e 76 61 6c 69  (pParse, "invali
1e950 64 20 75 73 65 20 6f 66 20 72 6f 77 20 76 61 6c  d use of row val
1e960 75 65 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ue");.      brea
1e970 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e980 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
1e990 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
1e9a0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
1e9b0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
1e9c0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
1e9d0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1e9e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1e9f0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
1ea00 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
1ea10 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
1ea20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
1ea30 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
1ea40 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1ea50 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
1ea60 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
1ea70 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
1ea80 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
1ea90 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
1eaa0 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
1eab0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
1eac0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
1ead0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
1eae0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
1eaf0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
1eb00 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
1eb10 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
1eb20 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1eb30 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
1eb40 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
1eb50 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
1eb60 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1eb70 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
1eb80 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
1eb90 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
1eba0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1ebb0 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
1ebc0 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
1ebd0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
1ebe0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
1ebf0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
1ec00 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
1ec10 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
1ec20 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
1ec30 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
1ec40 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
1ec50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1ec60 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
1ec70 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
1ec80 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
1ec90 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
1eca0 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
1ecb0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
1ecc0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
1ecd0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
1ece0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
1ecf0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
1ed00 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
1ed10 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
1ed20 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
1ed30 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
1ed60 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
1ed70 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
1ed80 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
1edb0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
1edc0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
1edd0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
1ee00 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1ee10 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1ee40 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
1ee50 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
1ee80 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1ee90 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1eea0 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
1eeb0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
1eec0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
1eed0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
1eee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eef0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
1ef00 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1ef10 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
1ef40 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1ef50 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
1ef60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1ef70 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
1ef80 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
1ef90 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
1efa0 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
1efb0 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
1efc0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1efd0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
1efe0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1eff0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1f000 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
1f010 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
1f020 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
1f030 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1f040 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
1f050 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
1f060 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1f070 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
1f080 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
1f090 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
1f0a0 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
1f0b0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
1f0c0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1f0d0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
1f0e0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
1f0f0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
1f100 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
1f110 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
1f120 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
1f130 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
1f140 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c  ster(&tempX, sql
1f150 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f160 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
1f170 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
1f180 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1f190 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1f1a0 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
1f1b0 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
1f1c0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
1f1d0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
1f1e0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
1f1f0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
1f200 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
1f210 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
1f220 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
1f230 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
1f240 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
1f250 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
1f260 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
1f270 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
1f280 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
1f290 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
1f2a0 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
1f2b0 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
1f2c0 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
1f2d0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
1f2e0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
1f2f0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
1f300 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
1f310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1f320 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
1f330 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
1f340 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f350 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f360 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
1f370 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1f380 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
1f390 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
1f3a0 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
1f3b0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
1f3c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f3d0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
1f3e0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
1f3f0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1f400 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
1f410 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1f420 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1f430 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1f440 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
1f450 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1f460 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f470 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
1f480 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
1f490 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1f4a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f4b0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
1f4c0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1f4d0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
1f4e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1f4f0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
1f500 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
1f510 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1f520 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1f530 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20   endLabel);.    
1f540 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1f550 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1f560 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f570 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f580 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20  (v, nextCase);. 
1f590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f5a0 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b   (nExpr&1)!=0 ){
1f5b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f5c0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1f5d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
1f5e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1f5f0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
1f600 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c  [nExpr-1].pExpr,
1f610 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1f620 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f630 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1f640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f660 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1f670 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
1f680 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1f690 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1f6a0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e  iled || pParse->
1f6b0 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20  nErr>0 .        
1f6c0 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43     || pParse->iC
1f6d0 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68  acheLevel==iCach
1f6e0 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20  eLevel );.      
1f6f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1f700 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61  veLabel(v, endLa
1f710 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  bel);.      brea
1f720 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1f730 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
1f740 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
1f750 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
1f760 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61  assert( pExpr->a
1f770 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c  ffinity==OE_Roll
1f780 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20  back .          
1f790 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
1f7a0 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20  ity==OE_Abort.  
1f7b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70           || pExp
1f7c0 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1f7d0 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Fail.           
1f7e0 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
1f7f0 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20  ty==OE_Ignore.  
1f800 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
1f810 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67   !pParse->pTrigg
1f820 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20  erTab ){.       
1f830 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1f840 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
1f870 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
1f880 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
1f890 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  am");.        re
1f8a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1f8b0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1f8c0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62  >affinity==OE_Ab
1f8d0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
1f8e0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
1f8f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
1f900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
1f910 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1f920 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1f930 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e) );.      if( 
1f940 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1f950 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20  =OE_Ignore ){.  
1f960 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f970 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
1f980 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c       v, OP_Halt,
1f990 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49   SQLITE_OK, OE_I
1f9a0 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d  gnore, 0, pExpr-
1f9b0 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20  >u.zToken,0);.  
1f9c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f9d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
1f9e0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1f9f0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
1fa00 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  t(pParse, SQLITE
1fa10 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
1fa20 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
1fa50 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  ty, pExpr->u.zTo
1fa60 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ken, 0, 0);.    
1fa70 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b    }..      break
1fa80 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1fa90 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1faa0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1fab0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
1fac0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1fad0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1fae0 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72  gFree2);.  retur
1faf0 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n inReg;.}../*.*
1fb00 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65  * Factor out the
1fb10 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76   code of the giv
1fb20 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
1fb30 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1fb40 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1fb50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
1fb60 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nit(.  Parse *pP
1fb70 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
1fb80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1fb90 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1fba0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
1fbb0 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65  sion to code whe
1fbc0 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69  n the VDBE initi
1fbd0 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20  alizes */.  int 
1fbe0 72 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a  regDest,      /*
1fbf0 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   Store the value
1fc00 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65   in this registe
1fc10 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62  r */.  u8 reusab
1fc20 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  le       /* True
1fc30 20 69 66 20 74 68 69 73 20 65 78 70 72 65 73 73   if this express
1fc40 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20  ion is reusable 
1fc50 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
1fc60 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43   *p;.  assert( C
1fc70 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61  onstFactorOk(pPa
1fc80 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50  rse) );.  p = pP
1fc90 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1fca0 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69  ;.  pExpr = sqli
1fcb0 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
1fcc0 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
1fcd0 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  ;.  p = sqlite3E
1fce0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1fcf0 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b  arse, p, pExpr);
1fd00 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fd10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1fd20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1fd30 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
1fd40 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  ;.     pItem->u.
1fd50 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20  iConstExprReg = 
1fd60 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49  regDest;.     pI
1fd70 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20  tem->reusable = 
1fd80 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  reusable;.  }.  
1fd90 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1fda0 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pr = p;.}../*.**
1fdb0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1fdc0 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78  o evaluate an ex
1fdd0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f  pression and sto
1fde0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
1fdf0 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65  * into a registe
1fe00 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  r.  Return the r
1fe10 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77  egister number w
1fe20 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  here the results
1fe30 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a  .** are stored..
1fe40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67  **.** If the reg
1fe50 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f  ister is a tempo
1fe60 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68  rary register th
1fe70 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f  at can be deallo
1fe80 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77  cated,.** then w
1fe90 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20  rite its number 
1fea0 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20  into *pReg.  If 
1feb0 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73  the result regis
1fec0 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20  ter is not.** a 
1fed0 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20  temporary, then 
1fee0 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72  set *pReg to zer
1fef0 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70  o..**.** If pExp
1ff00 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c  r is a constant,
1ff10 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1ff20 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74  ne might generat
1ff30 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74  e this.** code t
1ff40 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73  o fill the regis
1ff50 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69  ter in the initi
1ff60 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f  alization sectio
1ff70 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45  n of the.** VDBE
1ff80 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64   program, in ord
1ff90 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20  er to factor it 
1ffa0 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75  out of the evalu
1ffb0 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69  ation loop..*/.i
1ffc0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1ffd0 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50  deTemp(Parse *pP
1ffe0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1fff0 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20  r, int *pReg){. 
20000 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72   int r2;.  pExpr
20010 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
20020 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29  ipCollate(pExpr)
20030 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63  ;.  if( ConstFac
20040 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20  torOk(pParse).  
20050 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
20060 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26  K_REGISTER.   &&
20070 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
20080 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45  nstantNotJoin(pE
20090 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  xpr).  ){.    Ex
200a0 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72  prList *p = pPar
200b0 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
200c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a      int i;.    *
200d0 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69  pReg  = 0;.    i
200e0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74  f( p ){.      st
200f0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
20100 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
20110 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c   for(pItem=p->a,
20120 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30   i=p->nExpr; i>0
20130 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b  ; pItem++, i--){
20140 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
20150 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20  em->reusable && 
20160 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20170 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  re(pItem->pExpr,
20180 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a  pExpr,-1)==0 ){.
20190 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
201a0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
201b0 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20  ExprReg;.       
201c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
201d0 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72  .    r2 = ++pPar
201e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
201f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49  lite3ExprCodeAtI
20200 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  nit(pParse, pExp
20210 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  r, r2, 1);.  }el
20220 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d  se{.    int r1 =
20230 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
20240 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
20250 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
20260 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
20270 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20  e, pExpr, r1);. 
20280 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b     if( r2==r1 ){
20290 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72  .      *pReg = r
202a0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
202b0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
202c0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
202d0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52  , r1);.      *pR
202e0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
202f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d  }.  return r2;.}
20300 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
20310 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
20320 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
20330 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
20340 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
20350 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
20360 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
20370 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
20380 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
20390 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
203a0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
203b0 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73  te3ExprCode(Pars
203c0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
203d0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
203e0 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67  et){.  int inReg
203f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  ;..  assert( tar
20400 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
20410 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
20420 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20  .  if( pExpr && 
20430 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45  pExpr->op==TK_RE
20440 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71  GISTER ){.    sq
20450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20460 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
20470 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69  P_Copy, pExpr->i
20480 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a  Table, target);.
20490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52    }else{.    inR
204a0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
204b0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
204c0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
204d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
204e0 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
204f0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
20500 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
20510 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
20520 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
20530 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
20540 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20550 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
20560 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
20570 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
20580 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
20590 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f  e a transient co
205a0 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  py of expression
205b0 20 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20   pExpr and then 
205c0 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a  code it using.**
205d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
205e0 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ().  This routin
205f0 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  e works just lik
20600 65 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  e sqlite3ExprCod
20610 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68  e().** except th
20620 61 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70  at the input exp
20630 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61  ression is guara
20640 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68  nteed to be unch
20650 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  anged..*/.void s
20660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f  qlite3ExprCodeCo
20670 70 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  py(Parse *pParse
20680 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
20690 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71  nt target){.  sq
206a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
206b0 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20  se->db;.  pExpr 
206c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
206d0 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  (db, pExpr, 0);.
206e0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
206f0 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65  cFailed ) sqlite
20700 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
20710 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
20720 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
20730 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
20740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
20750 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
20760 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
20770 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
20780 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
20790 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
207a0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
207b0 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
207c0 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
207d0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
207e0 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65  arget.  If the e
207f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
20800 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
20810 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
20820 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65  t choose to code
20830 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20840 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  at initializatio
20850 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
20860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
20870 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20  actorable(Parse 
20880 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
20890 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
208a0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
208b0 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26  >okConstFactor &
208c0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
208d0 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
208e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
208f0 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
20900 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
20910 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
20920 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20930 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
20940 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
20950 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
20960 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
20970 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20  uates the given 
20980 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
20990 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  uts the result.*
209a0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
209b0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  rget..**.** Also
209c0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
209d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
209e0 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74  esults into anot
209f0 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69  her "cache" regi
20a00 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69  ster.** and modi
20a10 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  fy the expressio
20a20 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  n so that the ne
20a30 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76  xt time it is ev
20a40 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  aluated,.** the 
20a50 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79  result is a copy
20a60 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65   of the cache re
20a70 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  gister..**.** Th
20a80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
20a90 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ed for expressio
20aa0 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64  ns that are used
20ab0 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69   multiple .** ti
20ac0 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65  mes.  They are e
20ad0 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e  valuated once an
20ae0 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  d the results of
20af0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
20b00 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a  ** are reused..*
20b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
20b20 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
20b30 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
20b40 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
20b50 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a  arget){.  Vdbe *
20b60 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
20b70 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a  e;.  int iMem;..
20b80 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
20b90 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
20ba0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
20bb0 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69  GISTER );.  sqli
20bc0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20bd0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
20be0 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70  t);.  iMem = ++p
20bf0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
20c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20c10 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72  (v, OP_Copy, tar
20c20 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78  get, iMem);.  ex
20c30 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78  prToRegister(pEx
20c40 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a  pr, iMem);.}../*
20c50 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
20c60 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
20c70 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
20c80 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
20c90 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
20ca0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  ion list into a 
20cb0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
20cc0 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20  sters beginning 
20cd0 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a  at target..**.**
20ce0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
20cf0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65  er of elements e
20d00 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  valuated..**.** 
20d10 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
20d20 44 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74  DUP flag prevent
20d30 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
20d40 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69  from being.** fi
20d50 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43  lled using OP_SC
20d60 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75  opy.  OP_Copy mu
20d70 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
20d80 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ad..**.** The SQ
20d90 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
20da0 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73   argument allows
20db0 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
20dc0 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63  nts to be.** fac
20dd0 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69  tored out into i
20de0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f  nitialization co
20df0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  de..**.** The SQ
20e00 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c  LITE_ECEL_REF fl
20e10 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78  ag means that ex
20e20 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
20e30 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78   list with.** Ex
20e40 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69  prList.a[].u.x.i
20e50 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76  OrderByCol>0 hav
20e60 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65  e already been e
20e70 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f  valuated and sto
20e80 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74  red.** in regist
20e90 65 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61  ers at srcReg, a
20ea0 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20  nd so the value 
20eb0 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72  can be copied fr
20ec0 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74  om there..*/.int
20ed0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20ee0 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
20ef0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
20f00 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
20f10 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
20f20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
20f30 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
20f40 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
20f50 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
20f60 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
20f70 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
20f80 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20  /.  int srcReg, 
20f90 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
20fa0 20 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51   registers if SQ
20fb0 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f  LITE_ECEL_REF */
20fc0 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
20fd0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
20fe0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
20ff0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
21000 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
21010 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b  ;.  int i, j, n;
21020 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
21030 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
21040 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
21050 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
21060 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
21070 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
21080 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a  rt( pList!=0 );.
21090 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
210a0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
210b0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30  pParse->pVdbe!=0
210c0 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65   );  /* Never ge
210d0 74 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65  ts this far othe
210e0 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70  rwise */.  n = p
210f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
21100 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f  f( !ConstFactorO
21110 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67  k(pParse) ) flag
21120 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45  s &= ~SQLITE_ECE
21130 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28  L_FACTOR;.  for(
21140 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
21150 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70  i=0; i<n; i++, p
21160 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
21170 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d  r *pExpr = pItem
21180 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ->pExpr;.    if(
21190 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
211a0 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26  _ECEL_REF)!=0 &&
211b0 20 28 6a 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69   (j = pList->a[i
211c0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
211d0 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  l)>0 ){.      sq
211e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
211f0 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63  v, copyOp, j+src
21200 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29  Reg-1, target+i)
21210 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
21220 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
21230 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20  ECEL_FACTOR)!=0 
21240 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
21250 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
21260 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21270 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
21280 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
21290 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20  rget+i, 0);.    
212a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
212b0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
212c0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
212d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
212e0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69  rget+i);.      i
212f0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
21300 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  +i ){.        Vd
21310 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
21320 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f     if( copyOp==O
21330 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
21340 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56  && (pOp=sqlite3V
21350 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29  dbeGetOp(v, -1))
21360 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70  ->opcode==OP_Cop
21370 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  y.         && pO
21380 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p1+pOp->p3+1=
21390 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  =inReg.         
213a0 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e  && pOp->p2+pOp->
213b0 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20  p3+1==target+i. 
213c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
213d0 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20      pOp->p3++;. 
213e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
213f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21400 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70  dbeAddOp2(v, cop
21410 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  yOp, inReg, targ
21420 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  et+i);.        }
21430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21440 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
21450 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
21460 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57   code for a BETW
21470 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  EEN operator..**
21480 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e  .**    x BETWEEN
21490 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54   y AND z.**.** T
214a0 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69  he above is equi
214b0 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a  valent to .**.**
214c0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
214d0 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20  z.**.** Code it 
214e0 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20  as such, taking 
214f0 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63  care to do the c
21500 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73  ommon subexpress
21510 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69  ion.** eliminati
21520 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74  on of x..*/.stat
21530 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65  ic void exprCode
21540 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65  Between(.  Parse
21550 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
21560 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
21570 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
21580 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
21590 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  Expr,      /* Th
215a0 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73  e BETWEEN expres
215b0 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
215c0 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a  st,         /* J
215d0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
215e0 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f  jump is taken */
215f0 0a 20 20 76 6f 69 64 20 28 2a 78 4a 75 6d 70 49  .  void (*xJumpI
21600 66 29 28 50 61 72 73 65 2a 2c 45 78 70 72 2a 2c  f)(Parse*,Expr*,
21610 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 69 6e 74 20  int,int),.  int 
21620 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
21630 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   Take the jump i
21640 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73  f the BETWEEN is
21650 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78   NULL */.){.  Ex
21660 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20  pr exprAnd;     
21670 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61  /* The AND opera
21680 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44  tor in  x>=y AND
21690 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72   x<=z  */.  Expr
216a0 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a   compLeft;    /*
216b0 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d   The  x>=y  term
216c0 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52   */.  Expr compR
216d0 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20  ight;   /* The  
216e0 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x<=z  term */.  
216f0 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20 20  Expr exprX;     
21700 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62    /* The  x  sub
21710 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
21720 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
21730 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75  ; /* Temporary u
21740 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a  se register */..
21750 20 20 6d 65 6d 73 65 74 28 26 63 6f 6d 70 4c 65    memset(&compLe
21760 66 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  ft, 0, sizeof(Ex
21770 70 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr));.  memset(&
21780 63 6f 6d 70 52 69 67 68 74 2c 20 30 2c 20 73 69  compRight, 0, si
21790 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 6d  zeof(Expr));.  m
217a0 65 6d 73 65 74 28 26 65 78 70 72 41 6e 64 2c 20  emset(&exprAnd, 
217b0 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
217c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  ;..  assert( !Ex
217d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
217e0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
217f0 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20  t) );.  exprX = 
21800 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20  *pExpr->pLeft;. 
21810 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b   exprAnd.op = TK
21820 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e  _AND;.  exprAnd.
21830 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66  pLeft = &compLef
21840 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69  t;.  exprAnd.pRi
21850 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74  ght = &compRight
21860 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20  ;.  compLeft.op 
21870 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c  = TK_GE;.  compL
21880 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70  eft.pLeft = &exp
21890 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  rX;.  compLeft.p
218a0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
218b0 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
218c0 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  pr;.  compRight.
218d0 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f  op = TK_LE;.  co
218e0 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20  mpRight.pLeft = 
218f0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69  &exprX;.  compRi
21900 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  ght.pRight = pEx
21910 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31  pr->x.pList->a[1
21920 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 73  ].pExpr;.  if( s
21930 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
21940 6f 72 28 26 65 78 70 72 58 29 3d 3d 30 20 29 7b  or(&exprX)==0 ){
21950 0a 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73  .    exprToRegis
21960 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69  ter(&exprX, sqli
21970 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
21980 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
21990 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 7d  &regFree1));.  }
219a0 0a 20 20 69 66 28 20 78 4a 75 6d 70 49 66 20 29  .  if( xJumpIf )
219b0 7b 0a 20 20 20 20 78 4a 75 6d 70 49 66 28 70 50  {.    xJumpIf(pP
219c0 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20  arse, &exprAnd, 
219d0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
219e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
219f0 65 78 70 72 58 2e 66 6c 61 67 73 20 7c 3d 20 45  exprX.flags |= E
21a00 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20  P_FromJoin;.    
21a10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
21a20 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 26 65  arget(pParse, &e
21a30 78 70 72 41 6e 64 2c 20 64 65 73 74 29 3b 0a 20  xprAnd, dest);. 
21a40 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
21a50 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
21a60 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
21a70 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
21a80 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
21a90 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
21aa0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
21ab0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
21ac0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
21ad0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
21ae0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
21af0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
21b00 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
21b10 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
21b20 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
21b30 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
21b40 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
21b50 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
21b60 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
21b70 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
21b80 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
21b90 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
21ba0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
21bb0 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
21bc0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
21bd0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
21be0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
21bf0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
21c00 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
21c10 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
21c20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
21c30 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
21c40 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
21c50 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
21c60 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
21c70 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a  gFree1!=0 );.}..
21c80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
21c90 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
21ca0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
21cb0 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
21cc0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
21cd0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
21ce0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
21cf0 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
21d00 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
21d10 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
21d20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
21d30 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
21d40 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
21d50 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
21d60 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
21d70 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
21d80 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
21d90 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
21da0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
21db0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
21dc0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
21dd0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
21de0 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
21df0 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
21e00 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
21e10 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
21e20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
21e30 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
21e40 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
21e50 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
21e60 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
21e70 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
21e80 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
21e90 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
21ea0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
21eb0 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
21ec0 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
21ed0 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
21ee0 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
21ef0 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
21f00 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
21f10 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
21f20 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
21f30 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
21f40 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
21f50 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
21f60 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
21f70 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
21f80 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
21f90 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
21fa0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
21fb0 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
21fc0 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
21fd0 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
21fe0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
21ff0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
22000 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
22010 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
22020 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
22030 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
22040 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
22050 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
22060 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
22070 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
22080 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
22090 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
220a0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
220b0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
220c0 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
220d0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
220e0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
220f0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
22100 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
22110 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
22120 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
22130 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
22140 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
22150 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
22160 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
22170 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
22180 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
22190 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
221a0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
221b0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
221c0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
221d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
221e0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
221f0 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
22200 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
22210 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
22220 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22230 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
22240 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
22250 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
22260 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22270 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
22280 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
22290 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
222a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
222b0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
222c0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
222d0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
222e0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
222f0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
22300 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
22310 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
22320 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
22330 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22340 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
22350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
22360 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
22370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22380 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
22390 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
223a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
223b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
223c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
223d0 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
223e0 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65  _ISNOT:.      te
223f0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
22400 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
22410 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  ase( op==TK_ISNO
22420 54 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  T );.      op = 
22430 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  (op==TK_IS) ? TK
22440 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20  _EQ : TK_NE;.   
22450 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
22460 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
22470 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
22480 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
22490 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
224a0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
224b0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
224c0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
224d0 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
224e0 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _EQ: {.      if(
224f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
22500 63 74 6f 72 28 70 45 78 70 72 2d 3e 70 4c 65 66  ctor(pExpr->pLef
22510 74 29 20 29 20 67 6f 74 6f 20 64 65 66 61 75 6c  t) ) goto defaul
22520 74 5f 65 78 70 72 3b 0a 20 20 20 20 20 20 74 65  t_expr;.      te
22530 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
22540 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ll==0 );.      r
22550 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
22560 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
22570 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
22580 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
22590 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
225a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
225b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
225c0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
225d0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
225e0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
225f0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
22600 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
22610 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
22620 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
22630 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
22640 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20  (TK_LT==OP_Lt); 
22650 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
22660 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Lt); VdbeCoverag
22670 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29  eIf(v,op==OP_Lt)
22680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
22690 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65  K_LE==OP_Le); te
226a0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65  stcase(op==OP_Le
226b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
226c0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a  f(v,op==OP_Le);.
226d0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
226e0 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74  GT==OP_Gt); test
226f0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b  case(op==OP_Gt);
22700 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
22710 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20  v,op==OP_Gt);.  
22720 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45      assert(TK_GE
22730 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61  ==OP_Ge); testca
22740 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56  se(op==OP_Ge); V
22750 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
22760 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20  op==OP_Ge);.    
22770 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d    assert(TK_EQ==
22780 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65  OP_Eq); testcase
22790 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20  (op==OP_Eq);.   
227a0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
227b0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
227c0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
227d0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
227e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
227f0 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20  If(v, op==OP_Eq 
22800 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53  && jumpIfNull!=S
22810 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
22820 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
22830 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
22840 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  ase(op==OP_Ne);.
22850 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
22860 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
22870 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
22880 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
22890 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
228a0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f  ageIf(v, op==OP_
228b0 4e 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  Ne && jumpIfNull
228c0 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  !=SQLITE_NULLEQ)
228d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
228e0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
228f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22900 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
22910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22920 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
22930 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
22940 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
22950 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
22960 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
22970 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
22980 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
22990 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
229a0 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
229b0 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
229c0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
229d0 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
229e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
229f0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
22a00 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
22a10 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
22a20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
22a30 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
22a40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
22a50 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
22a60 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
22a70 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
22a80 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
22a90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22aa0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
22ab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22ac0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
22ad0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
22ae0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
22af0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
22b00 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
22b10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
22b20 64 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70  dest, sqlite3Exp
22b30 72 49 66 54 72 75 65 2c 20 6a 75 6d 70 49 66 4e  rIfTrue, jumpIfN
22b40 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
22b50 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
22b60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
22b70 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
22b80 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
22b90 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
22ba0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
22bb0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
22bc0 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
22bd0 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
22be0 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
22bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
22c00 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
22c10 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
22c20 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
22c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22c40 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
22c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22c60 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
22c70 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
22c80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22c90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
22ca0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 64 65  efault: {.    de
22cb0 66 61 75 6c 74 5f 65 78 70 72 3a 0a 20 20 20 20  fault_expr:.    
22cc0 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73    if( exprAlways
22cd0 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20  True(pExpr) ){. 
22ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22cf0 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b  beGoto(v, dest);
22d00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
22d10 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
22d20 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
22d30 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
22d40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22d50 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
22d60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
22d70 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
22d80 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
22d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22da0 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
22db0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
22dc0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
22dd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
22de0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
22df0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
22e00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
22e10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
22e20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22e30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22e40 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
22e50 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
22e60 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
22e70 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
22e80 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
22e90 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
22ea0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
22eb0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
22ec0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
22ed0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
22ee0 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
22ef0 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
22f00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
22f10 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
22f20 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
22f30 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
22f40 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22f50 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
22f60 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
22f70 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
22f80 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
22f90 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
22fa0 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
22fb0 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
22fc0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
22fd0 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
22fe0 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
22ff0 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
23000 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
23010 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
23020 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
23030 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
23040 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
23050 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
23060 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
23070 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
23080 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
23090 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
230a0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
230b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
230c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
230d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
230e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
230f0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
23100 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
23110 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
23120 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
23130 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
23140 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
23150 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
23160 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
23170 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
23180 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
23190 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
231a0 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
231b0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
231c0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
231d0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
231e0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
231f0 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
23200 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
23210 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
23220 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
23230 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
23240 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
23250 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
23260 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
23270 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
23280 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
23290 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
232a0 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
232b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
232c0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
232d0 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
232e0 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
232f0 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
23300 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
23310 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
23320 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
23330 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
23340 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
23350 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
23360 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
23370 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
23380 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
23390 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
233a0 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
233b0 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
233c0 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
233d0 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
233e0 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
233f0 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
23400 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
23410 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
23420 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
23430 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
23440 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
23450 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
23460 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
23470 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
23480 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
23490 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
234a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
234b0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
234c0 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
234d0 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
234e0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
234f0 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
23500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
23510 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
23520 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
23530 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
23540 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
23550 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
23560 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
23570 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
23580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
23590 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
235a0 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
235b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
235c0 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
235d0 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
235e0 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
235f0 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
23600 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
23610 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
23620 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
23630 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
23640 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
23650 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
23660 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
23670 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
23680 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
23690 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
236a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
236b0 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
236c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
236d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
236e0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
236f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
23710 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
23720 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
23730 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
23740 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
23750 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
23760 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23770 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
23780 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
23790 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
237a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
237b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
237c0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
237d0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
237e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
237f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
23800 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
23810 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
23820 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
23830 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
23840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
23850 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
23860 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
23870 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
23880 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
23890 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
238a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
238b0 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
238c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
238d0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
238e0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
238f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23900 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
23910 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
23920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23930 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
23940 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
23950 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
23960 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
23970 6f 70 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d  op = (pExpr->op=
23980 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20  =TK_IS) ? TK_NE 
23990 3a 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 6a  : TK_EQ;.      j
239a0 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c 49  umpIfNull = SQLI
239b0 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20 20  TE_NULLEQ;.     
239c0 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
239d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
239e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
239f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
23a00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
23a10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
23a20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
23a30 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
23a40 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
23a50 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29  (pExpr->pLeft) )
23a60 20 67 6f 74 6f 20 64 65 66 61 75 6c 74 5f 65 78   goto default_ex
23a70 70 72 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  pr;.      testca
23a80 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
23a90 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
23aa0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
23ab0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
23ac0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
23ad0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
23ae0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23af0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
23b00 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
23b10 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
23b20 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
23b30 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
23b40 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
23b50 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
23b60 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
23b70 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
23b80 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
23b90 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
23ba0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
23bb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
23bc0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
23bd0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
23be0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
23bf0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
23c00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
23c10 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
23c20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
23c30 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
23c40 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
23c50 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
23c60 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
23c70 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
23c80 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
23c90 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
23ca0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
23cb0 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
23cc0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
23cd0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
23ce0 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
23cf0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
23d00 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
23d10 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45  mpIfNull!=SQLITE
23d20 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
23d30 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
23d40 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
23d50 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
23d60 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
23d70 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
23d80 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
23d90 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
23da0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
23db0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
23dc0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
23dd0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
23de0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
23df0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
23e00 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
23e10 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
23e20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
23e30 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
23e40 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
23e50 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
23e60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
23e70 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
23e80 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
23e90 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
23ea0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
23eb0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
23ec0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
23ed0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
23ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23ef0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
23f00 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
23f10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
23f20 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f 76 65  LL );   VdbeCove
23f30 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
23f40 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
23f50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
23f60 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56 64 62  _NOTNULL );  Vdb
23f70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
23f80 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  p==TK_NOTNULL);.
23f90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23fa0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
23fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23fc0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
23fd0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TWEEN: {.      t
23fe0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
23ff0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
24000 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
24010 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
24020 65 73 74 2c 20 73 71 6c 69 74 65 33 45 78 70 72  est, sqlite3Expr
24030 49 66 46 61 6c 73 65 2c 20 6a 75 6d 70 49 66 4e  IfFalse, jumpIfN
24040 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
24050 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
24060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
24070 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
24080 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
24090 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b 0a  ( jumpIfNull ){.
240a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
240b0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
240c0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
240d0 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  est);.      }els
240e0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  e{.        int d
240f0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
24100 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
24110 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
24120 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
24130 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
24140 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  st, destIfNull);
24150 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24160 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
24170 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  (v, destIfNull);
24180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
24190 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
241a0 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
241b0 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 5f 65 78  {.    default_ex
241c0 70 72 3a 20 0a 20 20 20 20 20 20 69 66 28 20 65  pr: .      if( e
241d0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
241e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
241f0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
24200 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
24210 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
24220 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
24230 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
24240 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
24250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
24260 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
24270 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
24280 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
24290 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
242a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
242b0 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
242c0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
242d0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
242e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
242f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
24300 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
24310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
24320 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
24330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
24340 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
24350 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24360 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
24370 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
24380 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24390 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
243a0 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
243b0 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
243c0 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
243d0 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
243e0 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
243f0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
24400 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
24410 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
24420 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
24430 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
24440 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
24450 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
24460 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
24470 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
24480 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
24490 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
244a0 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
244b0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
244c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
244d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
244e0 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
244f0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
24500 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
24510 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24520 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
24530 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
24540 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
24550 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
24560 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
24570 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
24580 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f  y);.}.../*.** Do
24590 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
245a0 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
245b0 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
245c0 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
245d0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
245e0 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
245f0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
24600 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
24610 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
24620 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
24630 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
24640 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
24650 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
24660 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
24670 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
24680 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
24690 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
246a0 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
246b0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
246c0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
246d0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
246e0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
246f0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
24700 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
24710 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
24720 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
24730 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
24740 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
24750 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
24760 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
24770 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
24780 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
24790 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
247a0 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
247b0 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
247c0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
247d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
247e0 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
247f0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
24800 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
24810 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
24820 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
24830 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
24840 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
24850 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
24860 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
24870 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
24880 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
24890 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
248a0 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
248b0 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
248c0 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
248d0 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
248e0 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
248f0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
24900 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
24910 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
24920 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
24930 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
24940 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
24950 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
24960 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
24970 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
24980 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
24990 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
249a0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
249b0 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
249c0 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
249d0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
249e0 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
249f0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
24a00 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
24a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
24a20 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
24a30 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
24a40 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
24a50 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
24a60 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
24a70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
24a80 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
24a90 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
24aa0 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
24ab0 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
24ac0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
24ad0 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
24ae0 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
24af0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
24b00 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
24b10 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
24b20 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
24b30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
24b40 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
24b50 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
24b60 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
24b70 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
24b80 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
24b90 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
24ba0 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69  pA->pLeft, pB, i
24bb0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
24bc0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
24bd0 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
24be0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
24bf0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
24c00 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  (pA, pB->pLeft, 
24c10 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
24c20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
24c30 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
24c40 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
24c50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
24c60 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
24c70 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
24c80 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
24c90 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
24ca0 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
24cb0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
24cc0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
24cd0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
24ce0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
24cf0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
24d00 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
24d10 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
24d20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
24d30 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
24d40 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
24d50 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
24d60 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
24d70 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
24d80 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
24d90 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
24da0 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
24db0 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
24dc0 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
24dd0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
24de0 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
24df0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
24e00 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
24e10 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
24e20 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
24e30 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
24e40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
24e50 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
24e60 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
24e70 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
24e80 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
24e90 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
24ea0 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
24eb0 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
24ec0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
24ed0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
24ee0 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
24ef0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
24f00 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  && pA->op!=TK_ST
24f10 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66  RING ){.      if
24f20 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
24f30 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
24f40 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
24f50 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
24f60 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
24f70 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
24f80 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
24f90 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
24fa0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
24fb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
24fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
24fd0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
24fe0 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
24ff0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
25000 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
25010 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
25020 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
25030 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
25040 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
25050 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
25060 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
25070 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
25080 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
25090 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
250a0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
250b0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
250c0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
250d0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
250e0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
250f0 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
25100 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
25110 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
25120 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
25130 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
25140 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
25150 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
25160 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
25170 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
25180 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
25190 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
251a0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
251b0 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
251c0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
251d0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
251e0 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
251f0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
25200 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
25210 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
25220 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
25230 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
25240 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
25250 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
25260 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
25270 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
25280 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
25290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
252a0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
252b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
252c0 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
252d0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
252e0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
252f0 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
25300 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
25310 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
25320 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
25330 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
25340 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
25350 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
25360 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
25370 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
25380 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
25390 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
253a0 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
253b0 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
253c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
253d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
253e0 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
253f0 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
25400 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
25410 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
25420 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
25430 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
25440 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
25450 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
25460 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
25470 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
25480 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
25490 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
254a0 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
254b0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
254c0 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
254d0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
254e0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
254f0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
25500 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
25510 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
25520 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
25530 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
25540 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
25550 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
25560 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
25570 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
25580 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
25590 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
255a0 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
255b0 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
255c0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
255d0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
255e0 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
255f0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
25600 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
25610 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
25620 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
25630 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
25640 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
25650 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
25660 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
25670 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
25680 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
25690 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
256a0 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
256b0 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
256c0 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
256d0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
256e0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
256f0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
25700 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
25710 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
25720 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
25730 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
25740 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
25750 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
25760 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
25770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
25780 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
25790 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
257a0 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
257b0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
257c0 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
257d0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
257e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
257f0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
25800 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
25810 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
25820 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
25830 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
25840 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
25850 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
25860 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
25870 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
25880 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
25890 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
258a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
258b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
258c0 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
258d0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
258e0 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
258f0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
25900 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
25910 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
25920 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
25930 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
25940 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
25950 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
25960 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
25970 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
25980 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
25990 69 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  if an expression
259a0 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65   can be evaluate
259b0 64 20 62 79 20 72 65 66 65 72 65 6e 63 65 20 74  d by reference t
259c0 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  o the.** index o
259d0 6e 6c 79 2c 20 77 69 74 68 6f 75 74 20 68 61 76  nly, without hav
259e0 69 6e 67 20 74 6f 20 64 6f 20 61 20 73 65 61 72  ing to do a sear
259f0 63 68 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ch for the corre
25a00 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 61 62 6c  sponding.** tabl
25a10 65 20 65 6e 74 72 79 2e 20 20 54 68 65 20 49 64  e entry.  The Id
25a20 78 43 6f 76 65 72 2e 70 49 64 78 20 66 69 65 6c  xCover.pIdx fiel
25a30 64 20 69 73 20 74 68 65 20 69 6e 64 65 78 2e 20  d is the index. 
25a40 20 49 64 78 43 6f 76 65 72 2e 69 43 75 72 0a 2a   IdxCover.iCur.*
25a50 2a 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20  * is the cursor 
25a60 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  for the table..*
25a70 2f 0a 73 74 72 75 63 74 20 49 64 78 43 6f 76 65  /.struct IdxCove
25a80 72 20 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  r {.  Index *pId
25a90 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  x;     /* The in
25aa0 64 65 78 20 74 6f 20 62 65 20 74 65 73 74 65 64  dex to be tested
25ab0 20 66 6f 72 20 63 6f 76 65 72 61 67 65 20 2a 2f   for coverage */
25ac0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
25ad0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
25ae0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
25af0 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  le corresponding
25b00 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   to the index */
25b10 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .};../*.** Check
25b20 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
25b30 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 73 20   are references 
25b40 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  to columns in ta
25b50 62 6c 65 20 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d  ble .** pWalker-
25b60 3e 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 69 43  >u.pIdxCover->iC
25b70 75 72 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  ur can be satisf
25b80 69 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ied using the in
25b90 64 65 78 0a 2a 2a 20 70 57 61 6c 6b 65 72 2d 3e  dex.** pWalker->
25ba0 75 2e 70 49 64 78 43 6f 76 65 72 2d 3e 70 49 64  u.pIdxCover->pId
25bb0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
25bc0 20 65 78 70 72 49 64 78 43 6f 76 65 72 28 57 61   exprIdxCover(Wa
25bd0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
25be0 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
25bf0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
25c00 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
25c10 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
25c20 6c 6b 65 72 2d 3e 75 2e 70 49 64 78 43 6f 76 65  lker->u.pIdxCove
25c30 72 2d 3e 69 43 75 72 0a 20 20 20 26 26 20 73 71  r->iCur.   && sq
25c40 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
25c50 65 78 28 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 49  ex(pWalker->u.pI
25c60 64 78 43 6f 76 65 72 2d 3e 70 49 64 78 2c 20 70  dxCover->pIdx, p
25c70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3c 30  Expr->iColumn)<0
25c80 0a 20 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  .  ){.    pWalke
25c90 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20  r->eCode = 1;.  
25ca0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
25cb0 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
25cc0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
25cd0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
25ce0 65 20 69 66 20 61 6e 20 69 6e 64 65 78 20 70 49  e if an index pI
25cf0 64 78 20 6f 6e 20 74 61 62 6c 65 20 77 69 74 68  dx on table with
25d00 20 63 75 72 73 6f 72 20 69 43 75 72 20 63 6f 6e   cursor iCur con
25d10 74 61 69 6e 73 20 77 69 6c 6c 0a 2a 2a 20 74 68  tains will.** th
25d20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
25d30 70 72 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  pr.  Return true
25d40 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 64 6f   if the index do
25d50 65 73 20 63 6f 76 65 72 20 74 68 65 0a 2a 2a 20  es cover the.** 
25d60 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 66  expression and f
25d70 61 6c 73 65 20 69 66 20 74 68 65 20 70 45 78 70  alse if the pExp
25d80 72 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 66  r expression ref
25d90 65 72 65 6e 63 65 73 20 74 61 62 6c 65 20 63 6f  erences table co
25da0 6c 75 6d 6e 73 0a 2a 2a 20 74 68 61 74 20 61 72  lumns.** that ar
25db0 65 20 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 74  e not found in t
25dc0 68 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  he index pIdx..*
25dd0 2a 0a 2a 2a 20 41 6e 20 69 6e 64 65 78 20 63 6f  *.** An index co
25de0 76 65 72 69 6e 67 20 61 6e 20 65 78 70 72 65 73  vering an expres
25df0 73 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  sion means that 
25e00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63  the expression c
25e10 61 6e 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  an be.** evaluat
25e20 65 64 20 75 73 69 6e 67 20 6f 6e 6c 79 20 74 68  ed using only th
25e30 65 20 69 6e 64 65 78 20 61 6e 64 20 77 69 74 68  e index and with
25e40 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 6c 6f  out having to lo
25e50 6f 6b 75 70 20 74 68 65 0a 2a 2a 20 63 6f 72 72  okup the.** corr
25e60 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
25e70 65 6e 74 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  entry..*/.int sq
25e80 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65 64  lite3ExprCovered
25e90 42 79 49 6e 64 65 78 28 0a 20 20 45 78 70 72 20  ByIndex(.  Expr 
25ea0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
25eb0 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
25ec0 65 20 74 65 73 74 65 64 20 2a 2f 0a 20 20 69 6e  e tested */.  in
25ed0 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
25ee0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
25ef0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 63  number for the c
25f00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
25f10 6c 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  le */.  Index *p
25f20 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Idx         /* T
25f30 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 6d 69  he index that mi
25f40 67 68 74 20 62 65 20 75 73 65 64 20 66 6f 72 20  ght be used for 
25f50 63 6f 76 65 72 61 67 65 20 2a 2f 0a 29 7b 0a 20  coverage */.){. 
25f60 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72   Walker w;.  str
25f70 75 63 74 20 49 64 78 43 6f 76 65 72 20 78 63 6f  uct IdxCover xco
25f80 76 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  v;.  memset(&w, 
25f90 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
25fa0 20 78 63 6f 76 2e 69 43 75 72 20 3d 20 69 43 75   xcov.iCur = iCu
25fb0 72 3b 0a 20 20 78 63 6f 76 2e 70 49 64 78 20 3d  r;.  xcov.pIdx =
25fc0 20 70 49 64 78 3b 0a 20 20 77 2e 78 45 78 70 72   pIdx;.  w.xExpr
25fd0 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 49  Callback = exprI
25fe0 64 78 43 6f 76 65 72 3b 0a 20 20 77 2e 75 2e 70  dxCover;.  w.u.p
25ff0 49 64 78 43 6f 76 65 72 20 3d 20 26 78 63 6f 76  IdxCover = &xcov
26000 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
26010 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
26020 20 20 72 65 74 75 72 6e 20 21 77 2e 65 43 6f 64    return !w.eCod
26030 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  e;.}.../*.** An 
26040 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
26050 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
26060 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
26070 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
26080 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
26090 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
260a0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
260b0 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
260c0 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
260d0 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
260e0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
260f0 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
26100 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
26110 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
26120 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
26130 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
26140 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
26150 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
26160 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
26170 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
26180 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26190 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
261a0 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
261b0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
261c0 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
261d0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
261e0 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
261f0 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
26200 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
26210 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
26220 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
26230 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
26240 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
26250 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
26260 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
26270 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
26280 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
26290 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
262a0 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
262b0 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
262c0 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
262d0 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
262e0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
262f0 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
26300 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
26310 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
26320 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
26330 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
26340 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
26350 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
26360 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
26370 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
26380 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
26390 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
263a0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
263b0 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
263c0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
263d0 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
263e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
263f0 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
26400 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
26410 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
26420 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
26430 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
26440 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
26450 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
26460 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
26470 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
26480 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
26490 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
264a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
264b0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
264c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
264d0 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
264e0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
264f0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
26500 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
26510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
26520 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
26530 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
26540 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
26550 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
26560 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
26570 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
26580 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
26590 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
265a0 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
265b0 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
265c0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
265d0 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
265e0 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
265f0 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
26600 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
26610 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
26620 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
26630 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
26640 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
26650 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
26660 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
26670 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
26680 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
26690 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
266a0 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
266b0 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
266c0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
266d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
266e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
266f0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
26700 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
26710 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a  = exprSrcCount;.
26720 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
26730 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
26740 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
26750 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
26760 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
26770 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
26780 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
26790 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
267a0 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
267b0 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
267c0 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
267d0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
267e0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
267f0 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
26800 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
26810 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
26820 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
26830 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
26840 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
26850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26860 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
26870 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
26880 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
26890 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
268a0 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
268b0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
268c0 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
268d0 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
268e0 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
268f0 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
26900 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
26910 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
26920 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
26930 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
26940 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
26950 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
26960 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
26970 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
26980 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
26990 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
269a0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
269b0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
269c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
269d0 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
269e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
269f0 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
26a00 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
26a10 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
26a20 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
26a30 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
26a40 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
26a50 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
26a60 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
26a70 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
26a80 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
26a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
26aa0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
26ab0 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
26ac0 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
26ad0 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
26ae0 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
26af0 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
26b00 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
26b10 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
26b20 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
26b30 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
26b40 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
26b50 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
26b60 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
26b70 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
26b80 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
26b90 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
26ba0 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
26bb0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
26bc0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
26bd0 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
26be0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
26bf0 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
26c00 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
26c10 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
26c20 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
26c30 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
26c40 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
26c50 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
26c60 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
26c70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26c80 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
26c90 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
26ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
26cb0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
26cc0 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
26cd0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
26ce0 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
26cf0 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
26d00 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
26d10 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
26d20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
26d30 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
26d40 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
26d50 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
26d60 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26d70 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
26d80 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
26d90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
26da0 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
26db0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
26dc0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
26dd0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
26de0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26df0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
26e00 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
26e10 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
26e20 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
26e30 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
26e40 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
26e50 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
26e60 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
26e70 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
26e80 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
26e90 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
26ea0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
26eb0 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
26ec0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
26ed0 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
26ee0 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
26ef0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
26f00 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
26f10 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
26f20 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
26f30 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
26f40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
26f50 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
26f60 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
26f70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26f80 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
26f90 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
26fa0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
26fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
26fc0 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
26fd0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
26fe0 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
26ff0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
27000 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
27010 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
27020 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
27030 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
27040 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
27060 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
27070 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27080 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
27090 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
270a0 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
270b0 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
270c0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
270d0 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
270e0 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
270f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27100 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
27110 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
27120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27130 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
27140 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
27150 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
27160 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
27170 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
27180 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
27190 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
271a0 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
271b0 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
271c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
271e0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
271f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
27200 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
27210 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
27220 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
27230 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
27240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27250 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
27260 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
27270 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
27280 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272a0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
272b0 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
272c0 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
272d0 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
272e0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
272f0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
27300 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
27310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27320 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
27330 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
27360 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
27370 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
27380 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
27390 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
273a0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
273b0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
273d0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
273e0 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
273f0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
27400 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
27410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27440 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
27450 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
27460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27470 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
27480 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
27490 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
274a0 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
274b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
274c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
274d0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
274e0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
274f0 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
27500 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
27510 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
27520 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
27530 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
27540 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
27550 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
27560 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
27570 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
27580 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
27590 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
275a0 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
275b0 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
275c0 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
275d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
275e0 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
275f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
27600 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
27610 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
27620 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
27630 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
27640 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
27650 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
27660 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
27670 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
27680 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27690 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
276a0 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
276b0 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
276c0 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
276d0 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
276e0 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
276f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
27700 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
27710 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
27720 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
27730 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
27740 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
27750 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
27760 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
27770 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
27780 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
27790 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
277a0 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
277b0 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
277c0 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
277d0 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
277e0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
277f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
27800 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
27810 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
27820 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
27830 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
27840 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
27850 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
27860 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
27870 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
27880 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
27890 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
278a0 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
278b0 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
278c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
278d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
278e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
278f0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
27900 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
27910 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
27920 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
27930 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
27940 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
27950 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
27960 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
27970 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
27980 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
27990 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
279a0 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
279b0 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
279c0 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
279d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
279e0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
279f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
27a00 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
27a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
27a20 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
27a30 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
27a40 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
27a50 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
27a60 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
27a70 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
27a80 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
27a90 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
27aa0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
27ab0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
27ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
27ad0 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
27ae0 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
27af0 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
27b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b10 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
27b20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
27b30 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
27b40 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
27b50 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
27b60 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
27b70 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
27b80 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
27b90 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
27ba0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
27bb0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
27bc0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
27bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27be0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
27bf0 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
27c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
27c30 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
27c40 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
27c50 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
27c60 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
27c70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
27c80 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
27c90 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
27ca0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
27cb0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
27cc0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
27cd0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
27ce0 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
27cf0 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
27d00 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
27d10 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
27d20 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
27d30 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
27d40 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
27d50 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
27d60 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
27d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
27d90 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
27da0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
27db0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
27dc0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
27dd0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
27de0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
27df0 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
27e00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27e10 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
27e20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
27e30 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
27e40 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
27e50 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
27e60 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
27e70 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
27e80 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
27e90 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
27ea0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
27eb0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
27ec0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
27ed0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
27ee0 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
27ef0 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
27f00 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
27f10 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
27f20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27f30 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
27f40 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
27f50 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
27f60 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
27f70 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
27f80 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
27f90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
27fa0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
27fb0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
27fc0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
27fd0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
27fe0 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
27ff0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
28000 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
28010 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
28020 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
28030 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
28040 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
28050 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
28060 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
28070 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
28080 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
28090 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
280a0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
280b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
280c0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
280d0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
280e0 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
280f0 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
28100 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
28110 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
28120 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
28130 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
28140 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
28150 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
28160 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
28170 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
28180 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
28190 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
281a0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
281b0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
281c0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
281d0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
281e0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
281f0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
28200 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
28210 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
28220 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
28230 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
28240 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
28250 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
28260 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
28270 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
28280 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
28290 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
282a0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
282b0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
282c0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
282d0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
282e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
282f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
28300 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
28310 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
28320 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
28330 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
28340 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
28350 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
28360 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
28370 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
28380 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
28390 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
283a0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
283b0 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
283c0 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
283d0 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
283e0 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
283f0 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
28400 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
28410 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
28420 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
28430 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28440 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
28450 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
28460 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
28470 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
28480 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
28490 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
284a0 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
284b0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
284c0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
284d0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
284e0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
284f0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
28500 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
28510 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
28520 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
28530 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
28540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
28550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28560 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
28570 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
28580 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
28590 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
285a0 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
285b0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
285c0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
285d0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
285e0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
285f0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
28600 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
28610 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
28620 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
28630 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
28640 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
28650 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
28660 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
28670 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
28680 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
28690 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
286a0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
286b0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
286c0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
286d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
286e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
286f0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
28700 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
28710 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
28720 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
28730 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
28740 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
28750 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
28760 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
28770 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
28780 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
28790 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
287a0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
287b0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
287c0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
287d0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
287e0 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
287f0 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
28800 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
28810 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
28820 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
28830 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28840 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
28850 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
28860 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
28870 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
28880 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
28890 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
288a0 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
288b0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
288c0 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
288d0 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
288e0 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
288f0 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
28900 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
28910 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
28920 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
28930 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
28940 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
28950 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
28960 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
28970 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
28980 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
28990 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
289a0 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
289b0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
289c0 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
289d0 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74  >nRangeReg<iLast
289e0 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
289f0 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74  RangeReg>=iFirst
28a00 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
28a10 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
28a20 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
28a30 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
28a40 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
28a50 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
28a60 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
28a70 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
28a80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28a90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
28aa0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
28ab0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
28ac0 47 20 2a 2f 0a                                   G */.