/ Hex Artifact Content
Login

Artifact 5abe19af1c41dd8b334318611c6614cc21155b88:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20 54 4b  TK_COLLATE or TK
0be0: 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  _AS operators an
0bf0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0c00: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c10: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c20: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c30: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c40: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c50: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c60: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c70: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c90: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0cb0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cc0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cd0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0ce0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0cf0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0d00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d10: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d20: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d40: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d50: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d70: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0da0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
0dc0: 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  S );.      pExpr
0dd0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0de0: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0df0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0e00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0e10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0e20: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0e30: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0e40: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0e50: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0e60: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0e70: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0e80: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0e90: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0ea0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0eb0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0ec0: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
0ed0: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
0ee0: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
0ef0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0f00: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
0f10: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
0f20: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
0f30: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
0f40: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
0f50: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
0f60: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
0f70: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
0f80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
0f90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0fa0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
0fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0fc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0fd0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0fe0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0ff0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1010: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1020: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1030: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1040: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1050: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1060: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1070: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1080: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1090: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
10a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
10b0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
10c0: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
10d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
10e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1100: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1120: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1130: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1140: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1150: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1160: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1170: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
1180: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
1190: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
11a0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
11b0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
11c0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
11d0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
11e0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
11f0: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1200: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1210: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1220: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1230: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1240: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1250: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1270: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
1280: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
1290: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12b0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
12c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
12f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1300: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1310: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1320: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1330: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1340: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1350: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1360: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1370: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
1380: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
1390: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
13a0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
13b0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
13c0: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
13d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13e0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
13f0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1400: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1410: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1420: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1430: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1440: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1450: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
1460: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
1470: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
1480: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
1490: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
14a0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
14b0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
14c0: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
14d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
14e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
14f0: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1500: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1510: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1530: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1540: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1550: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
1560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1570: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1580: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
1590: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
15a0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
15b0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
15c0: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
15d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1610: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1650: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
1660: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
1670: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
1680: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
1690: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
16b0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
16c0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
16d0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
16e0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
16f0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1700: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1710: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1720: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1730: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1740: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1760: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1770: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1780: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1790: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
17a0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
17b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
17c0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
17d0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
17e0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
17f0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1800: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1810: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1820: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1830: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1840: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1850: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1860: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1870: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1880: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1890: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
18a0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
18b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
18d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18f0: 5f 42 4c 4f 42 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BLOB;.    }.  }
1900: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1910: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1920: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1930: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1940: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1950: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1960: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1970: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1990: 5f 42 4c 4f 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BLOB;.  }else{.
19a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
19b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
19c0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
19d0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
19e0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
19f0: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1a00: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1a10: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1a20: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1a30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1a40: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1a50: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1a60: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1a70: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a80: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1a90: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1aa0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1ab0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1ac0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1ad0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1ae0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1af0: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1b00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1b10: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b20: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1b30: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1b50: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1b60: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1b70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1b80: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1b90: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ba0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1bb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1bc0: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1bd0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1be0: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1bf0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c10: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1c20: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1c30: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c40: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1c50: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1c60: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c80: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1c90: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1ca0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1cb0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1cc0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1cd0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1ce0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
1cf0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
1d00: 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a  E_AFF_BLOB;.  }.
1d10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1d20: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1d30: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70  a comparison exp
1d40: 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27  ression, eg. '='
1d50: 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65  , '<', IN(...) e
1d60: 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e  tc..** idx_affin
1d70: 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e  ity is the affin
1d80: 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ity of an indexe
1d90: 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e  d column. Return
1da0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20   true.** if the 
1db0: 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e  index with affin
1dc0: 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79  ity idx_affinity
1dd0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1de0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70   comparison in p
1e00: 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
1e10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
1e20: 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c  yOk(Expr *pExpr,
1e30: 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69   char idx_affini
1e40: 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ty){.  char aff 
1e50: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
1e60: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73  nity(pExpr);.  s
1e70: 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20  witch( aff ){.  
1e80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1e90: 46 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65  F_BLOB:.      re
1ea0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65  turn 1;.    case
1eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1ec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  :.      return i
1ed0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
1ee0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
1ef0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1f00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f10: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1f20: 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  (idx_affinity);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1f40: 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65  urn the P5 value
1f50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f60: 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  used for a binar
1f70: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  y comparison.** 
1f80: 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f  opcode (OP_Eq, O
1f90: 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20  P_Ge etc.) used 
1fa0: 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72  to compare pExpr
1fb0: 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f  1 and pExpr2..*/
1fc0: 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72  .static u8 binar
1fd0: 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20  yCompareP5(Expr 
1fe0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
1ff0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
2000: 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66  fNull){.  u8 aff
2010: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2020: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2030: 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75  pr2);.  aff = (u
2040: 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  8)sqlite3Compare
2050: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
2060: 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70   aff) | (u8)jump
2070: 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e  IfNull;.  return
2080: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   aff;.}../*.** R
2090: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20a0: 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  to the collation
20b0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73   sequence that s
20c0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79  hould be used by
20d0: 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  .** a binary com
20e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
20f0: 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74   comparing pLeft
2100: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a   and pRight..**.
2110: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  ** If the left h
2120: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68  and expression h
2130: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
2140: 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68  equence type, th
2150: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64  en it is.** used
2160: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
2170: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2180: 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ce for the right
2190: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
21a0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20  .** is used, or 
21b0: 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e  the default (BIN
21c0: 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20  ARY) if neither 
21d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
21e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79   collating.** ty
21f0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  pe..**.** Argume
2200: 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e  nt pRight (but n
2210: 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65  ot pLeft) may be
2220: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
2230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2240: 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  * it is not cons
2250: 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53  idered..*/.CollS
2260: 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72  eq *sqlite3Binar
2270: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  , .  Expr *pLeft
22a0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  , .  Expr *pRigh
22b0: 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  t.){.  CollSeq *
22c0: 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pColl;.  assert(
22d0: 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20   pLeft );.  if( 
22e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
22f0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
2300: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2310: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2320: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  se, pLeft);.  }e
2330: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26  lse if( pRight &
2340: 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  & (pRight->flags
2350: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
2360: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
2370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2380: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2390: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
23a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23b0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23c0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
23d0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
23e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
23f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2400: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2420: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
2430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2440: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
2450: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
2460: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
2470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
2480: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2490: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
24a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
24b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
24c0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
24d0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
24f0: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2500: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2510: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2530: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2540: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2550: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2560: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2570: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2580: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2590: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
25a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
25b0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
25c0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
25d0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
25e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
25f0: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2600: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2610: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2620: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2640: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2650: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2660: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2670: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
26a0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
26b0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26e0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
26f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2700: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2710: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2720: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2730: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
2740: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
2750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2760: 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74  argument nHeight
2770: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2780: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
2790: 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73  ximum.** express
27a0: 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65  ion depth allowe
27b0: 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  d. If it is not,
27c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27d0: 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50  message in.** pP
27e0: 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  arse..*/.int sql
27f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2800: 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ght(Parse *pPars
2810: 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b  e, int nHeight){
2820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48  TE_OK;.  int mxH
2840: 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e  eight = pParse->
2850: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2860: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
2870: 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67  TH];.  if( nHeig
2880: 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20  ht>mxHeight ){. 
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
28b0: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
28c0: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
28d0: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
28e0: 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20  %d)", mxHeight. 
28f0: 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53     );.    rc = S
2900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2920: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
2930: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
2940: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
2950: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
2960: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
2970: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
2980: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
2990: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
29a0: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
29b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
29c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
29d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29e0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
2a10: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
2a20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2a30: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
2a40: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
2a50: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
2a60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
2a70: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
2a80: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
2a90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2aa0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
2ab0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
2ac0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2ae0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
2af0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
2b00: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
2b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2b20: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
2b40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
2b50: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2b60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2b90: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2ba0: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
2bb0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
2bc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2bd0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2be0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
2bf0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2c00: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
2c10: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
2c20: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
2c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c40: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
2c50: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2c60: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
2c70: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2c80: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2c90: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
2ca0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2cb0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
2cc0: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
2cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2ce0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
2cf0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
2d20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
2d40: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
2d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d60: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
2d80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2d90: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
2da0: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
2db0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
2dc0: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
2dd0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
2de0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
2df0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
2e00: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
2e10: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
2e20: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
2e30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2e40: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
2e50: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
2e60: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
2e70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
2e80: 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65  ate EP_Propagate
2e90: 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45   flags up from E
2ea0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45  xpr.x.pList to E
2eb0: 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66  xpr.flags,.** if
2ec0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ee0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2f20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2f30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2f40: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2f50: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2f60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2f70: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2f80: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2f90: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2fa0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ight);.  }else i
2fb0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  f( p->x.pList ){
2fc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2fd0: 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74  rList(p->x.pList
2fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , &nHeight);.   
2ff0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
3000: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
3010: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
3020: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
3030: 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  }.  p->nHeight =
3040: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
3050: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
3060: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
3070: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65  able using the e
3080: 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66  xprSetHeight() f
3090: 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74  unction. If.** t
30a0: 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65  he height is gre
30b0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ater than the ma
30c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78  ximum allowed ex
30d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a  pression depth,.
30e0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
30f0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  r in pParse..**.
3100: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
3110: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
3120: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
3130: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
3140: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
3150: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
3160: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3170: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
3180: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
3190: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
31a0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
31b0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
31c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
31d0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
31e0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
3210: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
3220: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
3230: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
3240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3250: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
3260: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3270: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
3280: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
3290: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
32a0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
32b0: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
32c0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
32d0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f  eight;.}.#else /
32e0: 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74  * ABOVE:  Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61   enforcement ena
3300: 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65  bled.  BELOW: He
3310: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
3320: 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72   off */./*.** Pr
3330: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
3340: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
3350: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
3360: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
3370: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
3380: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
3390: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
33a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
33b0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
33c0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26  && p->x.pList &&
33d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
33e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
33f0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61  t) ){.    p->fla
3400: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3410: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
3420: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
3430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65  List);.  }.}.#de
3440: 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67  fine exprSetHeig
3450: 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ht(y).#endif /* 
3460: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3470: 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  DEPTH>0 */../*.*
3480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3490: 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63  s the core alloc
34a0: 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f  ator for Expr no
34b0: 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  des..**.** Const
34c0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
34d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
34e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34f0: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
3500: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
3510: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b  and for the pTok
3520: 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  en argument is a
3530: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
3540: 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  on.** obtained f
3550: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3560: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
3570: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
3580: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3590: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
35a0: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
35b0: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
35c0: 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  *.** If dequote 
35d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
35e0: 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65  e token (if it e
35f0: 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74  xists) is dequot
3600: 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  ed..** If dequot
3610: 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64  e is false, no d
3620: 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66  equoting is perf
3630: 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65  ormance.  The de
3640: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
3650: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
3660: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
3670: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
3680: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
3690: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
36a0: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
36b0: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
36c0: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
36d0: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
36e0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
36f0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
3700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
3710: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
3720: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
3730: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
3740: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
3750: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
3760: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
3770: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
3780: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
3790: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
37a0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
37b0: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
37c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
37d0: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
37e0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
37f0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
3800: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
3810: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
3820: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
3830: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
3840: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
3850: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
3860: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
3870: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3880: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
3890: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
38a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
38b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
38c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
38d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3900: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
3910: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
3920: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
3930: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
3940: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
3950: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
3960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
3970: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
3980: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
3990: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
39a0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
39b0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
39c0: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
39d0: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
39e0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
39f0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3a00: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3a10: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
3a20: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
3a30: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
3a40: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
3a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
3a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3a80: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a90: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3aa0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  {.    pNew->op =
3ab0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
3ac0: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3ad0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
3ae0: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
3af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3b00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3b10: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
3b20: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
3b30: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3b50: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
3b60: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
3b70: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3b80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3b90: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
3ba0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3bc0: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
3bd0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
3be0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
3bf0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
3c00: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
3c10: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
3c30: 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20  te && nExtra>=3 
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3c50: 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a   ((c = pToken->z
3c60: 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  [0])=='\'' || c=
3c70: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='"' || c=='[' |
3c80: 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20  | c=='`') ){.   
3c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
3ca0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
3cb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
3cc0: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e   if( c=='"' ) pN
3cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3ce0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
3cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d00: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3d10: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d20: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d70: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d80: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3da0: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3db0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3dc0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3df0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3e00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3e10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e60: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e90: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3ea0: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3eb0: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ec0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3ed0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ef0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3f10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3fa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3fb0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fc0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fe0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4000: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
4010: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4020: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4030: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4040: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4070: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4090: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
40a0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
40b0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40d0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40e0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40f0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
4100: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
4110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4120: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4130: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4140: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4150: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4160: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4170: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4180: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4190: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
41a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41b0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41c0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41d0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41e0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41f0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
4200: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
4210: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4220: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4230: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4240: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4250: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4260: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4270: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4280: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4290: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
42a0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
42b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42e0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4300: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4310: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4330: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4340: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4360: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4370: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4380: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4390: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
43a0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
43b0: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43c0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
43d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
4400: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4410: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4420: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4440: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4450: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4470: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4480: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
4490: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20  pToken, 1);.    
44a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
44b0: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
44c0: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
44d0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
44e0: 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c  f( p ) {.    sql
44f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
4500: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
4510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  Height);.  }.  r
4520: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4530: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4540: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4550: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4560: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4570: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4580: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4590: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
45a0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
45b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
45c0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
45d0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
45e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
45f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
4600: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
4610: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
4620: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
4630: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
4640: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4650: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4660: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4670: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4680: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4690: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
46a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
46b0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
46c0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
46d0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
46e0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
46f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
4700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4710: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
4720: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
4730: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
4740: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4750: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4760: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4770: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4780: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4790: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
47b0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
47c0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
47d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
47e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
47f0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
4800: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
4810: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
4820: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
4830: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
4840: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4850: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4860: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4870: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4890: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
48a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
48b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
48c0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
48d0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
48e0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
48f0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4900: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4910: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4930: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4950: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4960: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4970: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4980: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4990: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
49a0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
49b0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
49c0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
49d0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
49e0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
49f0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4a00: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4a40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4a50: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4a70: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4a80: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4a90: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4ab0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4ac0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4ad0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4af0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4b10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4b20: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b40: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4b50: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4b60: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4b70: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4b90: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4ba0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4bb0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4bc0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4bd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4be0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4bf0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4c00: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4c10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4c20: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4c30: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4c40: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4c50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4c60: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4c70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4c80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4c90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4ca0: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4cd0: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4ce0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4cf0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4d00: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4d10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4d30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4d40: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4d50: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4d60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d80: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4d90: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4da0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4db0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4dc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4dd0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4de0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4df0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4e00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4e10: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4e20: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4e30: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4e40: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4e50: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4e60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4e70: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
4e80: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
4e90: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
4ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4eb0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
4ec0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
4ed0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4ee0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4ef0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4f00: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4f10: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4f20: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4f30: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4f40: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4f50: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4f60: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4f70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
4f80: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
4f90: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
4fa0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4fb0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
4fc0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
4fd0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4fe0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4ff0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
5000: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5010: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
5020: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
5030: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
5040: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5050: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5060: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5070: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5080: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5090: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
50a0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
50b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
50c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
50d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50e0: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
50f0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
5100: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
5110: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5130: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
5140: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5150: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5160: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5190: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
51a0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
51b0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
51c0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
51d0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
51e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
51f0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
5200: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
5210: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5220: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
5230: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
5240: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5250: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5260: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5270: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5280: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5290: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
52a0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
52b0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
52c0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
52d0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
52e0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
52f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
5300: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
5310: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
5320: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
5330: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
5340: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5350: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5360: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5370: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5390: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
53a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
53b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53d0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
53e0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
53f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5410: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
5420: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
5430: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
5440: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5450: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5480: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5490: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
54a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
54b0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
54c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
54d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
54e0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
54f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5500: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
5510: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
5520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
5530: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5560: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5570: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5580: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5590: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
55a0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
55b0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
55c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
55d0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
55e0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
55f0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
5600: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
5610: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
5620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5630: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
5640: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5650: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5660: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5670: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5680: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5690: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
56a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
56b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
56c0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
56d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56f0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
5700: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
5710: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
5720: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
5730: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5750: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5760: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5780: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5790: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
57a0: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
57b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
57c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
57d0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
57e0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
57f0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
5800: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
5810: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5820: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5830: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5840: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5850: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5870: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5880: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5890: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
58a0: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
58c0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
58e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
58f0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
5900: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5910: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5920: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5930: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5940: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5950: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5960: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5970: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
59a0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
59b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
59c0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
59d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
59e0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
59f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5a10: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5a30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5a40: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5a50: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5a60: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5a70: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a90: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5aa0: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5ab0: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
5ac0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ad0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
5af0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
5b00: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
5b10: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
5b20: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
5b30: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
5b40: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
5b50: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ht==0 );.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
5b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5b90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
5ba0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5bb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bc0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
5bd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5be0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
5bf0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
5c20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5c30: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
5c40: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
5c50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5c60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5c70: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ca0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5cc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5cf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5d20: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5d40: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5d50: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5d60: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5d70: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5d80: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5d90: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5da0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5dc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5dd0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5de0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5df0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5e20: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5e30: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5e40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5e60: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5e70: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5e90: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5ea0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5eb0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5ec0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5ed0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5ee0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5ef0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5f00: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5f10: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5f20: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5f30: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5f40: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5f50: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5f60: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5f70: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5f80: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5f90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5fa0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5fb0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5fc0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5fd0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
6030: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6040: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
6050: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
6060: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
6070: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
6080: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
6090: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
60a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
60b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
60c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
60d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
60e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
60f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
6100: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
6110: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
6120: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
6130: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
6140: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
6150: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
6160: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
6170: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6180: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
61a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
61b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
61c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
61d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
61e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
61f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
6200: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
6210: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
6220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
6230: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
6240: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
6250: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
6260: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
6270: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
6280: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
6290: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
62a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
62b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
62c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
62d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
62e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
62f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
6300: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
6310: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
6320: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
6330: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
6340: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
6350: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
6360: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
6370: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
6380: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
63a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
63b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
63c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
63d0: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
63e0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
63f0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
6400: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
6410: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
6420: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
6430: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
6440: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
6450: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
6460: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
6470: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
6480: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
6490: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
64a0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
64b0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
64c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
64d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
64e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
64f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6500: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
6510: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
6520: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6530: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
6540: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
6550: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
6560: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
6570: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
6580: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
6590: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
65a0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
65b0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
65c0: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
65d0: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
65e0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
65f0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
6600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
6610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6620: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
6630: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
6640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6650: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6660: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
6670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6690: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
66b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66c0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
66d0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
66e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
66f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6730: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
6740: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
6750: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
6760: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
6770: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
6790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
67a0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
67b0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
67c0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
67d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
67e0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
67f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
6800: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
6810: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
6820: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
6830: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6850: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6860: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6870: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6880: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6890: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
68a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
68b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
68c0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
68d0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
68e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
6910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
6920: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
6930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6940: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6950: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
6960: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
6970: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
6980: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
6990: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
69a0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
69b0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
69c0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
69d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
69f0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
6a00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
6a10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
6a20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
6a30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
6a40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
6a50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
6a60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
6a70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
6a80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
6a90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
6aa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
6ab0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
6ac0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
6ad0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
6ae0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
6af0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
6b00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
6b10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
6b20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
6b30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
6b40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
6b50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
6b60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
6b70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
6b80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
6b90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
6ba0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6bb0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6bc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
6bd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
6be0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6bf0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6c00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
6c10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
6c20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
6c30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
6c40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
6c50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
6c60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
6c70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
6c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6ca0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
6cb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
6cc0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
6cd0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
6ce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
6cf0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
6d00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
6d20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
6d30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
6d40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
6d50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
6d60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
6d70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
6d80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
6d90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
6da0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
6db0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
6dc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
6dd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
6de0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6df0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
6e00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
6e10: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
6e20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
6e40: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
6e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
6e60: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
6e70: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
6e80: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
6eb0: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
6ec0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
6ed0: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
6ee0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6ef0: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
6f00: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
6f10: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
6f20: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
6f30: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
6f40: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
6f50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
6f60: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
6f70: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
6f80: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
6f90: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
6fa0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
6fb0: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
6fc0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6fe0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
6ff0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
7000: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7010: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
7020: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
7030: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
7040: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7050: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
7060: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
7070: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
7080: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
7090: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
70a0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
70b0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
70c0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
70d0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
70e0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
70f0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
7100: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7110: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
7120: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
7130: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
7140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
7150: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
7160: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
7170: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
7180: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
7190: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
71b0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
71c0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
71d0: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
71e0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
71f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7200: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
7210: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
7220: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
7230: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7240: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7250: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
7270: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
7280: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
7290: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
72a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
72b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
72c0: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
72d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
72e0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
72f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
7310: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
7320: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7330: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
7340: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
7350: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7360: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7370: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7380: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7390: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
73a0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
73b0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
73c0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
73d0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
73e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
73f0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7400: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
7410: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
7420: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
7430: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
7440: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
7450: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
7460: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7470: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7480: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7490: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
74a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
74b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
74c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
74d0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
74e0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
74f0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7500: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
7510: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
7520: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
7530: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
7540: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
7550: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
7560: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7580: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7590: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
75a0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
75b0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
75c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
75d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
75e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
75f0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7600: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7610: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7620: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
7630: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
7640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7650: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
7660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7670: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7680: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76a0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
76b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
76c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
76d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
76e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
76f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7710: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7720: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7730: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
7740: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7750: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7760: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7780: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7790: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
77a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
77b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
77c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
77d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
77e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
77f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7810: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7860: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7870: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7890: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
78d0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7920: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7930: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7940: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7950: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7960: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7970: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7980: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7990: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
79a0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
79b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
79c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79d0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7a00: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7a10: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7a20: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7a30: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7a40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7a50: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7a60: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7a70: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7a80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7a90: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7aa0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7ab0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7ac0: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7ad0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7af0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7b00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7b10: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7b20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7b30: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7b50: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7b80: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7b90: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7ba0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7bb0: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7bc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7be0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7bf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7c00: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7c10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7c20: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7c30: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7c40: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7c50: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7c60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7c70: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7c90: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7ca0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7cb0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7cc0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7cd0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7ce0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7cf0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7d00: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7d10: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7d20: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7d30: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7d40: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7d50: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7d60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7d70: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
7d80: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
7d90: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
7da0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
7db0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
7dc0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
7dd0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
7de0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
7df0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
7e00: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
7e10: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
7e20: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
7e30: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
7e40: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
7e50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
7e60: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
7e70: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
7e80: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
7e90: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
7ea0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
7eb0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
7ec0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
7ed0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
7ee0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
7ef0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
7f00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
7f10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
7f20: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7f30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
7f40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7f50: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
7f60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
7f70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
7f80: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
7f90: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
7fa0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7fb0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
7fc0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
7fd0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7fe0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
7ff0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8000: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8010: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
8020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8050: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8060: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8090: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
80a0: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
80b0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
80c0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
80d0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
80e0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
80f0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8120: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8130: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8150: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8160: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8170: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8190: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
81a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
81b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
81c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
81d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
81e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
81f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8200: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8210: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8240: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8250: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8270: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8280: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8290: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
82a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
82b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
82d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
82e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
82f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8300: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8330: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8340: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8350: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8360: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8370: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8390: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
83a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
83b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
83c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
83d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
83e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
83f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8400: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8410: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8420: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8430: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8440: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8450: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8470: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
84a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
84b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
84c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
84d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
84e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
84f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8500: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
8510: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
8520: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
8530: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
8540: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8550: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
8560: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8580: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8590: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
85a0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
85b0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
85c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
85d0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
85e0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
85f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8600: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8610: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8640: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8650: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8660: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8670: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8690: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
86a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
86b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
86c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
86e0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
86f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8700: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8710: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8720: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
8730: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
8740: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
8750: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8760: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8770: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8780: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8790: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
87a0: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
87b0: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
87c0: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
87d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
87e0: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
87f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
8800: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
8810: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
8820: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
8830: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
8840: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
8850: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8860: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8870: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8880: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8890: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
88a0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
88b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
88c0: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
88d0: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
88e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
88f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
8900: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
8910: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8920: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8930: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8940: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8950: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8970: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8980: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8990: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
89a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
89b0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
89c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
89d0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
89e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
89f0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8a00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8a10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8a20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8a30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8a40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8a50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8a60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8a70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8a80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8a90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8aa0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8ab0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8ac0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8ae0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8af0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
8b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b10: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
8b20: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
8b30: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8b40: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
8b50: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8b60: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8b90: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8ba0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8bb0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8bc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8bd0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8be0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8bf0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
8c00: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
8c10: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
8c20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
8c30: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
8c40: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
8c50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8c60: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8c70: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8c80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8c90: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8ca0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8cb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8cc0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8cd0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8cf0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8d00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8d10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
8d20: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
8d30: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8d50: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8d60: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8d70: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8d80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8d90: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8da0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8dc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8dd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8de0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8df0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8e00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
8e10: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
8e20: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8e30: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
8e40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
8e50: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8e60: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8e70: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8e80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8e90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ea0: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8eb0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8ec0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8ed0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8ee0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8ef0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
8f00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8f10: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
8f20: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8f30: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
8f40: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8f50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8f60: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8f70: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8f80: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8f90: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8fa0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8fb0: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8fc0: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8fd0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8fe0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8ff0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
9000: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
9010: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
9020: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
9030: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
9040: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9050: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
9060: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
9070: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
9080: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
9090: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
90a0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
90b0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
90c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
90d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
90e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
90f0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
9100: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
9110: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
9120: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d  .  pNew->pWith =
9130: 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e   withDup(db, p->
9140: 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  pWith);.  sqlite
9150: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
9160: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
9180: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
9190: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
91a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
91b0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
91c0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
91d0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
91e0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
91f0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9200: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9210: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9220: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9230: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
9240: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
9250: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
9260: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9270: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9280: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9290: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
92a0: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
92b0: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
92c0: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
92d0: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
92e0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
92f0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
9300: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
9310: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
9320: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
9330: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
9340: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
9350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9380: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
93a0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
93b0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
93c0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
93d0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
93e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
93f0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
9400: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
9410: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9420: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9430: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9440: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9450: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9460: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
9470: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
9480: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9490: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
94a0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
94b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
94c0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
94d0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
94e0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
94f0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
9500: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
9510: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
9520: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
9530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9540: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9550: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
9560: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
9570: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
9580: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
9590: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
95a0: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
95b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
95c0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
95d0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
95f0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
9600: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
9610: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
9620: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9630: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9640: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9650: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
9660: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
9670: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
9680: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
9690: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
96a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
96b0: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
96c0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
96d0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
96e0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
9700: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
9710: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
9720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9730: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9740: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
9750: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9760: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
9770: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9780: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9790: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
97a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
97b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
97c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
97d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
97e0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
97f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
9800: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9810: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
9820: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9830: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9840: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9860: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
9870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9880: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9890: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
98a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
98b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
98c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
98d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
98e0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
98f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
9900: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
9910: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
9920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9930: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
9940: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
9950: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9960: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
9970: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9980: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
9990: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
99a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
99b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
99c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
99d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
99e0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
99f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9a00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
9a10: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
9a20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
9a30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9a40: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
9a50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9a60: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
9a70: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
9a80: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
9a90: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
9aa0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
9ab0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9ac0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
9ad0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9ae0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9af0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9b00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9b10: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
9b20: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
9b30: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
9b40: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
9b50: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
9b60: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
9b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9b80: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ba0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9bc0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
9bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9bf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9c00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9c10: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9c20: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9c30: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9c40: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
9c50: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
9c60: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
9c70: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
9c80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9c90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
9ca0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
9cb0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
9cc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
9cd0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
9cf0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
9d00: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
9d10: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9d20: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
9d30: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
9d40: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
9d50: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
9d60: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
9d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d80: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
9d90: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
9da0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9db0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
9dc0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
9e00: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
9e10: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
9e20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9e30: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
9e40: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
9e50: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
9e60: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
9e70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9e80: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
9e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ea0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
9eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
9ec0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9ed0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9ee0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
9ef0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
9f00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9f10: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
9f20: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
9f30: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9f40: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
9f50: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
9f60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
9f70: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
9f80: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
9f90: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
9fa0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9fb0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
9fc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
9fd0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
9fe0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
9ff0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
a000: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
a010: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
a020: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
a030: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
a040: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
a050: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a060: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
a070: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
a080: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
a090: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
a0a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
a0b0: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
a0c0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
a0d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
a0e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
a0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a100: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
a110: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
a120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
a140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a150: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
a160: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
a170: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
a180: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
a190: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
a1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a1b0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
a1c0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
a1d0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
a1e0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
a1f0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
a200: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
a210: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
a220: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
a230: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
a240: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
a250: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
a260: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a270: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
a280: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
a290: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 69 66 28  Expr;.       if(
a2a0: 20 41 4c 57 41 59 53 28 70 45 78 70 72 29 20 29   ALWAYS(pExpr) )
a2b0: 20 6d 20 7c 3d 20 70 45 78 70 72 2d 3e 66 6c 61   m |= pExpr->fla
a2c0: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
a2d0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
a2e0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
a2f0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
a300: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
a310: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
a320: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
a330: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
a340: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
a350: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
a360: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
a370: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
a380: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
a390: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
a3a0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
a3b0: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
a3c0: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
a3d0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
a3e0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
a3f0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
a400: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
a410: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
a430: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
a440: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
a450: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
a460: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
a470: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
a480: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
a490: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
a4a0: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
a4b0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a4c0: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
a4d0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a4e0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
a4f0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a500: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
a510: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
a520: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
a530: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
a540: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
a550: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
a560: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
a570: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
a580: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
a590: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a5a0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
a5b0: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
a5c0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
a5d0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
a5e0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
a5f0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
a600: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
a610: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
a620: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
a630: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
a640: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
a650: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
a660: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
a670: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
a680: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
a690: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
a6a0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
a6b0: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
a6c0: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
a6d0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
a6e0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
a6f0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
a700: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
a710: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
a720: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
a730: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
a740: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
a750: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
a760: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
a770: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
a780: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
a790: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
a7a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
a7b0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
a7c0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
a7d0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
a7e0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
a7f0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
a800: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
a810: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
a820: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
a830: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
a840: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
a850: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
a860: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
a870: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
a880: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
a890: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
a8a0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a8b0: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
a8c0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a8d0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
a8e0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
a8f0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
a900: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
a910: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a920: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
a930: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
a940: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
a950: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
a960: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
a970: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
a980: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
a990: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
a9a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
a9b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
a9c0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
a9d0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
a9e0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
a9f0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
aa00: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
aa10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
aa20: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
aa30: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
aa40: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aa50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa60: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
aa70: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
aa80: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
aa90: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
aaa0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
aab0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
aac0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
aad0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
aae0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
aaf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ab00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
ab10: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
ab20: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ab30: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
ab40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ab50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
ab60: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
ab70: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ab80: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ab90: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
aba0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
abb0: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
abc0: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
abd0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
abe0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
abf0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
ac00: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
ac10: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
ac20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ac30: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
ac40: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
ac50: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
ac60: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ac70: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ac80: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
ac90: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
aca0: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
acb0: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
acc0: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
acd0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
ace0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
acf0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
ad00: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
ad10: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
ad20: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ad30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
ad40: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
ad50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ad60: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ad70: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
ad80: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ad90: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
ada0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
adb0: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
adc0: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
add0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
ade0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
adf0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
ae00: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
ae10: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
ae20: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
ae30: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
ae40: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
ae50: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
ae60: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ae70: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
ae80: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
ae90: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
aea0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
aeb0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
aec0: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
aed0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
aee0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
aef0: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
af00: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
af10: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
af20: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
af30: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
af40: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
af50: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
af60: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
af70: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
af80: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
af90: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
afa0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
afb0: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
afc0: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
afd0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
afe0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
aff0: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
b000: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
b010: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
b020: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
b030: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
b040: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b050: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
b060: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
b070: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
b080: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
b090: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
b0a0: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
b0b0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b0c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b0d0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b0e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b0f0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b100: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
b110: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
b120: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
b130: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b140: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b150: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b160: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b170: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b180: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b190: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b1a0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b1b0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b1c0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b1d0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b1e0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
b1f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
b200: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b210: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
b220: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b230: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b240: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b250: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b260: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
b270: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
b280: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
b290: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
b2a0: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
b2b0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
b2c0: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
b2d0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
b2e0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
b2f0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
b300: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
b310: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
b320: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
b330: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
b340: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
b350: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
b360: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b370: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b380: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b390: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b3a0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
b3b0: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
b3c0: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
b3d0: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
b3e0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
b3f0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
b400: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
b410: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
b420: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
b430: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
b440: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
b450: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
b460: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
b470: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
b480: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
b490: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b4a0: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f  , 3, iCur);.}../
b4b0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b4c0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b4d0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b4e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b4f0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b500: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
b510: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
b520: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
b530: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
b540: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
b550: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
b560: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
b570: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
b580: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
b590: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
b5a0: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
b5b0: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
b5c0: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
b5d0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
b5e0: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
b5f0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
b600: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
b610: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
b620: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
b630: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
b640: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
b650: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
b660: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b670: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
b680: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
b690: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
b6a0: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
b6b0: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
b6c0: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
b6d0: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
b6e0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
b6f0: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
b700: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
b710: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
b720: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
b730: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
b740: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
b750: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
b760: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
b770: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
b780: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
b790: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
b7a0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
b7b0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
b7c0: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
b7d0: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
b7e0: 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49   rc = 0;..  /* I
b7f0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
b800: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69  is an integer li
b810: 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20  teral that fits 
b820: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
b830: 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  it.  ** integer,
b840: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74   then the EP_Int
b850: 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20  Value flag will 
b860: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b870: 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72  n set */.  asser
b880: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54  t( p->op!=TK_INT
b890: 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67  EGER || (p->flag
b8a0: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  s & EP_IntValue)
b8b0: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  !=0.           |
b8c0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
b8d0: 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  2(p->u.zToken, &
b8e0: 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  rc)==0 );..  if(
b8f0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49   p->flags & EP_I
b900: 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a  ntValue ){.    *
b910: 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56  pValue = p->u.iV
b920: 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alue;.    return
b930: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
b940: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
b950: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
b960: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b970: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
b980: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
b990: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b9a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b9b0: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
b9c0: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
b9d0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
b9e0: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
b9f0: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
ba00: 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31   assert( v!=(-21
ba10: 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20  47483647-1) );. 
ba20: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
ba30: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
ba40: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
ba50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
ba70: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
ba80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
ba90: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
baa0: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
bab0: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
bac0: 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
bad0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
bae0: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
baf0: 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
bb00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
bb10: 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
bb20: 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
bb30: 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
bb40: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
bb50: 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
bb60: 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
bb70: 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
bb80: 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
bb90: 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
bba0: 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
bbb0: 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
bbc0: 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
bbd0: 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
bbe0: 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
bbf0: 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
bc00: 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
bc10: 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
bc20: 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
bc30: 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
bc40: 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
bc50: 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
bc60: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
bc70: 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
bc80: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
bc90: 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
bca0: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
bcb0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
bcc0: 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
bcd0: 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
bce0: 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
bcf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
bd00: 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
bd10: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
bd20: 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
bd30: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
bd40: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
bd50: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
bd60: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
bd70: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
bd80: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
bd90: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
bda0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
bdb0: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
bdc0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
bdd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
bde0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
bdf0: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
be00: 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  n 0;.    case TK
be10: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61  _COLUMN:.      a
be20: 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d  ssert( p->pTab!=
be30: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
be40: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
be50: 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c  y(p, EP_CanBeNul
be60: 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  l) ||.          
be70: 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
be80: 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43  0 && p->pTab->aC
be90: 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e  ol[p->iColumn].n
bea0: 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20  otNull==0);.    
beb0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
bec0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
bed0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
bee0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  E if the given e
bef0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
bf00: 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f  onstant which wo
bf10: 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e  uld be.** unchan
bf20: 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69  ged by OP_Affini
bf30: 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69  ty with the affi
bf40: 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68  nity given in th
bf50: 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
bf60: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ment..**.** This
bf70: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
bf80: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
bf90: 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
bfa0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
bfb0: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57  n be omitted.  W
bfc0: 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74  hen in doubt ret
bfd0: 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61  urn FALSE.  A fa
bfe0: 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  lse negative.** 
bff0: 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20  is harmless.  A 
c000: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20  false positive, 
c010: 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73  however, can res
c020: 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  ult in the wrong
c030: 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69  .** answer..*/.i
c040: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  nt sqlite3ExprNe
c050: 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
c060: 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  nge(const Expr *
c070: 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20  p, char aff){.  
c080: 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66  u8 op;.  if( aff
c090: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  ==SQLITE_AFF_BLO
c0a0: 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
c0b0: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
c0c0: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
c0d0: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
c0e0: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
c0f0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
c100: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
c110: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
c120: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
c130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
c140: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  EGER: {.      re
c150: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
c160: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
c170: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c180: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
c190: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
c1a0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c1b0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
c1c0: 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51  _REAL || aff==SQ
c1d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c1f0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
c200: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
c210: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
c220: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c230: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
c240: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c250: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
c260: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  UMN: {.      ass
c270: 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d  ert( p->iTable>=
c280: 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f  0 );  /* p canno
c290: 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43  t be part of a C
c2a0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
c2b0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
c2c0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20  p->iColumn<0.   
c2d0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
c2e0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c2f0: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
c300: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a  E_AFF_NUMERIC);.
c310: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c320: 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t: {.      retur
c330: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  n 0;.    }.  }.}
c340: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
c350: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
c360: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
c370: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
c380: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
c390: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
c3a0: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
c3b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
c3c0: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
c3d0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
c3e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
c3f0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
c400: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
c410: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
c420: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
c430: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
c440: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
c450: 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72  rn true if we ar
c460: 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e  e able to the IN
c470: 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69   operator optimi
c480: 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71  zation on a.** q
c490: 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
c4a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49  .**.**       x I
c4b0: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
c4c0: 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53  *.** Where the S
c4d0: 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20  ELECT... clause 
c4e0: 69 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20  is as specified 
c4f0: 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  by the parameter
c500: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   to this.** rout
c510: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ine..**.** The S
c520: 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73  elect object pas
c530: 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61  sed in has alrea
c540: 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65  dy been preproce
c550: 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65  ssed and no.** e
c560: 72 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20  rrors have been 
c570: 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  found..*/.#ifnde
c580: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c590: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e  BQUERY.static in
c5a0: 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  t isCandidateFor
c5b0: 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29  InOpt(Select *p)
c5c0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
c5d0: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
c5e0: 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
c5f0: 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pTab;.  if( p==0
c600: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c620: 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
c630: 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43  e of IN is SELEC
c640: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  T */.  if( p->pP
c650: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c670: 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   Not a compound 
c680: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
c690: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
c6a0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
c6b0: 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
c6c0: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
c6d0: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
c6e0: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
c6f0: 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
c700: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
c710: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
c720: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
c730: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
c740: 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
c750: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
c760: 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  No DISTINCT keyw
c770: 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65  ord and no aggre
c780: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
c790: 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
c7a0: 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
c7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c7c0: 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  * Has no GROUP B
c7d0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
c7e0: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  ( p->pLimit ) re
c7f0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
c800: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c       /* Has no L
c810: 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
c820: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
c830: 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  set==0 );       
c840: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49          /* No LI
c850: 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46  MIT means no OFF
c860: 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  SET */.  if( p->
c870: 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
c880: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c890: 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
c8a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
c8b0: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
c8c0: 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
c8d0: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
c8e0: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
c8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
c900: 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
c910: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
c920: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
c930: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
c940: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
c950: 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
c960: 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
c970: 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
c980: 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  b;.  if( NEVER(p
c990: 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  Tab==0) ) return
c9a0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   0;.  assert( pT
c9b0: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
c9c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c9d0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
c9e0: 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
c9f0: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
ca00: 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
ca10: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
ca20: 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
ca30: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
ca40: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
ca50: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
ca60: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
ca70: 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  n 0;       /* On
ca80: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
ca90: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
caa0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
cab0: 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  .pExpr->op!=TK_C
cac0: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
cad0: 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61  ; /* Result is a
cae0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74   column */.  ret
caf0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
cb00: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
cb10: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
cb20: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63  * Code an OP_Onc
cb30: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  e instruction an
cb40: 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  d allocate space
cb50: 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52   for its flag. R
cb60: 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64  eturn the .** ad
cb70: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
cb80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
cb90: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
cba0: 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72  Once(Parse *pPar
cbb0: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
cbc0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
cbd0: 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
cbe0: 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
cbf0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
cc00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
cc10: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
cc20: 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e  _Once, pParse->n
cc30: 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Once++);.}../*.*
cc40: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cc50: 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
cc60: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
cc70: 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
cc80: 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
cc90: 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
cca0: 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
ccb0: 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
ccc0: 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
ccd0: 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
cce0: 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
ccf0: 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
cd00: 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
cd10: 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
cd20: 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
cd30: 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
cd40: 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
cd50: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
cd60: 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
cd70: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
cd80: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
cd90: 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
cda0: 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
cdb0: 0a 20 20 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c  .  int j1;.  sql
cdc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cdd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
cde0: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
cdf0: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
ce00: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
ce10: 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65  ind, iCur); Vdbe
ce20: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
ce30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ce40: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
ce50: 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75  Cur, 0, regHasNu
ce60: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ll);.  sqlite3Vd
ce70: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
ce80: 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
ce90: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
cea0: 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f  v, "first_entry_
ceb0: 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b  in(%d)", iCur));
cec0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
ced0: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d  mpHere(v, j1);.}
cee0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
cef0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
cf00: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
cf10: 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  nt is an IN oper
cf20: 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74  ator with a list
cf30: 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
cf40: 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67  ) on the .** rig
cf50: 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52  ht-hand side.  R
cf60: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
cf70: 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74  at list is const
cf80: 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ant..*/.static i
cf90: 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49  nt sqlite3InRhsI
cfa0: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
cfb0: 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  pIn){.  Expr *pL
cfc0: 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  HS;.  int res;. 
cfd0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
cfe0: 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45  sProperty(pIn, E
cff0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
d000: 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c    pLHS = pIn->pL
d010: 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  eft;.  pIn->pLef
d020: 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73  t = 0;.  res = s
d030: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
d040: 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e  tant(pIn);.  pIn
d050: 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a  ->pLeft = pLHS;.
d060: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
d070: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
d080: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
d090: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
d0a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
d0b0: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
d0c0: 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
d0d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
d0e0: 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
d0f0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
d100: 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
d110: 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
d120: 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
d130: 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
d140: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
d150: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
d160: 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
d170: 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
d180: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
d190: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
d1a0: 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
d1b0: 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
d1c0: 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
d1d0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
d1e0: 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
d1f0: 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
d200: 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
d210: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
d220: 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
d230: 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
d240: 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52  ct that is the R
d250: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d260: 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
d270: 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
d280: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
d290: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
d2a0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
d2b0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
d2c0: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
d2d0: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
d2e0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d2f0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
d300: 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
d310: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
d320: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
d330: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
d340: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
d350: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
d360: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
d370: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
d380: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
d390: 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
d3a0: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
d3b0: 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
d3c0: 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
d3d0: 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
d3e0: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
d3f0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
d400: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
d410: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
d430: 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
d440: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
d450: 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20  INDEX_NOOP      
d460: 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73   - No cursor was
d470: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65   allocated.  The
d480: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
d490: 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
d4c0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
d4d0: 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  parisons..**.** 
d4e0: 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
d4f0: 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
d500: 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
d510: 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
d520: 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
d530: 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
d540: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
d550: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
d560: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
d570: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d580: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
d590: 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
d5a0: 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
d5b0: 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
d5c0: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
d5d0: 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
d5e0: 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
d5f0: 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
d600: 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
d610: 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
d620: 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
d630: 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
d640: 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
d650: 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
d660: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
d670: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  tain exactly one
d680: 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20   of the bits.** 
d690: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
d6a0: 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f  HIP or IN_INDEX_
d6b0: 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67  LOOP.  If inFlag
d6c0: 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e  s contains.** IN
d6d0: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
d6e0: 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65  P, then the gene
d6f0: 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c  rated table will
d700: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a   be used for a.*
d710: 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69  * fast membershi
d720: 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68  p test.  When th
d730: 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  e IN_INDEX_LOOP 
d740: 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a  bit is set, the.
d750: 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  ** IN index will
d760: 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70   be used to loop
d770: 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
d780: 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   of the RHS of t
d790: 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  he.** IN operato
d7a0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
d7b0: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
d7c0: 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
d7d0: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
d7e0: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
d7f0: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
d800: 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
d810: 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
d820: 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
d830: 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
d840: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
d850: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
d860: 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c  he selected <col
d870: 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65  umn> is guarante
d880: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
d890: 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
d8a0: 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
d8b0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
d8c0: 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20   or it.** has a 
d8d0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
d8e0: 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  t or UNIQUE inde
d8f0: 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  x..**.** When IN
d900: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
d910: 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
d920: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
d930: 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
d940: 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
d950: 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61  ip tests) then a
d960: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
d970: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
d980: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
d990: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
d9a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
d9b0: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
d9c0: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
d9d0: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
d9e0: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
d9f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e  .**.** If the IN
da00: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61  _INDEX_NOOP_OK a
da10: 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  nd IN_INDEX_MEMB
da20: 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20  ERSHIP are both 
da30: 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  set and.** if th
da40: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
da50: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
da60: 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
da70: 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ry) then this.**
da80: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
da90: 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74  ecide that creat
daa0: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
dab0: 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62   b-tree for memb
dac0: 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e  ership.** testin
dad0: 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69  g is too expensi
dae0: 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e  ve and return IN
daf0: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e  _INDEX_NOOP.  In
db00: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
db10: 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
db20: 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d  ne should implem
db30: 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ent the IN opera
db40: 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75  tor using a sequ
db50: 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72  ence.** of Eq or
db60: 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   Ne comparison o
db70: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
db80: 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
db90: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
dba0: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
dbb0: 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
dbc0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67   function.** mig
dbd0: 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ht need to know 
dbe0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
dbf0: 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74  he RHS side of t
dc00: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
dc10: 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  * contains a NUL
dc20: 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e  L.  If prRhsHasN
dc30: 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c  ull is not a NUL
dc40: 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a  L pointer and .*
dc50: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  * if there is an
dc60: 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
dc70: 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
dc80: 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
dc90: 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
dca0: 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
dcb0: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
dcc0: 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
dcd0: 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
dce0: 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75  * to *prRhsHasNu
dcf0: 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ll. If there is 
dd00: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
dd10: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
dd20: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
dd30: 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61  e, then *prRhsHa
dd40: 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e  sNull is left un
dd50: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
dd60: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
dd70: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
dd80: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
dd90: 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  d in *prRhsHasNu
dda0: 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ll, then.** the 
ddb0: 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65  value in that re
ddc0: 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e  gister will be N
ddd0: 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65  ULL if the b-tre
dde0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  e contains one o
ddf0: 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76  r more.** NULL v
de00: 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69  alues, and it wi
de10: 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e  ll be some non-N
de20: 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65  ULL value if the
de30: 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
de40: 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75   no.** NULL valu
de50: 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  es..*/.#ifndef S
de60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
de70: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
de80: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
de90: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
dea0: 70 58 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c  pX, u32 inFlags,
deb0: 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
dec0: 6c 6c 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ll){.  Select *p
ded0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
def0: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
df00: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
df10: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
df20: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df40: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
df50: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
df60: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
df70: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
df80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
df90: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
dfa0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
dfb0: 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
dfe0: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
dff0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
e000: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e010: 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
e020: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
e030: 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
e040: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
e050: 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
e060: 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
e070: 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
e080: 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  )!=0;..  /* Chec
e090: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
e0a0: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
e0b0: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
e0c0: 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
e0d0: 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
e0e0: 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
e0f0: 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
e100: 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
e110: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
e120: 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73  /.  p = (ExprHas
e130: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
e140: 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d  xIsSelect) ? pX-
e150: 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b  >x.pSelect : 0);
e160: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
e170: 45 72 72 3d 3d 30 20 26 26 20 69 73 43 61 6e 64  Err==0 && isCand
e180: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
e190: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
e1a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
e1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
e1c0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
e1d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62  ction */.    Tab
e1e0: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61      /* Table <ta
e210: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70  ble>. */.    Exp
e220: 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20  r *pExpr;       
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
e250: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
e260: 20 20 69 31 36 20 69 43 6f 6c 3b 20 20 20 20 20    i16 iCol;     
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e290: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c  x of column <col
e2a0: 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20  umn> */.    i16 
e2b0: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
e2e0: 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a  dx for pTab */..
e2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29 3b      assert( p );
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
e320: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
e330: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
e340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e350: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20 20  EList!=0 );     
e360: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
e370: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
e380: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
e390: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e3a0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
e3b0: 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61 75  r!=0 ); /* Becau
e3c0: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
e3d0: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
e3e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
e3f0: 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20 20  Src!=0 );       
e400: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75          /* Becau
e410: 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61 74  se of isCandidat
e420: 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a  eForInOpt(p) */.
e430: 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53      pTab = p->pS
e440: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
e450: 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45     pExpr = p->pE
e460: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
e470: 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 28 69 31  ;.    iCol = (i1
e480: 36 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  6)pExpr->iColumn
e490: 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64  ;.   .    /* Cod
e4a0: 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74  e an OP_Transact
e4b0: 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65  ion and OP_Table
e4c0: 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e  Lock for <table>
e4d0: 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  . */.    iDb = s
e4e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
e4f0: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
e500: 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69  chema);.    sqli
e510: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
e520: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
e530: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61 62  ;.    sqlite3Tab
e540: 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
e550: 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
e560: 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
e570: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  ..    /* This fu
e580: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
e590: 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20 70  alled from two p
e5a0: 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20 63  laces. In both c
e5b0: 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20 20  ases the vdbe.  
e5c0: 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
e5d0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
e5e0: 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69 74   So assume sqlit
e5f0: 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20 61  e3GetVdbe() is a
e600: 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75 63  lways.    ** suc
e610: 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20 20  cessful here..  
e620: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
e630: 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  v);.    if( iCol
e640: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  <0 ){.      int 
e650: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
e660: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
e670: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
e680: 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 73  age(v);..      s
e690: 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
e6a0: 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
e6b0: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
e6c0: 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54 79  Read);.      eTy
e6d0: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
e6e0: 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  WID;..      sqli
e6f0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
e700: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 7d  v, iAddr);.    }
e710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
e720: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
e750: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  iable */..      
e760: 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
e770: 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 62   sequence used b
e780: 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  y the comparison
e790: 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69 73  . If an index is
e7a0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
e7b0: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
e7c0: 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69   a temp-table, i
e7d0: 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72 65  t must be ordere
e7e0: 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20 20  d according.    
e7f0: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c    ** to this col
e800: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
e810: 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53    */.      CollS
e820: 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69 74  eq *pReq = sqlit
e830: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
e840: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e850: 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 29  X->pLeft, pExpr)
e860: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  ;..      /* Chec
e870: 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69 6e  k that the affin
e880: 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ity that will be
e890: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
e8a0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
e8b0: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68 65  omparison is the
e8c0: 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66 66   same as the aff
e8d0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f 6c  inity of the col
e8e0: 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  umn. If.      **
e8f0: 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20 69   it is not, it i
e900: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
e910: 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78 2e  o use any index.
e920: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e930: 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20  int affinity_ok 
e940: 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  = sqlite3IndexAf
e950: 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54 61  finityOk(pX, pTa
e960: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66  b->aCol[iCol].af
e970: 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20  finity);..      
e980: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
e990: 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20 65  Index; pIdx && e
e9a0: 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69 6e  Type==0 && affin
e9b0: 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64  ity_ok; pIdx=pId
e9c0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
e9d0: 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61 69     if( (pIdx->ai
e9e0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29  Column[0]==iCol)
e9f0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c  .         && sql
ea00: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
ea10: 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49 64  db, ENC(db), pId
ea20: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29  x->azColl[0], 0)
ea30: 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20 20  ==pReq.         
ea40: 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71 75  && (!mustBeUniqu
ea50: 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79  e || (pIdx->nKey
ea60: 43 6f 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69 71  Col==1 && IsUniq
ea70: 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 29 0a  ueIndex(pIdx))).
ea80: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
ea90: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
eaa0: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
eab0: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
eac0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
ead0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eae0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
eaf0: 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49 64  nRead, iTab, pId
eb00: 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
eb10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eb20: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
eb30: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b 0a  (pParse, pIdx);.
eb40: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
eb50: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
eb60: 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pIdx->zName));. 
eb70: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
eb80: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
eb90: 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58  DESC == IN_INDEX
eba0: 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a  _INDEX_ASC+1 );.
ebb0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
ebc0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  = IN_INDEX_INDEX
ebd0: 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f  _ASC + pIdx->aSo
ebe0: 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20  rtOrder[0];..   
ebf0: 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68 73         if( prRhs
ec00: 48 61 73 4e 75 6c 6c 20 26 26 20 21 70 54 61 62  HasNull && !pTab
ec10: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74  ->aCol[iCol].not
ec20: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
ec30: 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c      *prRhsHasNul
ec40: 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  l = ++pParse->nM
ec50: 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
ec60: 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
ec70: 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20 2a  lFlag(v, iTab, *
ec80: 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20  prRhsHasNull);. 
ec90: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
eca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ecb0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
ecc0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
ecd0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ece0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65  .  /* If no pree
ecf0: 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69 73  xisting index is
ed00: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 74   available for t
ed10: 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a  he IN clause.  *
ed20: 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e  * and IN_INDEX_N
ed30: 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65  OOP is an allowe
ed40: 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64  d reply.  ** and
ed50: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
ed60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
ed70: 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75 62   list, not a sub
ed80: 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74  query.  ** and t
ed90: 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63 6f  he RHS is not co
eda0: 6e 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77 6f  ntant or has two
edb0: 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73 2c   or fewer terms,
edc0: 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
edd0: 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61 74   not worth creat
ede0: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
edf0: 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75 61   table to evalua
ee00: 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f  te.  ** the IN o
ee10: 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75 72  perator so retur
ee20: 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e  n IN_INDEX_NOOP.
ee30: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
ee40: 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46 6c  e==0.   && (inFl
ee50: 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e  ags & IN_INDEX_N
ee60: 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45  OOP_OK).   && !E
ee70: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ee80: 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  X, EP_xIsSelect)
ee90: 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65 33  .   && (!sqlite3
eea0: 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
eeb0: 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69  pX) || pX->x.pLi
eec0: 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20  st->nExpr<=2).  
eed0: 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49  ){.    eType = I
eee0: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20  N_INDEX_NOOP;.  
eef0: 7d 0a 20 20 20 20 20 0a 0a 20 20 69 66 28 20 65  }.     ..  if( e
ef00: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Type==0 ){.    /
ef10: 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  * Could not find
ef20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
ef30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 75  le or index to u
ef40: 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62 2d  se as the RHS b-
ef50: 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  tree..    ** We 
ef60: 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65 6e  will have to gen
ef70: 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72  erate an ephemer
ef80: 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20 74  al table to do t
ef90: 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  he job..    */. 
efa0: 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75 65     u32 savedNQue
efb0: 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d  ryLoop = pParse-
efc0: 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  >nQueryLoop;.   
efd0: 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75 6c   int rMayHaveNul
efe0: 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70 65  l = 0;.    eType
eff0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b   = IN_INDEX_EPH;
f000: 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67 73  .    if( inFlags
f010: 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
f020: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
f030: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30  ->nQueryLoop = 0
f040: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e  ;.      if( pX->
f050: 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pLeft->iColumn<0
f060: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
f070: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
f080: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
f090: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
f0a0: 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  EX_ROWID;.      
f0b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
f0c0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a  prRhsHasNull ){.
f0d0: 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e        *prRhsHasN
f0e0: 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e 75  ull = rMayHaveNu
f0f0: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
f100: 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Mem;.    }.    s
f110: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
f120: 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c 20  ect(pParse, pX, 
f130: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54  rMayHaveNull, eT
f140: 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
f150: 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73 65  WID);.    pParse
f160: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73  ->nQueryLoop = s
f170: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
f180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d    }else{.    pX-
f190: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a  >iTable = iTab;.
f1a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54 79    }.  return eTy
f1b0: 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pe;.}.#endif../*
f1c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
f1d0: 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75 62  e for scalar sub
f1e0: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
f1f0: 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72 65  a subquery expre
f200: 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a  ssion, EXISTS,.*
f210: 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  * or IN operator
f220: 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  s.  Examples:.**
f230: 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54 20  .**     (SELECT 
f240: 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20 20  a FROM b)       
f250: 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a     -- subquery.*
f260: 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53 45  *     EXISTS (SE
f270: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
f280: 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71 75   -- EXISTS subqu
f290: 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20  ery.**     x IN 
f2a0: 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20 20  (4,5,11)        
f2b0: 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72        -- IN oper
f2c0: 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20 6f  ator with list o
f2d0: 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  n right-hand sid
f2e0: 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 53  e.**     x IN (S
f2f0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
f300: 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74      -- IN operat
f310: 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72 79  or with subquery
f320: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a 2a   on the right.**
f330: 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70 61  .** The pExpr pa
f340: 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62 65  rameter describe
f350: 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  s the expression
f360: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
f370: 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f  he IN.** operato
f380: 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a 2a  r or subquery..*
f390: 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
f3a0: 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e  r isRowid is non
f3b0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70 72  -zero, then expr
f3c0: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73 20  ession pExpr is 
f3d0: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f  guaranteed.** to
f3e0: 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   be of the form 
f3f0: 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20  "<rowid> IN (?, 
f400: 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c 72  ?, ?)", where <r
f410: 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65 72  owid> is a refer
f420: 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20  ence.** to some 
f430: 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c 75  integer key colu
f440: 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42 2d  mn of a table B-
f450: 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
f460: 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e  se, use an.** in
f470: 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20 73  tkey B-Tree to s
f480: 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
f490: 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69  IN(...) values i
f4a0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
f4b0: 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20  ual.** (slower) 
f4c0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
f4d0: 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a  keys B-Tree..**.
f4e0: 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e 75  ** If rMayHaveNu
f4f0: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
f500: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
f510: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
f520: 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61   an IN.** (not a
f530: 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54   SELECT or EXIST
f540: 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  S) and that the 
f550: 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  RHS might contai
f560: 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c  ns NULLs..** All
f570: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
f580: 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  es is initialize
f590: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67 69   the register gi
f5a0: 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65 4e  ven by rMayHaveN
f5b0: 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20  ull.** to NULL. 
f5c0: 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   Calling routine
f5d0: 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72 65  s will take care
f5e0: 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68 69   of changing thi
f5f0: 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76 61  s register.** va
f600: 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20  lue to non-NULL 
f610: 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
f620: 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46  LL-free..**.** F
f630: 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  or a SELECT or E
f640: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c 20  XISTS operator, 
f650: 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  return the regis
f660: 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ter that holds t
f670: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46  he.** result.  F
f680: 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  or IN operators 
f690: 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
f6a0: 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75 72  ccurs, the retur
f6b0: 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f  n value is 0..*/
f6c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f6d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e  OMIT_SUBQUERY.in
f6e0: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62  t sqlite3CodeSub
f6f0: 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  select(.  Parse 
f700: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
f710: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
f720: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
f730: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
f740: 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c    /* The IN, SEL
f750: 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20 6f  ECT, or EXISTS o
f760: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  perator */.  int
f770: 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20   rHasNullFlag,  
f780: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
f790: 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77 68   that records wh
f7a0: 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69 73  ether NULLs exis
f7b0: 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e  t in RHS */.  in
f7c0: 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20 20  t isRowid       
f7d0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
f7e0: 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65 72  , LHS of IN oper
f7f0: 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64 20  ator is a rowid 
f800: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49  */.){.  int jmpI
f810: 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20  fDynamic = -1;  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20      /* One-time 
f840: 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f 0a  test address */.
f850: 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b 20    int rReg = 0; 
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
f880: 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72 65  ister storing re
f890: 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62  sulting */.  Vdb
f8a0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
f8b0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
f8c0: 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
f8d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
f8e0: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
f8f0: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ush(pParse);..  
f900: 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75 73  /* This code mus
f910: 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73 20  t be run in its 
f920: 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20 74  entirety every t
f930: 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
f940: 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e  tered.  ** if an
f950: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
f960: 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a  ng is true:.  **
f970: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
f980: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
f990: 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20  is a correlated 
f9a0: 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20 20  subquery.  **   
f9b0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
f9c0: 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65 78  nd side is an ex
f9d0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f  pression list co
f9e0: 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62 6c  ntaining variabl
f9f0: 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57 65  es.  **    *  We
fa00: 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74 72   are inside a tr
fa10: 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  igger.  **.  ** 
fa20: 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
fa30: 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20 74  ove are false, t
fa40: 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20 74  hen we can run t
fa50: 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e  his code just on
fa60: 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68 65  ce.  ** save the
fa70: 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72 65   results, and re
fa80: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65 73  use the same res
fa90: 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65 6e  ult on subsequen
faa0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20  t invocations.. 
fab0: 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72 48   */.  if( !ExprH
fac0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
fad0: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 20  , EP_VarSelect) 
fae0: 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e 61  ){.    jmpIfDyna
faf0: 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  mic = sqlite3Cod
fb00: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
fb10: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
fb20: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
fb30: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
fb40: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
fb50: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
fb60: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
fb70: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20  lite3MPrintf(.  
fb80: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
fb90: 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73 20  , "EXECUTE %s%s 
fba0: 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 6a 6d  SUBQUERY %d", jm
fbb0: 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
fbc0: 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
fbd0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
fbe0: 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
fbf0: 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73 65  "SCALAR", pParse
fc00: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 0a  ->iNextSelectId.
fc10: 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
fc20: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
fc30: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
fc40: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
fc50: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
fc60: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64  NAMIC);.  }.#end
fc70: 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  if..  switch( pE
fc80: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
fc90: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
fca0: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
fcb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
fcc0: 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74 68  * Affinity of th
fcd0: 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e LHS of the IN 
fce0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
fcf0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
fd00: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
fd10: 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  of OP_OpenEpheme
fd20: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
fd30: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
fd40: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
fd50: 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20  eft; /* the LHS 
fd60: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
fd70: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49  or */.      KeyI
fd80: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
fd90: 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69  0;      /* Key i
fda0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20  nformation */.. 
fdb0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
fdc0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
fdd0: 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20  ity(pLeft);..   
fde0: 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68     /* Whether th
fdf0: 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53  is is an 'x IN(S
fe00: 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e  ELECT...)' or an
fe10: 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74   'x IN(<exprlist
fe20: 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  >)'.      ** exp
fe30: 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61  ression it is ha
fe40: 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77  ndled the same w
fe50: 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72 61  ay.  An ephemera
fe60: 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  l table is .    
fe70: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
fe80: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
fe90: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
fea0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
feb0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
fec0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
fed0: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
fee0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
fef0: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
ff00: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
ff10: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
ff20: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
ff30: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
ff40: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
ff50: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
ff60: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
ff70: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
ff80: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
ff90: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
ffa0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
ffb0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
ffc0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
ffd0: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
ffe0: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
fff0: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
10000 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
10010 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
10020 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
10030 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
10040 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
10050 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
10060 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
10070 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
10080 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
10090 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
100a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
100b0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
100c0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
100d0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
100e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
100f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10100 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  l, pExpr->iTable
10110 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20 20  , !isRowid);.   
10120 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73     pKeyInfo = is
10130 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c 69  Rowid ? 0 : sqli
10140 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
10150 70 50 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31  pParse->db, 1, 1
10160 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45 78  );..      if( Ex
10170 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
10180 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
10190 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
101a0 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
101b0 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
101c0 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
101d0 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
101e0 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
101f0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
10200 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
10210 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
10220 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
10230 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
10240 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
10250 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
10260 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70 45  ct *pSelect = pE
10270 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
10280 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
10290 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 20  st dest;.       
102a0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
102b0 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  t;..        asse
102c0 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b 0a  rt( !isRowid );.
102d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
102e0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
102f0 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70 45  est, SRT_Set, pE
10300 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
10310 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53 64        dest.affSd
10320 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69 74  st = (u8)affinit
10330 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
10340 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c  t( (pExpr->iTabl
10350 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70  e&0x0000FFFF)==p
10360 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
10370 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74 2d          pSelect-
10380 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
10390 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
103a0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
103b0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
103c0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
103d0 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  se( pKeyInfo==0 
103e0 29 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20  ); /* Caused by 
103f0 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65  OOM in sqlite3Ke
10400 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a  yInfoAlloc() */.
10410 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
10420 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10430 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74  , pSelect, &dest
10440 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
10450 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
10460 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
10470 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
10480 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10490 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65      pEList = pSe
104a0 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
104b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
104c0 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20  eyInfo!=0 ); /* 
104d0 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65  OOM will cause e
104e0 78 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65  xit after sqlite
104f0 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20  3Select() */.   
10500 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
10510 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
10520 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
10530 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
10540 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
10550 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
10560 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29  teable(pKeyInfo)
10570 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   );.        pKey
10580 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
10590 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
105a0 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
105b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
105c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
10600 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
10610 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10620 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78   ALWAYS(pExpr->x
10630 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  .pList!=0) ){.  
10640 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
10650 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
10660 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
10670 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f  **.        ** Fo
10680 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
10690 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65  n, build an inde
106a0 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65  x key from the e
106b0 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20  valuation and.  
106c0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69        ** store i
106d0 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  t in the tempora
106e0 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78  ry table. If <ex
106f0 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  pr> is a column,
10700 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20   then use.      
10710 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e    ** that column
10720 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20  s affinity when 
10730 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b  building index k
10740 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  eys. If <expr> i
10750 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
10760 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e   a column, use n
10770 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e  umeric affinity.
10780 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10790 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
107a0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
107b0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
107c0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72  ist;.        str
107d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
107e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
107f0 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
10800 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ;..        if( !
10810 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
10820 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
10830 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
10840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10850 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
10860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
10870 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
10880 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
10890 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
108a0 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
108b0 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
108c0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
108d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
108e0 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eft);.        }.
108f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
10900 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
10910 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
10920 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
10930 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
10940 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10950 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20  );.        r2 = 
10960 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
10970 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
10980 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
10990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
109a0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
109b0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66  , r2);.        f
109c0 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  or(i=pList->nExp
109d0 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  r, pItem=pList->
109e0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
109f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
10a00 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74   Expr *pE2 = pIt
10a10 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
10a20 20 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49       int iValToI
10a30 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  ns;..          /
10a40 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
10a50 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  ion is not const
10a60 61 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  ant then we will
10a70 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
10a80 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
10a90 65 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20  e test that was 
10aa0 67 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20  generated above 
10ab0 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a  that makes sure.
10ac0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
10ad0 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63  s code only exec
10ae0 75 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61  utes once.  Beca
10af0 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f  use for a non-co
10b00 6e 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20  nstant.         
10b10 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77   ** expression w
10b20 65 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20  e need to rerun 
10b30 74 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74  this code each t
10b40 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ime..          *
10b50 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
10b60 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
10b70 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
10b80 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
10b90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
10ba0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
10bb0 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79  oNoop(v, jmpIfDy
10bc0 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20  namic);.        
10bd0 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
10be0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
10bf0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
10c00 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
10c10 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
10c20 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
10c30 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
10c40 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
10c50 77 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78  wid && sqlite3Ex
10c60 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c  prIsInteger(pE2,
10c70 20 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a   &iValToIns) ){.
10c80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10c90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10ca0 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70   OP_InsertInt, p
10cb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
10cc0 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20  , iValToIns);.  
10cd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
10ce0 20 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20             r3 = 
10cf0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
10d00 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
10d10 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  2, r1);.        
10d20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
10d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
10d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10d50 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
10d60 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20  nt, r3,.        
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10d90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10da0 29 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )+2);.          
10db0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
10dc0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
10dd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10de0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
10df0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
10e00 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20  , r2, r3);.     
10e10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10e30 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
10e40 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
10e50 72 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69  r3, 1, r2, &affi
10e60 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  nity, 1);.      
10e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
10e80 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
10e90 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
10ea0 33 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  3, 1);.         
10eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ec0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
10ed0 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
10ee0 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20  Table, r2);.    
10ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
10f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10f20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10f30 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
10f40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10f50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10f60 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r2);.      }.  
10f70 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
10f80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10f90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
10fa0 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a  v, addr, (void *
10fb0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
10fc0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a  YINFO);.      }.
10fd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10fe0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
10ff0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
11000 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
11010 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11020 20 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20   /* If this has 
11030 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
11040 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
11050 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
11060 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
11070 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
11080 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
11090 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
110a0 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
110b0 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
110c0 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49  l in iColumn.  I
110d0 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49  f this is an EXI
110e0 53 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20  STS, write.     
110f0 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30   ** an integer 0
11100 20 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72   (not exists) or
11110 20 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f   1 (exists) into
11120 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20   a memory cell. 
11130 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f       ** and reco
11140 72 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  rd that memory c
11150 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
11160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53        */.      S
11170 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
111a0 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f  tatement to enco
111b0 64 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  de */.      Sele
111c0 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c    /* How to deal
111f0 20 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73   with SELECt res
11200 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65  ult */..      te
11210 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
11220 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
11230 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11240 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
11250 4c 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73  LECT );.      as
11260 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
11270 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45  =TK_EXISTS || pE
11280 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
11290 43 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  CT );..      ass
112a0 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
112b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
112c0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
112d0 20 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d     pSel = pExpr-
112e0 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  >x.pSelect;.    
112f0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
11300 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30  estInit(&dest, 0
11310 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  , ++pParse->nMem
11320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
11330 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
11340 54 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73  T ){.        des
11350 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65  t.eDest = SRT_Me
11360 6d 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  m;.        dest.
11370 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44  iSdst = dest.iSD
11380 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 73 71  Parm;.        sq
11390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
113a0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64  v, OP_Null, 0, d
113b0 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
113c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
113d0 74 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71  t((v, "Init subq
113e0 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a  uery result"));.
113f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11400 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
11410 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20  = SRT_Exists;.  
11420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11430 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11440 74 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69  teger, 0, dest.i
11450 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
11460 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11470 20 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65   "Init EXISTS re
11480 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
11490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
114a0 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
114b0 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69  >db, pSel->pLimi
114c0 74 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  t);.      pSel->
114d0 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  pLimit = sqlite3
114e0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
114f0 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a  _INTEGER, 0, 0,.
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b    &sqlite3IntTok
11530 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70  ens[1]);.      p
11540 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  Sel->iLimit = 0;
11550 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c  .      pSel->sel
11560 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c  Flags &= ~SF_Mul
11570 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 69  tiValue;.      i
11580 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
11590 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
115a0 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
115b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
115c0 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
115d0 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
115e0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
115f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
11600 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
11610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11620 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75   }..  if( rHasNu
11630 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  llFlag ){.    sq
11640 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
11650 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54  lag(v, pExpr->iT
11660 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c  able, rHasNullFl
11670 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ag);.  }..  if( 
11680 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
11690 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
116a0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
116b0 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d  pIfDynamic);.  }
116c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
116d0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
116e0 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
116f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11700 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
11710 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
11720 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
11730 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
11740 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
11750 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
11760 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
11770 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
11780 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
11790 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
117a0 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
117b0 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
117c0 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  alar expression.
117d0 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
117e0 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69   side (RHS).** i
117f0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
11800 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65  ro or more value
11810 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  s.  The expressi
11820 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
11830 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74  e LHS is.** cont
11840 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
11850 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65   RHS.  The value
11860 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
11870 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e  on is unknown (N
11880 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c  ULL).** if the L
11890 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  HS is NULL or if
118a0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
118b0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
118c0 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
118d0 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  .** RHS contains
118e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
118f0 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
11900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
11910 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
11920 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66   jumps to destIf
11930 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
11940 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
11950 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
11960 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
11970 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
11980 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
11990 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
119a0 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
119b0 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
119c0 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
119d0 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
119e0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
119f0 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
11a00 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69  hrough..*/.stati
11a10 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
11a20 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
11a30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11a40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
11a50 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
11a60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11a70 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
11a80 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
11a90 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
11aa0 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
11ab0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11ac0 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
11ad0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
11ae0 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
11af0 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
11b00 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
11b10 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
11b20 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
11b30 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
11b40 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
11b50 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
11b60 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
11b70 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
11b80 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72  values */.  char
11b90 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
11ba0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
11bb0 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
11bc0 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
11bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
11be0 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
11bf0 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20  .  int r1;      
11c00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
11c10 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
11c20 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  er */.  Vdbe *v;
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c40 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
11c50 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
11c60 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
11c70 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72 20  he RHS.   After 
11c80 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20 74  this step, the t
11c90 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
11ca0 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61  .  ** pExpr->iTa
11cb0 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ble will contain
11cc0 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
11cd0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48  t make up the RH
11ce0 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  S..  */.  v = pP
11cf0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
11d00 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
11d10 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
11d20 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
11d30 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
11d40 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
11d50 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
11d60 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
11d70 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
11d80 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
11d90 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
11dc0 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
11dd0 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
11e00 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
11e10 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29   : &rRhsHasNull)
11e20 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
11e30 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
11e40 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
11e50 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
11e60 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20  results.  ** of 
11e70 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
11e80 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
11e90 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
11ea0 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
11eb0 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61    ** P4 of OP_Ma
11ec0 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  keRecord..  */. 
11ed0 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
11ee0 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
11ef0 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64  Expr);..  /* Cod
11f00 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
11f10 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
11f20 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20  r> IN (...)"..  
11f30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
11f40 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
11f50 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  );.  r1 = sqlite
11f60 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11f70 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
11f80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11f90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29  Expr->pLeft, r1)
11fa0 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  ;..  /* If sqlit
11fb0 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
11fc0 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20  did not find or 
11fd0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20  create an index 
11fe0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69  that is.  ** sui
11ff0 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61  table for evalua
12000 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72  ting the IN oper
12010 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75  ator, then evalu
12020 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a  ate using a.  **
12030 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
12040 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  parisons..  */. 
12050 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
12060 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
12070 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
12080 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
12090 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
120a0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
120b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
120c0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
120d0 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
120e0 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
120f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
12100 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
12110 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
12120 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
12130 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
12140 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
12150 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
12160 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
12170 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
12180 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
12190 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
121a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
121b0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
121c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
121d0 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
121e0 2c 20 72 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e  , r1, r1, regCkN
121f0 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
12200 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
12210 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
12220 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
12230 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
12240 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
12250 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
12260 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
12270 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
12280 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
12290 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
122a0 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
122b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
122c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
122d0 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
122e0 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
122f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12300 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
12310 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
12320 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
12330 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12340 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12350 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f  P_Eq, r1, labelO
12360 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
12390 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
123a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
123b0 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
123c0 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
123d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
123e0 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
123f0 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
12400 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
12410 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79  geP5(v, affinity
12420 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12430 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12440 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
12450 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20  IfFalse );.     
12460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12470 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
12480 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  1, destIfFalse, 
12490 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
124b0 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
124c0 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76  OLLSEQ); VdbeCov
124d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
124e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
124f0 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74  ngeP5(v, affinit
12500 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  y | SQLITE_JUMPI
12510 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
12520 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
12530 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
12540 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
12550 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
12560 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
12570 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12580 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
12590 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
125a0 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
125b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
125c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
125d0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
125e0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
125f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12600 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12610 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
12620 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12630 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12640 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65  regCkNull);.  }e
12650 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  lse{.  .    /* I
12660 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
12670 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
12680 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c  lt is either fal
12690 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e  se or NULL depen
126a0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77  ding.    ** on w
126b0 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20 69  hether the RHS i
126c0 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20  s empty or not, 
126d0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
126e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
126f0 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
12700 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  l(pExpr->pLeft) 
12710 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  ){.      if( des
12720 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
12730 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
12740 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
12750 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
12760 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65 20  where the false 
12770 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65  and NULL outcome
12780 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
12790 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
127a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
127b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
127c0 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66  Null, r1, destIf
127d0 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
127e0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
127f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
12800 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
12810 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12820 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56  _NotNull, r1); V
12830 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12850 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12860 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
12870 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
12880 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
12890 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
128a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
128b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
128c0 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
128d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
128e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
128f0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
12900 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
12910 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
12920 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
12930 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
12940 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
12950 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
12960 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20 2a  e b-tree.      *
12970 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
12980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12990 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64  MustBeInt, r1, d
129a0 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62  estIfFalse); Vdb
129b0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
129c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
129d0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
129e0 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54  xists, pExpr->iT
129f0 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
12a00 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  e, r1);.      Vd
12a10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
12a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a30 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
12a40 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
12a50 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
12a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
12a70 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12a80 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31   OP_Affinity, r1
12a90 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
12aa0 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20 20 20  y, 1);.  .      
12ab0 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
12ac0 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
12ad0 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
12ae0 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
12af0 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e     ** "x IN (...
12b00 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  )" expression mu
12b10 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f  st be either 0 o
12b20 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73  r NULL. If the s
12b30 65 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  et.      ** cont
12b40 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
12b50 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
12b60 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68  sult is 0. If th
12b70 65 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20  e set .      ** 
12b80 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
12b90 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
12ba0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
12bb0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  t of the.      *
12bc0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
12bd0 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  also NULL..     
12be0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
12bf0 28 20 64 65 73 74 49 66 46 61 6c 73 65 21 3d 64  ( destIfFalse!=d
12c00 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72 52 68  estIfNull || rRh
12c10 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  sHasNull==0 );. 
12c20 20 20 20 20 20 69 66 28 20 72 52 68 73 48 61 73       if( rRhsHas
12c30 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
12c40 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
12c50 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20  h runs if it is 
12c60 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65  known at compile
12c70 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52   time that the R
12c80 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  HS.        ** ca
12c90 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  nnot contain NUL
12ca0 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
12cb0 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
12cc0 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sult.        ** 
12cd0 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  of a "NOT NULL" 
12ce0 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68  constraint in th
12cf0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
12d00 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  a..        **.  
12d10 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
12d20 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
12d30 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
12d40 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
12d50 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
12d60 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
12d70 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 20  perator..       
12d80 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
12d90 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
12da0 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
12db0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12dc0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
12dd0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
12de0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e00 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
12e10 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
12e20 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
12e30 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
12e40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
12e50 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55  presence of a NU
12e60 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61  LL on the RHS ma
12e70 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65  kes a difference
12e80 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
12e90 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
12ea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12eb0 6e 74 20 6a 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt j1;.  .      
12ec0 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
12ed0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
12ee0 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
12ef0 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
12f00 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
12f10 68 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69  hen the answer i
12f20 73 20 54 52 55 45 20 74 68 65 20 70 72 65 73 65  s TRUE the prese
12f30 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
12f40 74 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20  the RHS does.   
12f50 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74       ** not matt
12f60 65 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  er.  If the LHS 
12f70 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
12f80 20 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65   in the RHS, the
12f90 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
12fa0 20 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20   answer is NULL 
12fb0 69 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61  if the RHS conta
12fc0 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68  ins NULLs and th
12fd0 65 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20  e answer is.    
12fe0 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
12ff0 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
13000 66 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  free..        */
13010 0a 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71  .        j1 = sq
13020 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
13030 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
13040 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
13050 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
13060 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
13070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13080 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13090 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48  OP_IsNull, rRhsH
130a0 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
130b0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ll);.        Vdb
130c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
130d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
130e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
130f0 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
13100 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
13110 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13120 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 7d  (v, j1);.      }
13130 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
13140 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13150 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13160 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
13170 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
13180 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13190 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
131a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
131b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
131c0 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
131d0 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
131e0 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
131f0 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
13200 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
13210 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
13220 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
13230 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
13240 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
13250 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
13260 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
13270 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
13280 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e  urn out;.}..#ifn
13290 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
132a0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
132b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
132c0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
132d0 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
132e0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
132f0 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
13300 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
13310 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
13320 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
13330 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
13340 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
13350 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
13360 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
13370 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
13380 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
13390 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
133a0 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
133b0 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
133c0 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
133d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
133e0 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
133f0 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
13400 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
13410 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
13420 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
13430 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
13440 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
13450 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  V;.    sqlite3At
13460 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  oF(z, &value, sq
13470 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
13480 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
13490 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c      assert( !sql
134a0 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29  ite3IsNaN(value)
134b0 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41   ); /* The new A
134c0 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e  toF never return
134d0 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28  s NaN */.    if(
134e0 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
134f0 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
13500 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
13510 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
13520 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
13530 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13540 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
13550 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  , zV, P4_REAL);.
13560 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
13570 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
13580 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
13590 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
135a0 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
135b0 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
135c0 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
135d0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
135e0 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
135f0 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
13600 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
13610 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13620 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
13630 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
13640 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
13650 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
13660 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
13670 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
13680 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
13690 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
136a0 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
136b0 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
136c0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
136d0 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
136e0 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
136f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13700 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
13710 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
13720 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
13730 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
13740 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
13750 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
13760 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
13770 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
13780 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
13790 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
137a0 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
137b0 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
137c0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
137d0 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  V;.      if( neg
137e0 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
137f0 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
13800 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
13810 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  }.      zV = dup
13820 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
13830 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
13840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13850 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
13860 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
13870 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
13880 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
13890 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
138a0 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
138b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
138c0 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
138d0 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
138e0 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
138f0 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69  "", z);.#else.#i
13900 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13910 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20  T_HEX_INTEGER.  
13920 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
13930 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c  strnicmp(z,"0x",
13940 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
13950 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13960 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69  (pParse, "hex li
13970 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25  teral too big: %
13980 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65  s", z);.      }e
13990 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
139a0 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
139b0 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
139c0 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
139d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
139e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
139f0 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
13a00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13a10 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
13a20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
13a30 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
13a40 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
13a50 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
13a60 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
13a70 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
13a80 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
13a90 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
13aa0 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
13ab0 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
13ac0 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
13ad0 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
13ae0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
13af0 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
13b00 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
13b10 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
13b20 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
13b30 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
13b40 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
13b50 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
13b60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13b70 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
13b80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
13b90 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
13ba0 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
13bb0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
13bc0 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
13bd0 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
13be0 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Cache *p;..  /* 
13bf0 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20  Unless an error 
13c00 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65  has occurred, re
13c10 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
13c20 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
13c30 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ve. */.  assert(
13c40 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73   iReg>0 || pPars
13c50 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
13c60 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
13c70 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
13c80 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f   iCol>=-1 && iCo
13c90 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46  l<32768 );  /* F
13ca0 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  inite column num
13cb0 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  bers */..  /* Th
13cc0 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  e SQLITE_ColumnC
13cd0 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c  ache flag disabl
13ce0 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  es the column ca
13cf0 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  che.  This is us
13d00 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74  ed.  ** for test
13d10 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65  ing only - to ve
13d20 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65  rify that SQLite
13d30 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65   always gets the
13d40 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a   same answer.  *
13d50 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f  * with and witho
13d60 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ut the column ca
13d70 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
13d80 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
13d90 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
13da0 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
13db0 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  che) ) return;..
13dc0 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
13dd0 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
13de0 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
13df0 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77   Actually, the w
13e00 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ay the column ca
13e10 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  che is currently
13e20 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75   used, we are gu
13e30 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68  aranteed.  ** th
13e40 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69  at the object wi
13e50 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79  ll never already
13e60 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56   be in cache.  V
13e70 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61  erify this guara
13e80 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ntee..  */.#ifnd
13e90 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28  ef NDEBUG.  for(
13ea0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13eb0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13ec0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13ed0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, p++){.    as
13ee0 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
13ef0 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
13f00 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
13f10 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
13f20 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
13f30 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
13f40 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
13f50 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
13f60 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
13f70 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
13f80 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
13f90 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
13fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
13fb0 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
13fc0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
13fd0 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
13fe0 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
13ff0 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
14000 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
14010 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
14020 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
14030 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
14040 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
14050 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
14060 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
14070 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
14080 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
14090 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
140a0 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
140b0 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
140c0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
140d0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
140e0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
140f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14100 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
14110 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
14120 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
14130 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
14140 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
14150 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
14160 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
14170 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
14180 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
14190 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
141a0 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
141b0 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
141c0 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
141d0 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
141e0 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
141f0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
14200 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
14210 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
14220 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
14230 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
14240 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
14250 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
14260 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
14270 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
14280 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
14290 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
142a0 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
142b0 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
142c0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
142d0 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
142e0 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
142f0 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
14300 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69  .  int iLast = i
14310 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a  Reg + nReg - 1;.
14320 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
14330 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
14340 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
14350 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
14360 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14370 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
14380 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
14390 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72  if( r>=iReg && r
143a0 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
143b0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
143c0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
143d0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
143e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
143f0 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
14400 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
14410 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
14420 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
14430 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
14440 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
14450 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
14460 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
14470 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
14480 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
14490 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
144a0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
144b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
144c0 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
144d0 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66  eLevel++;.#ifdef
144e0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
144f0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
14500 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
14510 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
14520 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53  .    printf("PUS
14530 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72  H to %d\n", pPar
14540 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
14550 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
14560 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f  /*.** Remove fro
14570 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
14580 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  he any entries t
14590 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73  hat were added s
145a0 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20  ince the.** the 
145b0 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33  previous sqlite3
145c0 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70  ExprCachePush op
145d0 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  eration.  In oth
145e0 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
145f0 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74  e.** the cache t
14600 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
14610 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20  as in prior the 
14620 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68  most recent Push
14630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14640 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61  3ExprCachePop(Pa
14650 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14660 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14670 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
14680 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14690 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29  iCacheLevel>=1 )
146a0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
146b0 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65  heLevel--;.#ifde
146c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
146d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
146e0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
146f0 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
14700 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f  {.    printf("PO
14710 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  P  to %d\n", pPa
14720 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14730 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14740 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
14750 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
14760 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14770 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14780 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
14790 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
147a0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
147b0 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
147c0 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
147d0 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
147e0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
147f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
14800 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
14810 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
14820 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
14830 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
14840 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
14850 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
14860 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
14870 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
14880 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
14890 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
148a0 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
148b0 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
148c0 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
148d0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
148e0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
148f0 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
14900 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14910 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
14920 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
14930 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
14940 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
14950 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
14960 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14970 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
14980 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
14990 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
149a0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
149b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
149c0 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
149d0 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
149e0 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
149f0 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
14a00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
14a10 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
14a20 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
14a30 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
14a40 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
14a50 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
14a60 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
14a70 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
14a80 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
14a90 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
14aa0 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
14ab0 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
14ac0 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
14ad0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
14ae0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
14af0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
14b00 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
14b10 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
14b20 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
14b30 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
14b40 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
14b50 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43  r */.){.  if( iC
14b60 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
14b70 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
14b80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b90 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
14ba0 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
14bb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
14bc0 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
14bd0 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
14be0 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
14bf0 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43  ;.    int x = iC
14c00 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73  ol;.    if( !Has
14c10 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
14c20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
14c30 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71  ColumnOfIndex(sq
14c40 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
14c50 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c  ndex(pTab), iCol
14c60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14c80 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78  , op, iTabCur, x
14c90 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
14ca0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
14cb0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
14cc0 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
14cd0 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
14ce0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
14cf0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
14d00 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
14d10 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
14d20 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
14d30 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
14d40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
14d50 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
14d60 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
14d70 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
14d80 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
14d90 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
14da0 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
14db0 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
14dc0 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
14dd0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
14de0 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
14df0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
14e00 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
14e10 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
14e20 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
14e30 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
14e40 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
14e50 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
14e60 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
14e70 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
14e80 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
14e90 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
14ea0 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
14eb0 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
14ec0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
14ed0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
14ee0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
14ef0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
14f00 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
14f10 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
14f20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
14f30 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
14f40 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
14f50 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
14f60 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
14f70 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
14f80 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
14f90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
14fa0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
14fb0 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
14fc0 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
14fd0 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
14fe0 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f  for OP_Column */
14ff0 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
15000 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
15010 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
15020 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
15030 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
15040 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
15050 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
15060 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
15070 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
15080 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
15090 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
150a0 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
150b0 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
150c0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
150d0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
150e0 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
150f0 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
15100 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
15110 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
15120 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
15130 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
15140 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
15150 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
15160 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
15170 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
15180 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
15190 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
151a0 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
151b0 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
151c0 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
151d0 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
151e0 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
151f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
15200 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
15210 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
15220 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
15230 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
15240 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
15250 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
15260 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
15270 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66  olCache *p;..#if
15280 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
15290 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
152a0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
152b0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
152c0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45  .    printf("CLE
152d0 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  AR\n");.  }.#end
152e0 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
152f0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
15300 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
15310 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
15320 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
15330 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
15340 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
15350 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
15360 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
15370 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
15380 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
15390 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
153a0 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
153b0 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
153c0 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
153d0 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
153e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
153f0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15400 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
15410 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
15420 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
15430 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15440 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
15450 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b  iStart, iCount);
15460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15470 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
15480 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
15490 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
154a0 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
154b0 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
154c0 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65  nReg-1. Keep the
154d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
154e0 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
154f0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
15500 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
15510 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
15520 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
15530 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46  g){.  assert( iF
15540 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c  rom>=iTo+nReg ||
15550 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f   iFrom+nReg<=iTo
15560 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
15570 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e  eAddOp3(pParse->
15580 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
15590 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67  iFrom, iTo, nReg
155a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
155b0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
155c0 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29  se, iFrom, nReg)
155d0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
155e0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
155f0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
15600 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a  _COVERAGE_TEST).
15610 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
15620 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
15630 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
15640 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
15650 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
15660 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
15670 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a  column cache..**
15680 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15690 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
156a0 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73  assert() and tes
156b0 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f  tcase() macros o
156c0 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  nly.** and does 
156d0 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20  not appear in a 
156e0 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f  normal build..*/
156f0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
15700 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
15710 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15720 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
15730 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
15740 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
15750 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
15760 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
15770 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
15780 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
15790 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
157a0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
157b0 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
157c0 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20  o ) return 1;   
157d0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d   /*NO_TEST*/.  }
157e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
157f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15800 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f  DEBUG || SQLITE_
15810 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
15820 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
15830 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
15840 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
15850 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  TER.*/.static vo
15860 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  id exprToRegiste
15870 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
15880 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d  Reg){.  p->op2 =
15890 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20   p->op;.  p->op 
158a0 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
158b0 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65   p->iTable = iRe
158c0 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72  g;.  ExprClearPr
158d0 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69  operty(p, EP_Ski
158e0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  p);.}../*.** Gen
158f0 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
15900 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
15910 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
15920 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
15930 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
15940 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
15950 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
15960 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
15970 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
15980 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
15990 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
159a0 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
159b0 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
159c0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
159d0 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
159e0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
159f0 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
15a00 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
15a10 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
15a20 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
15a30 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
15a40 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
15a50 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
15a60 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
15a70 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
15a80 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
15a90 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
15aa0 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
15ab0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
15ac0 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
15ad0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
15ae0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
15af0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15b00 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
15b10 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
15b20 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
15b30 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
15b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15b50 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
15b60 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
15b70 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
15b80 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
15b90 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
15ba0 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
15bb0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
15bc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
15bd0 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
15be0 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
15bf0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
15c00 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
15c10 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
15c20 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
15c30 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
15c40 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
15c50 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
15c60 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
15c70 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
15c80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15c90 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
15ca0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15cb0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  on */.  Expr tem
15cc0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
15cd0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
15ce0 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
15cf0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  /..  assert( tar
15d00 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
15d10 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
15d20 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
15d30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
15d40 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
15d50 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
15d60 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
15d70 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
15d80 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
15d90 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
15da0 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
15db0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
15dc0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
15dd0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
15de0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
15df0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
15e00 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
15e10 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
15e20 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
15e30 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
15e40 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
15e50 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
15e60 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
15e70 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
15e80 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
15e90 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Reg = pCol->iMem
15ea0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15ec0 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
15ed0 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
15ee0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15ef0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15f00 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
15f10 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
15f40 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
15f50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15f60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15f70 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
15f80 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
15f90 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
15fa0 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
15fb0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
15fc0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
15fd0 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54  iTab = pExpr->iT
15fe0 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20  able;.      if( 
15ff0 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
16000 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b    if( pParse->ck
16010 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Base>0 ){.      
16020 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
16030 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
16040 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
16050 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
16060 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
16070 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
16080 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
16090 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
160a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
160b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
160c0 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20      /* Deleting 
160d0 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69  from a partial i
160e0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
160f0 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
16100 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20  >iPartIdxTab;.  
16110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16120 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
16130 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
16140 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
16150 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
16180 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
16190 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
161c0 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p2);.      break
161d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
161e0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
161f0 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
16200 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
16210 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
16220 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16230 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16240 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
16250 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
16260 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
16270 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
16280 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16290 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
162a0 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
162b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
162c0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
162d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
162e0 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
162f0 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
16300 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16310 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16320 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16340 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16350 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
16360 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
16370 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
16380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16390 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
163a0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
163b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
163c0 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
163d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
163e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
163f0 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
16400 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
16410 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
16420 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
16430 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
16440 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
16450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
16460 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16470 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
16480 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
16490 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
164a0 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
164b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
164c0 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
164d0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
164e0 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
164f0 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
16500 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
16510 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
16520 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
16530 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
16540 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
16550 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
16560 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
16570 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
16580 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
16590 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
165a0 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
165b0 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
165c0 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
165d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
165e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
165f0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
16600 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16610 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16620 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16630 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
16640 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
16650 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
16660 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16670 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
16680 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16690 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
166a0 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
166b0 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
166c0 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
166d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
166e0 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
166f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16700 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
16710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
16720 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
16730 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
16740 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
16750 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
16760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16770 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
16780 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
16790 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
167a0 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
167b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
167c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
167d0 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
167e0 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
167f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
16800 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16810 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
16820 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
16830 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16840 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
16850 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
16860 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16870 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
16880 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
16890 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
168a0 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
168b0 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
168c0 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
168d0 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
168e0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
168f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16900 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
16910 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
16920 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
16930 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
16940 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16960 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
16970 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
16980 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
16990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
169a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
169b0 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
169c0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
169e0 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
169f0 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
16a00 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73  , 0));.      tes
16a10 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
16a20 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
16a30 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
16a40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
16a50 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
16a60 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
16a70 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
16a80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16a90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16aa0 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
16ab0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
16ac0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
16ad0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
16ae0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
16af0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
16b00 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
16b10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
16b20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16b30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16b40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
16b50 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16b60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16b70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
16b80 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
16b90 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
16ba0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
16bb0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
16bc0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
16be0 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
16bf0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
16c00 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
16c10 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
16c20 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
16c30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
16c40 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
16c50 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
16c60 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
16c70 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
16c80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
16c90 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
16ca0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
16cb0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
16cc0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
16cd0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16ce0 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
16cf0 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
16d00 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16d10 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
16d20 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16d30 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
16d40 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
16d50 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16d60 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
16d70 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
16d80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16d90 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
16da0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
16db0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16dc0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
16dd0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16de0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16df0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16e00 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16e10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16e20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
16e30 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
16e40 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
16e50 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
16e60 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16e70 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
16e80 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
16e90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16ea0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
16eb0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
16ec0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
16ed0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16ee0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
16ef0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
16f00 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
16f10 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
16f20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
16f30 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
16f40 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16f50 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
16f60 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
16f70 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
16f80 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
16f90 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49  E_STOREP2 | SQLI
16fa0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
16fb0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16fc0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
16fd0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16fe0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
16ff0 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
17000 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
17010 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17020 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
17030 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17040 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17050 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
17060 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
17070 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
17080 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
17090 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
170a0 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
170b0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
170c0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
170d0 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
170e0 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
170f0 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
17100 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
17110 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
17120 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
17130 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
17140 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
17150 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17160 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
17170 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
17180 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
17190 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
171a0 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
171b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
171c0 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
171d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
171e0 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
171f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17200 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
17210 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
17220 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
17230 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
17240 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
17250 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
17260 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17270 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
17280 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
17290 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
172a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
172b0 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
172c0 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
172d0 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
172e0 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
172f0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
17300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17310 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
17320 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
17330 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
17340 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
17350 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
17360 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
17370 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17380 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
17390 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
173a0 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
173b0 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
173c0 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
173d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
173e0 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
173f0 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
17400 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17410 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
17420 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17430 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17440 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
17450 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17460 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17470 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17480 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17490 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
174a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
174b0 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
174c0 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
174d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
174e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
174f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17500 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17510 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17520 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
17530 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
17540 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
17550 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
17560 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
17570 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
17580 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
17590 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
175a0 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
175b0 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
175c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
175d0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
175e0 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
175f0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
17600 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
17610 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17620 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17630 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
17640 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
17650 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
17660 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
17670 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
17680 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
17690 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
176a0 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
176b0 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
176c0 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
176d0 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
176e0 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
176f0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
17700 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17710 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
17720 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17730 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
17740 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17750 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17760 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
17770 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17780 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17790 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
177a0 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
177b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
177c0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
177d0 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
177e0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
177f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17800 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
17810 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
17820 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
17830 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
17840 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
17850 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
17860 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
17870 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
17880 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
17890 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
178a0 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
178b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
178c0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
178d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
178e0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
178f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17900 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
17910 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
17920 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17930 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
17940 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
17950 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17960 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
17970 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
17980 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
17990 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
179a0 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
179b0 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
179c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
179d0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
179e0 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
179f0 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
17a00 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
17a10 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
17a20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17a30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
17a40 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
17a50 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
17a60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17a70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17a80 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
17a90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17aa0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17ab0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
17ac0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17ad0 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
17ae0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
17af0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
17b00 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
17b10 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
17b20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
17b30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17b40 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17b50 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
17b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17b80 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
17b90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17ba0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
17bb0 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
17bc0 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
17bd0 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
17be0 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
17bf0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17c00 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17c10 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
17c20 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
17c30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17c40 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
17c50 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
17c60 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
17c70 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
17c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
17c90 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
17ca0 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
17cb0 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
17cc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17cd0 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
17ce0 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
17cf0 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
17d00 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
17d10 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
17d20 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
17d30 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
17d40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17d50 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
17d60 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
17d70 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
17d80 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
17d90 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
17da0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
17db0 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
17dc0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
17dd0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
17de0 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
17df0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
17e00 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
17e10 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
17e20 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
17e30 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
17e40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
17e50 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
17e60 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
17e70 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
17e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e90 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17ea0 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
17eb0 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
17ec0 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
17ed0 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
17ee0 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
17ef0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
17f00 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
17f10 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
17f20 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
17f30 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
17f40 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17f50 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
17f60 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
17f70 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17f80 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
17f90 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
17fa0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
17fb0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
17fc0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17fe0 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
17ff0 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
18000 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18010 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
18020 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
18030 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
18040 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
18050 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
18060 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18070 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
18080 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
18090 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
180a0 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
180b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
180c0 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
180d0 3e 78 46 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20  >xFunc==0 ){.   
180e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
180f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
18100 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
18110 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49  %.*s()", nId, zI
18120 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
18130 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
18140 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
18150 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
18160 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
18170 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
18180 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
18190 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
181a0 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
181b0 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
181c0 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
181d0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
181e0 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
181f0 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
18200 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
18210 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
18220 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
18230 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
18240 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
18250 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
18260 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18270 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
18280 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
18290 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
182a0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
182b0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
182c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
182d0 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
182e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
182f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18300 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
18310 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
18320 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
18330 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18340 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18350 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
18360 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
18370 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
18380 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18390 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
183a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
183b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
183c0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
183d0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
183e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
183f0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
18400 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18410 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18420 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18430 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
18440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18450 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
18460 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75  he UNLIKELY() fu
18470 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
18480 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  p.  The result i
18490 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  s the value.    
184a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
184b0 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
184c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
184d0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
184e0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
184f0 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  IKELY ){.       
18500 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
18510 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 );.        sql
18520 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
18530 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
18540 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
18550 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18560 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18570 2a 20 54 68 65 20 41 46 46 49 4e 49 54 59 28 29  * The AFFINITY()
18580 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
18590 73 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  s the type affin
185a0 69 74 79 20 6f 66 20 69 74 73 20 61 72 67 75 6d  ity of its argum
185b0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ent..      ** Th
185c0 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
185d0 69 73 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  is a compile-tim
185e0 65 20 76 61 6c 75 65 2c 20 73 6f 20 77 65 20 6d  e value, so we m
185f0 69 67 68 74 20 61 73 20 77 65 6c 6c 0a 20 20 20  ight as well.   
18600 20 20 20 2a 2a 20 63 6f 64 65 20 69 74 20 64 69     ** code it di
18610 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  rectly..      */
18620 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
18630 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
18640 49 54 45 5f 46 55 4e 43 5f 41 46 46 49 4e 49 54  ITE_FUNC_AFFINIT
18650 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  Y ){.        int
18660 20 61 66 66 3b 0a 20 20 20 20 20 20 20 20 73 74   aff;.        st
18670 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
18680 2a 63 6f 6e 73 74 20 61 7a 41 66 66 4e 61 6d 65  *const azAffName
18690 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
186a0 20 20 22 22 2c 20 22 42 4c 4f 42 22 2c 20 22 54    "", "BLOB", "T
186b0 45 58 54 22 2c 20 22 4e 55 4d 45 52 49 43 22 2c  EXT", "NUMERIC",
186c0 20 22 49 4e 54 45 47 45 52 22 2c 20 22 52 45 41   "INTEGER", "REA
186d0 4c 22 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20  L".        };.  
186e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
186f0 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
18700 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
18710 78 70 72 41 66 66 69 6e 69 74 79 28 70 46 61 72  xprAffinity(pFar
18720 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  g->a[0].pExpr);.
18730 20 20 20 20 20 20 20 20 69 66 28 20 61 66 66 20          if( aff 
18740 29 20 61 66 66 20 2d 3d 20 53 51 4c 49 54 45 5f  ) aff -= SQLITE_
18750 41 46 46 5f 42 4c 4f 42 20 2d 20 31 3b 0a 20 20  AFF_BLOB - 1;.  
18760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18770 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74  eAddOp4(v, OP_St
18780 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74  ring8, 0, target
18790 2c 20 30 2c 20 61 7a 41 66 66 4e 61 6d 65 5b 61  , 0, azAffName[a
187a0 66 66 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ff], 0);.       
187b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
187c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
187d0 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
187e0 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
187f0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
18800 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
18810 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
18820 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
18830 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20  e( i==31 );.    
18840 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
18850 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b  |= MASKBIT32(i);
18860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18870 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
18880 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
18890 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
188a0 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
188b0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
188c0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
188d0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
188e0 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
188f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18900 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
18910 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rg ){.        if
18920 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20  ( constMask ){. 
18930 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50           r1 = pP
18940 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
18950 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
18960 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20  nMem += nFarg;. 
18970 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18980 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
18990 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
189a0 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
189b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
189c0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74      /* For lengt
189d0 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
189e0 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
189f0 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e  a column argumen
18a00 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  t,.        ** se
18a10 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  t the P5 paramet
18a20 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c  er to the OP_Col
18a30 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  umn opcode to OP
18a40 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20  FLAG_LENGTHARG. 
18a50 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46         ** or OPF
18a60 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65  LAG_TYPEOFARG re
18a70 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61  spectively, to a
18a80 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
18a90 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a   data.        **
18aa0 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   loading..      
18ab0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
18ac0 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
18ad0 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
18ae0 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
18af0 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
18b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
18b10 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
18b20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
18b30 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
18b40 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
18b50 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
18b60 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
18b70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
18b80 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
18b90 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
18ba0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
18bb0 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
18bc0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
18bd0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
18be0 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
18bf0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
18c00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
18c10 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
18c20 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
18c30 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
18c40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
18c50 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  se( pDef->funcFl
18c60 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e  ags & OPFLAG_LEN
18c70 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
18c80 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30        pFarg->a[0
18c90 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a  ].pExpr->op2 = .
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
18cc0 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  s & (OPFLAG_LENG
18cd0 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
18ce0 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
18cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
18d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18d10 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
18d20 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63  rse);     /* Tic
18d30 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
18d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
18d50 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
18d60 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  ist(pParse, pFar
18d70 67 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  g, r1,.         
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
18da0 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
18db0 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
18dc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18dd0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
18de0 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
18df0 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
18e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18e10 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20       r1 = 0;.   
18e20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
18e30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18e40 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
18e50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
18e60 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
18e70 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
18e80 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
18e90 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
18ea0 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
18eb0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
18ec0 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
18ed0 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
18ee0 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
18ef0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
18f00 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
18f10 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
18f20 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
18f30 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
18f40 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
18f50 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
18f60 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
18f70 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
18f80 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
18f90 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
18fa0 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
18fb0 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
18fc0 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
18fd0 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
18fe0 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
18ff0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19000 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
19010 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
19020 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
19030 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
19040 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
19050 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
19060 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
19070 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
19080 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
19090 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
190a0 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
190b0 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
190c0 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
190d0 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
190e0 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e        if( nFarg>
190f0 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c  =2 && (pExpr->fl
19100 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75  ags & EP_InfixFu
19110 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
19120 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
19130 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
19140 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
19150 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
19160 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
19170 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
19180 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
19190 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
191a0 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
191b0 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
191c0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
191d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
191e0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
191f0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
19200 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
19210 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
19220 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
19230 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
19240 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
19250 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
19260 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
19270 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
19280 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
192a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
192b0 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
192c0 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
192d0 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
192f0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
19300 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
19310 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
19320 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
19330 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
19340 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
19350 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
19360 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19370 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
19380 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
19390 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
193a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
193b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
193c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
193d0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
193e0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
193f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
19400 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
19410 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
19420 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
19430 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
19440 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
19450 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
19460 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
19470 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19480 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
19490 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
194a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
194b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
194c0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
194d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
194e0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
194f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19500 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
19510 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
19520 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19530 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
19540 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
19550 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
19560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19570 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
19580 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
19590 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
195a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
195b0 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
195c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
195d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
195e0 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  Imm, target, 0);
195f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19600 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19610 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
19620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19630 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19640 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19650 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
19660 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
19670 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
19680 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
19690 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
196a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
196b0 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
196c0 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
196d0 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
196e0 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
196f0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
19700 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
19710 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
19720 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
19730 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
19740 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
19750 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
19760 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
19770 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
19780 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
19790 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
197a0 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
197b0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20  r->x.pList->a;. 
197c0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
197d0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
197e0 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r;..      r1 = s
197f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
19800 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  mp(pParse, pLeft
19810 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
19820 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
19830 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
19840 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
19850 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
19860 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19870 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
19880 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
19890 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20  ==0 );.      r3 
198a0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
198b0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
198c0 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47     r4 = sqlite3G
198d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
198e0 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
198f0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
19900 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
19910 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19920 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c       r1, r2, r3,
19930 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
19940 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ;  VdbeCoverage(
19950 76 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  v);.      pLItem
19960 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
19970 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
19980 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
19990 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
199a0 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
199b0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
199c0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
199d0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
199e0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
199f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19a00 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
19a10 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
19a20 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
19a30 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
19a40 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
19a50 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 56 64  OREP2);.      Vd
19a60 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
19a70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19a80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64  AddOp3(v, OP_And
19a90 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74  , r3, r4, target
19aa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19ab0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19ac0 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20  Parse, r3);.    
19ad0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19ae0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19af0 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r4);.      break
19b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19b10 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
19b20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
19b30 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
19b40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19b50 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
19b60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
19b70 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
19b80 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
19b90 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
19ba0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
19bb0 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
19bc0 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
19bd0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
19be0 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
19bf0 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
19c00 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
19c10 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
19c20 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
19c30 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
19c40 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
19c50 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
19c60 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
19c70 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
19c80 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
19c90 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
19ca0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
19cb0 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
19cc0 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
19cd0 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
19ce0 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
19cf0 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
19d00 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
19d10 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
19d20 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
19d30 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
19d40 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
19d50 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
19d60 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
19d70 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
19d80 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
19d90 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
19da0 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
19db0 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
19dc0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
19dd0 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
19de0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
19df0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
19e00 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
19e10 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
19e20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
19e30 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
19e40 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
19e50 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
19e60 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
19e70 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19e80 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
19e90 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
19ea0 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
19eb0 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
19ec0 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
19ed0 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
19ee0 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
19ef0 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
19f00 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
19f10 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
19f20 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
19f30 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
19f40 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
19f50 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
19f60 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
19f70 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
19f80 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
19f90 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
19fa0 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
19fb0 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
19fc0 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
19fd0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
19fe0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
19ff0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1a000 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
1a010 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
1a020 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
1a030 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
1a040 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
1a050 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
1a060 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
1a070 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
1a080 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
1a090 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
1a0a0 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
1a0b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a0c0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
1a0d0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1a0e0 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
1a0f0 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
1a100 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
1a110 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
1a120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1a130 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
1a140 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
1a150 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
1a160 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
1a170 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
1a180 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
1a190 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
1a1a0 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
1a1b0 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
1a1c0 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
1a1d0 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
1a1e0 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
1a1f0 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
1a200 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
1a210 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a220 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
1a230 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
1a240 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
1a250 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
1a260 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
1a270 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
1a280 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
1a290 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
1a2a0 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
1a2b0 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
1a2c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
1a2d0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
1a2e0 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
1a2f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a300 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1a310 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
1a320 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
1a330 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
1a340 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
1a350 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
1a360 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
1a370 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
1a380 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
1a390 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
1a3a0 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
1a3b0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1a3c0 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
1a3d0 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
1a3e0 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
1a3f0 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
1a400 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
1a410 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
1a420 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
1a430 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1a440 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
1a450 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
1a460 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
1a470 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
1a480 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
1a490 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
1a4a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a4b0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
1a4c0 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
1a4d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1a4e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a4f0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1a500 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
1a510 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
1a520 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1a530 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1a540 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1a550 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1a560 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
1a570 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1a580 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
1a590 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
1a5a0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
1a5b0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1a5c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
1a5d0 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
1a5e0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
1a5f0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1a600 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
1a610 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
1a620 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
1a630 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
1a640 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
1a650 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
1a660 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1a670 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1a680 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
1a690 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
1a6a0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
1a6b0 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  in the last elem
1a6c0 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e  ent of pExpr->x.
1a6d0 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e  pList if pExpr->
1a6e0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69  x.pList->nExpr i
1a6f0 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54  s.    ** odd.  T
1a700 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
1a710 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e  ional.  If the n
1a720 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1a730 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20  s in x.pList.   
1a740 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65   ** is even, the
1a750 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61  n Y is omitted a
1a760 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73  nd the "otherwis
1a770 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  e" result is NUL
1a780 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
1a790 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
1a7a0 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
1a7b0 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
1a7c0 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
1a7d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
1a7e0 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
1a7f0 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
1a800 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
1a810 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
1a820 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
1a830 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
1a840 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
1a850 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
1a860 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
1a870 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
1a880 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
1a890 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
1a8a0 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
1a8b0 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
1a8e0 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
1a8f0 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
1a900 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a920 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
1a930 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
1a940 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1a950 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
1a960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1a970 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
1a980 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1a990 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1a9c0 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
1a9d0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a9f0 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
1aa00 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
1aa10 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1aa20 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
1aa30 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
1aa40 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
1aa50 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
1aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa70 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
1aa80 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1aa90 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
1aac0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
1aad0 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaf0 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
1ab00 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
1ab10 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
1ab20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
1ab30 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
1ab40 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1ab50 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
1ab60 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1ab70 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1ab80 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
1ab90 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
1aba0 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
1abb0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1abc0 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
1abd0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1abe0 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
1abf0 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
1ac00 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
1ac10 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
1ac20 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
1ac30 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1ac40 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1ac50 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
1ac60 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
1ac70 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70        tempX = *p
1ac80 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
1ac90 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
1aca0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1acb0 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1acc0 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33  (&tempX, sqlite3
1acd0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ace0 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
1acf0 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
1ad00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ad10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ==0 );.        o
1ad20 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
1ad30 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
1ad40 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
1ad50 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
1ad60 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
1ad70 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
1ad80 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
1ad90 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
1ada0 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
1adb0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
1adc0 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
1add0 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
1ade0 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
1adf0 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
1ae00 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
1ae10 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
1ae20 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
1ae30 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
1ae40 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
1ae50 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
1ae60 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
1ae70 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
1ae80 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
1ae90 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1aea0 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
1aeb0 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
1aec0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1aed0 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1aee0 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
1aef0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1af00 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
1af10 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
1af20 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
1af30 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
1af40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1af50 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
1af60 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
1af70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1af80 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
1af90 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1afa0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1afb0 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
1afc0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1afd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1afe0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1aff0 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
1b000 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
1b010 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1b020 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
1b030 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
1b040 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1b050 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b060 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1b070 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
1b080 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1b090 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b0a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b0b0 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c 61  P_Goto, 0, endLa
1b0c0 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  bel);.        sq
1b0d0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1b0e0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1b0f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1b100 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e 65  solveLabel(v, ne
1b110 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20 7d  xtCase);.      }
1b120 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78 70  .      if( (nExp
1b130 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  r&1)!=0 ){.     
1b140 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b150 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1b160 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b170 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b180 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70 72   pEList->a[nExpr
1b190 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  -1].pExpr, targe
1b1a0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1b1b0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1b1c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
1b1d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1b1e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b1f0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74  v, OP_Null, 0, t
1b200 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1b210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1b220 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1b230 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
1b240 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
1b250 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1b260 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65 6c  vel==iCacheLevel
1b270 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1b280 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1b290 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a  l(v, endLabel);.
1b2a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b2b0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1b2c0 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1b2d0 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
1b2e0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1b2f0 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1b300 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 0a  y==OE_Rollback .
1b310 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1b320 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b330 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20 20  E_Abort.        
1b340 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
1b350 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a 20  inity==OE_Fail. 
1b360 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
1b370 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1b380 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29 3b  _Ignore.      );
1b390 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
1b3a0 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
1b3b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1b3c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1b3d0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1b3e0 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
1b3f0 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
1b400 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
1b410 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
1b420 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1b430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b440 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  if( pExpr->affin
1b450 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ity==OE_Abort ){
1b460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b470 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
1b480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b490 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1b4a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1b4b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
1b4c0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1b4d0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49 67  >affinity==OE_Ig
1b4e0 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
1b4f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b500 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  4(.            v
1b510 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
1b520 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  E_OK, OE_Ignore,
1b530 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
1b540 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  ken,0);.        
1b550 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b570 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c        sqlite3Hal
1b580 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
1b590 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
1b5a0 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a 20  RAINT_TRIGGER,. 
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1b5d0 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70 45  pr->affinity, pE
1b5e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
1b5f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
1b600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b610 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  }.#endif.  }.  s
1b620 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b630 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1b640 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
1b650 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1b660 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
1b670 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52 65  );.  return inRe
1b680 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63 74  g;.}../*.** Fact
1b690 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65 20  or out the code 
1b6a0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1b6b0 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74 69  ression to initi
1b6c0 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e 0a  alization time..
1b6d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1b6e0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a 20  xprCodeAtInit(. 
1b6f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1b700 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1b710 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1b720 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
1b730 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
1b740 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65 20  o code when the 
1b750 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65 73  VDBE initializes
1b760 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73   */.  int regDes
1b770 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  t,      /* Store
1b780 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
1b790 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  is register */. 
1b7a0 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20 20   u8 reusable    
1b7b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1b7c0 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
1b7d0 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b 0a   reusable */.){.
1b7e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a 20    ExprList *p;. 
1b7f0 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46 61   assert( ConstFa
1b800 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1b810 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
1b820 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70 45  pConstExpr;.  pE
1b830 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1b840 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
1b850 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70 20   pExpr, 0);.  p 
1b860 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1b870 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1b880 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  p, pExpr);.  if(
1b890 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75 63   p ){.     struc
1b8a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1b8b0 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70  *pItem = &p->a[p
1b8c0 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
1b8d0 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74   pItem->u.iConst
1b8e0 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65 73  ExprReg = regDes
1b8f0 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  t;.     pItem->r
1b900 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61 62  eusable = reusab
1b910 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  le;.  }.  pParse
1b920 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20 70  ->pConstExpr = p
1b930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1b940 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c  ate code to eval
1b950 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  uate an expressi
1b960 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  on and store the
1b970 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f   results.** into
1b980 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52 65   a register.  Re
1b990 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65  turn the registe
1b9a0 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 74  r number where t
1b9b0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61 72  he results.** ar
1b9c0 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
1b9d0 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  If the register 
1b9e0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 72  is a temporary r
1b9f0 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61 6e  egister that can
1ba00 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 2c   be deallocated,
1ba10 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 69  .** then write i
1ba20 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ts number into *
1ba30 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72 65  pReg.  If the re
1ba40 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69 73  sult register is
1ba50 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f 72   not.** a tempor
1ba60 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  ary, then set *p
1ba70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  Reg to zero..**.
1ba80 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
1ba90 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20   constant, then 
1baa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
1bab0 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69 73  ht generate this
1bac0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c 6c  .** code to fill
1bad0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 6e   the register in
1bae0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1baf0 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  ion section of t
1bb00 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72  he.** VDBE progr
1bb10 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  am, in order to 
1bb20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f 66  factor it out of
1bb30 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
1bb40 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  loop..*/.int sql
1bb50 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1bb60 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bb70 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1bb80 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20 72   *pReg){.  int r
1bb90 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  2;.  pExpr = sql
1bba0 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
1bbb0 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69 66  ate(pExpr);.  if
1bbc0 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
1bbd0 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70 45  pParse).   && pE
1bbe0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
1bbf0 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69 74  STER.   && sqlit
1bc00 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1bc10 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a 20  NotJoin(pExpr). 
1bc20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
1bc30 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 43   *p = pParse->pC
1bc40 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69 6e  onstExpr;.    in
1bc50 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20 20  t i;.    *pReg  
1bc60 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20 29  = 0;.    if( p )
1bc70 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
1bc80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1bc90 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  tem;.      for(p
1bca0 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d 3e  Item=p->a, i=p->
1bcb0 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74 65  nExpr; i>0; pIte
1bcc0 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20 20  m++, i--){.     
1bcd0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72 65     if( pItem->re
1bce0 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74 65  usable && sqlite
1bcf0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74  3ExprCompare(pIt
1bd00 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72 2c  em->pExpr,pExpr,
1bd10 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
1bd20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
1bd30 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ->u.iConstExprRe
1bd40 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
1bd50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1bd60 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  2 = ++pParse->nM
1bd70 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  em;.    sqlite3E
1bd80 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1bd90 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32 2c  arse, pExpr, r2,
1bda0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1bdb0 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
1bdc0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1bdd0 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20 73  rse);.    r2 = s
1bde0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1bdf0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1be00 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66 28  pr, r1);.    if(
1be10 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20 20   r2==r1 ){.     
1be20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20 20   *pReg = r1;.   
1be30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
1be40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1be50 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1be60 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 30  .      *pReg = 0
1be70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1be80 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn r2;.}../*.*
1be90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1bea0 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61  that will evalua
1beb0 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  te expression pE
1bec0 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68  xpr and store th
1bed0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20  e.** results in 
1bee0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1bef0 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72    The results ar
1bf00 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1bf10 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65 67  appear.** in reg
1bf20 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a 2f  ister target..*/
1bf30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1bf40 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61  rCode(Parse *pPa
1bf50 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1bf60 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1bf70 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20 61   int inReg;..  a
1bf80 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1bf90 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
1bfa0 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
1bfb0 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72 2d   pExpr && pExpr-
1bfc0 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op==TK_REGISTER
1bfd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1bfe0 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
1bff0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70 79  ->pVdbe, OP_Copy
1c000 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
1c010 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73   target);.  }els
1c020 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20 73  e{.    inReg = s
1c030 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1c040 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1c050 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1c060 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1c070 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73 65  >pVdbe || pParse
1c080 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c090 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  ed );.    if( in
1c0a0 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20 70  Reg!=target && p
1c0b0 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
1c0c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c0d0 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e  eAddOp2(pParse->
1c0e0 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c  pVdbe, OP_SCopy,
1c0f0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
1c100 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1c110 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c120 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1c130 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
1c140 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
1c150 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
1c160 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c170 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
1c180 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
1c190 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
1c1a0 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 20  egister target. 
1c1b0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
1c1c0 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c 20  on is constant, 
1c1d0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1c1e0 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f 73  e.** might choos
1c1f0 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65 78  e to code the ex
1c200 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69 74  pression at init
1c210 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
1c220 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c230 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61 62  ExprCodeFactorab
1c240 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
1c250 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c260 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69 66  nt target){.  if
1c270 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73  ( pParse->okCons
1c280 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69 74  tFactor && sqlit
1c290 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
1c2a0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
1c2b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1c2c0 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1c2d0 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a  pr, target, 0);.
1c2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1c2f0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1c300 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1c310 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  et);.  }.}../*.*
1c320 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c330 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74  that evaluates t
1c340 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1c350 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68 65  ion and puts the
1c360 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72 65   result.** in re
1c370 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
1c380 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20 61  *.** Also make a
1c390 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
1c3a0 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73 20  ression results 
1c3b0 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63 61  into another "ca
1c3c0 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a 2a  che" register.**
1c3d0 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
1c3e0 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74 68  expression so th
1c3f0 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  at the next time
1c400 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65 64   it is evaluated
1c410 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  ,.** the result 
1c420 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
1c430 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72 2e   cache register.
1c440 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1c450 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1c460 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
1c470 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69 70   are used multip
1c480 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20 54  le .** times.  T
1c490 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74 65  hey are evaluate
1c4a0 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  d once and the r
1c4b0 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65 78  esults of the ex
1c4c0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65 20  pression.** are 
1c4d0 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  reused..*/.void 
1c4e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1c4f0 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
1c500 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1c510 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1c520 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1c530 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1c540 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  t iMem;..  asser
1c550 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1c560 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1c570 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op!=TK_REGISTER 
1c580 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1c590 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
1c5a0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 69  pr, target);.  i
1c5b0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1c5c0 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
1c5d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c5e0 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69 4d  Copy, target, iM
1c5f0 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65 67  em);.  exprToReg
1c600 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d 65  ister(pExpr, iMe
1c610 6d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  m);.}..#ifdef SQ
1c620 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1c630 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
1c640 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
1c650 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70  nation of an exp
1c660 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f  ression tree..*/
1c670 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65  .void sqlite3Tre
1c680 65 56 69 65 77 45 78 70 72 28 54 72 65 65 56 69  eViewExpr(TreeVi
1c690 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73 74  ew *pView, const
1c6a0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75 38   Expr *pExpr, u8
1c6b0 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b 0a   moreToFollow){.
1c6c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
1c6d0 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20 42  inOp = 0;   /* B
1c6e0 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 2a  inary operator *
1c6f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1c700 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f 2a  zUniOp = 0;   /*
1c710 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20   Unary operator 
1c720 2a 2f 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c  */.  pView = sql
1c730 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
1c740 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f  (pView, moreToFo
1c750 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70 45 78  llow);.  if( pEx
1c760 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  pr==0 ){.    sql
1c770 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1c780 28 70 56 69 65 77 2c 20 22 6e 69 6c 22 29 3b 0a  (pView, "nil");.
1c790 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1c7a0 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 20  iewPop(pView);. 
1c7b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1c7c0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1c7d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1c7e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
1c7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1c800 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1c810 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a 20   "AGG{%d:%d}",. 
1c820 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1c830 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
1c840 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1c850 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c860 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
1c870 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
1c880 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
1c890 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1c8a0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
1c8b0 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b 20  en coding check 
1c8c0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
1c8d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1c8e0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c8f0 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c 20  , "COLUMN(%d)", 
1c900 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1c910 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c920 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1c930 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1c940 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20   "{%d:%d}",.    
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1c970 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
1c980 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
1c990 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c9a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c9b0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
1c9c0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1c9d0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
1c9e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c9f0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1ca00 56 69 65 77 2c 20 22 25 64 22 2c 20 70 45 78 70  View, "%d", pExp
1ca10 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20  r->u.iValue);.  
1ca20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ca30 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1ca40 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25  ewLine(pView, "%
1ca50 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
1ca60 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1ca70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ca80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ca90 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
1caa0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
1cab0 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  FLOAT: {.      s
1cac0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1cad0 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20 70  ne(pView,"%s", p
1cae0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1caf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cb00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1cb10 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
1cb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1cb30 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1cb40 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%Q", pExpr->u.
1cb50 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1cb60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1cb70 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
1cb80 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1cb90 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1cba0 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
1cbb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1cbc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cbd0 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20  BLOB_LITERAL.   
1cbe0 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b   case TK_BLOB: {
1cbf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1cc00 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1cc10 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%s", pExpr->u.
1cc20 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1cc30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1cc40 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
1cc50 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
1cc60 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1cc70 4c 69 6e 65 28 70 56 69 65 77 2c 22 56 41 52 49  Line(pView,"VARI
1cc80 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20 20  ABLE(%s,%d)",.  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cca0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75          pExpr->u
1ccb0 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d 3e  .zToken, pExpr->
1ccc0 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1ccd0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cce0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
1ccf0 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
1cd00 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1cd10 56 69 65 77 2c 22 52 45 47 49 53 54 45 52 28 25  View,"REGISTER(%
1cd20 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d)", pExpr->iTab
1cd30 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
1cd40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1cd50 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
1cd60 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1cd70 69 6e 65 28 70 56 69 65 77 2c 22 41 53 20 25 51  ine(pView,"AS %Q
1cd80 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1cd90 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
1cda0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1cdb0 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
1cdc0 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ft, 0);.      br
1cdd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1cde0 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
1cdf0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1ce00 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 49 44  ewLine(pView,"ID
1ce10 20 5c 22 25 77 5c 22 22 2c 20 70 45 78 70 72 2d   \"%w\"", pExpr-
1ce20 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1ce30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1ce40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ce50 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1ce60 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1ce70 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1ce80 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1ce90 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1cea0 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  ken) */.      sq
1ceb0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1cec0 65 28 70 56 69 65 77 2c 22 43 41 53 54 20 25 51  e(pView,"CAST %Q
1ced0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1cee0 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
1cef0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1cf00 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
1cf10 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ft, 0);.      br
1cf20 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1cf30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1cf40 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1cf50 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42  e TK_LT:      zB
1cf60 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20  inOp = "LT";    
1cf70 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cf80 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69   TK_LE:      zBi
1cf90 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  nOp = "LE";     
1cfa0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cfb0 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
1cfc0 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62  Op = "GT";     b
1cfd0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1cfe0 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GE:      zBinO
1cff0 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72  p = "GE";     br
1d000 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1d010 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _NE:      zBinOp
1d020 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65   = "NE";     bre
1d030 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d040 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  EQ:      zBinOp 
1d050 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61  = "EQ";     brea
1d060 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1d070 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
1d080 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b   "IS";     break
1d090 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1d0a0 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NOT:   zBinOp = 
1d0b0 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  "ISNOT";  break;
1d0c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1d0d0 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1d0e0 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  AND";    break;.
1d0f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1d100 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f       zBinOp = "O
1d110 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  R";     break;. 
1d120 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1d130 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44      zBinOp = "AD
1d140 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1d150 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
1d160 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c     zBinOp = "MUL
1d170 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1d180 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
1d190 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22    zBinOp = "SUB"
1d1a0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1d1b0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
1d1c0 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b   zBinOp = "REM";
1d1d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1d1e0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
1d1f0 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44  zBinOp = "BITAND
1d200 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1d210 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
1d220 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b  BinOp = "BITOR";
1d230 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d240 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42  e TK_SLASH:   zB
1d250 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20  inOp = "DIV";   
1d260 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1d270 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69   TK_LSHIFT:  zBi
1d280 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  nOp = "LSHIFT"; 
1d290 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d2a0 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
1d2b0 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62  Op = "RSHIFT"; b
1d2c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1d2d0 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f  K_CONCAT:  zBinO
1d2e0 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72  p = "CONCAT"; br
1d2f0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1d300 5f 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _DOT:     zBinOp
1d310 20 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72 65   = "DOT";    bre
1d320 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1d330 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70  _UMINUS:  zUniOp
1d340 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65   = "UMINUS"; bre
1d350 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d360 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20  UPLUS:   zUniOp 
1d370 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61  = "UPLUS";  brea
1d380 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1d390 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d  ITNOT:  zUniOp =
1d3a0 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b   "BITNOT"; break
1d3b0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1d3c0 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20  T:     zUniOp = 
1d3d0 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b  "NOT";    break;
1d3e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1d3f0 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  ULL:  zUniOp = "
1d400 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  ISNULL"; break;.
1d410 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1d420 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e  ULL: zUniOp = "N
1d430 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
1d440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d450 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  LATE: {.      sq
1d460 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d470 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 4c 41 54  e(pView, "COLLAT
1d480 45 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  E %Q", pExpr->u.
1d490 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
1d4a0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d4b0 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1d4c0 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
1d4d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d4e0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1d4f0 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
1d500 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1d510 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1d520 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1d530 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1d540 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1d550 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1d560 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d570 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
1d580 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d590 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1d5a0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d5b0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d5c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d5d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1d5e0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1d5f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d600 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d610 69 65 77 2c 20 22 41 47 47 5f 46 55 4e 43 54 49  iew, "AGG_FUNCTI
1d620 4f 4e 25 64 20 25 51 22 2c 0a 20 20 20 20 20 20  ON%d %Q",.      
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1d650 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  2, pExpr->u.zTok
1d660 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
1d670 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d680 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d690 69 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e 20 25  iew, "FUNCTION %
1d6a0 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1d6b0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1d6c0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1d6d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d6e0 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1d6f0 28 70 56 69 65 77 2c 20 70 46 61 72 67 2c 20 30  (pView, pFarg, 0
1d700 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d730 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1d740 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
1d750 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d760 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d770 69 65 77 2c 20 22 45 58 49 53 54 53 2d 65 78 70  iew, "EXISTS-exp
1d780 72 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r");.      sqlit
1d790 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d7a0 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d7b0 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d7c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d7d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
1d7e0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
1d7f0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1d800 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54 2d  (pView, "SELECT-
1d810 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 73 71  expr");.      sq
1d820 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
1d830 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70 72  ect(pView, pExpr
1d840 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ->x.pSelect, 0);
1d850 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d860 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d870 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
1d880 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1d890 70 56 69 65 77 2c 20 22 49 4e 22 29 3b 0a 20 20  pView, "IN");.  
1d8a0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d8b0 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
1d8c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b  Expr->pLeft, 1);
1d8d0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1d8e0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d8f0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d900 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d910 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d920 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d930 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d950 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d960 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
1d970 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1d980 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
1d990 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d9a0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d9b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d9c0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1d9d0 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1d9e0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1d9f0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1da00 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1da10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1da20 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1da30 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1da40 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1da50 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1da60 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1da70 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1da80 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1da90 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1daa0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1dab0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1dac0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1dad0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1dae0 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1daf0 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1db00 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1db10 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1db20 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1db30 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1db40 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1db50 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1db60 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1db70 22 42 45 54 57 45 45 4e 22 29 3b 0a 20 20 20 20  "BETWEEN");.    
1db80 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1db90 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 58 2c  wExpr(pView, pX,
1dba0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1dbb0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1dbc0 56 69 65 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20  View, pY, 1);.  
1dbd0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1dbe0 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
1dbf0 5a 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  Z, 0);.      bre
1dc00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dc10 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1dc20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1dc30 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1dc40 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1dc50 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1dc60 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1dc70 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1dc80 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1dc90 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1dca0 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1dcb0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1dcc0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1dcd0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1dce0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1dcf0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1dd00 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1dd10 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1dd20 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1dd30 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1dd40 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1dd50 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1dd60 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1dd70 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1dd80 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1dd90 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1dda0 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1ddb0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
1ddc0 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1ddd0 77 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20  w, "%s(%d)", .  
1dde0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1ddf0 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20  Table ? "NEW" : 
1de00 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43  "OLD", pExpr->iC
1de10 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
1de20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1de30 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
1de40 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1de50 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1de60 22 43 41 53 45 22 29 3b 0a 20 20 20 20 20 20 73  "CASE");.      s
1de70 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1de80 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1de90 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20  >pLeft, 1);.    
1dea0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1deb0 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
1dec0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1ded0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
1dee0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1def0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1df00 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1df10 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1df20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1df30 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  ype = "unk";.   
1df40 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
1df50 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ->affinity ){.  
1df60 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
1df70 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20  llback:   zType 
1df80 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62  = "rollback";  b
1df90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1dfa0 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20  se OE_Abort:    
1dfb0 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74    zType = "abort
1dfc0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1dfd0 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61        case OE_Fa
1dfe0 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20  il:       zType 
1dff0 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62  = "fail";      b
1e000 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1e010 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20  se OE_Ignore:   
1e020 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72    zType = "ignor
1e030 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
1e040 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1e050 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1e060 70 56 69 65 77 2c 20 22 52 41 49 53 45 20 25 73  pView, "RAISE %s
1e070 28 25 51 29 22 2c 20 7a 54 79 70 65 2c 20 70 45  (%Q)", zType, pE
1e080 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1e090 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e0a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
1e0b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
1e0c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1e0d0 6e 65 28 70 56 69 65 77 2c 20 22 6f 70 3d 25 64  ne(pView, "op=%d
1e0e0 22 2c 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20  ", pExpr->op);. 
1e0f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e100 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e  }.  }.  if( zBin
1e110 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1e120 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1e130 69 65 77 2c 20 22 25 73 22 2c 20 7a 42 69 6e 4f  iew, "%s", zBinO
1e140 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  p);.    sqlite3T
1e150 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1e160 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
1e170 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1e180 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
1e190 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ew, pExpr->pRigh
1e1a0 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  t, 0);.  }else i
1e1b0 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20  f( zUniOp ){.   
1e1c0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1e1d0 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22  Line(pView, "%s"
1e1e0 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73  , zUniOp);.    s
1e1f0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1e200 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1e210 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 7d 0a  >pLeft, 0);.  }.
1e220 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1e230 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23  wPop(pView);.}.#
1e240 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e250 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
1e260 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1e270 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1e280 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1e290 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1e2a0 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1e2b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e2c0 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1e2d0 28 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70 56  (.  TreeView *pV
1e2e0 69 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70  iew,.  const Exp
1e2f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20  rList *pList,.  
1e300 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c  u8 moreToFollow,
1e310 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e320 4c 61 62 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 69  Label.){.  int i
1e330 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69  ;.  pView = sqli
1e340 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
1e350 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c  pView, moreToFol
1e360 6c 6f 77 29 3b 0a 20 20 69 66 28 20 7a 4c 61 62  low);.  if( zLab
1e370 65 6c 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b  el==0 || zLabel[
1e380 30 5d 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20 3d  0]==0 ) zLabel =
1e390 20 22 4c 49 53 54 22 3b 0a 20 20 69 66 28 20 70   "LIST";.  if( p
1e3a0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  List==0 ){.    s
1e3b0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1e3c0 6e 65 28 70 56 69 65 77 2c 20 22 25 73 20 28 65  ne(pView, "%s (e
1e3d0 6d 70 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29 3b  mpty)", zLabel);
1e3e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1e3f0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1e400 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 7a  e(pView, "%s", z
1e410 4c 61 62 65 6c 29 3b 0a 20 20 20 20 66 6f 72 28  Label);.    for(
1e420 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1e430 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1e440 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1e450 45 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69 73  Expr(pView, pLis
1e460 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1e470 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
1e480 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 69 66 28  ;.#if 0.     if(
1e490 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1e4a0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1e4b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1e4c0 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25 73  tf(pOut, " AS %s
1e4d0 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
1e4e0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1e4f0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1e500 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62 20  a[i].bSpanIsTab 
1e510 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e520 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1e530 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20 70  pOut, " (%s)", p
1e540 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1e550 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1e560 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  f.    }.  }.  sq
1e570 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1e580 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69  (pView);.}.#endi
1e590 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1e5a0 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  G */../*.** Gene
1e5b0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
1e5c0 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
1e5d0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1e5e0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
1e5f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1e600 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
1e610 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
1e620 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
1e630 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
1e640 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1e650 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
1e660 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1e670 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
1e680 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
1e690 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
1e6a0 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
1e6b0 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
1e6c0 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
1e6d0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
1e6e0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1e6f0 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
1e700 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
1e710 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
1e720 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
1e730 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
1e740 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69  ation code..*/.i
1e750 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1e760 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1e770 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1e780 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1e790 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1e7a0 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1e7b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1e7c0 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1e7d0 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1e7e0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1e7f0 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1e800 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
1e810 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1e820 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
1e830 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
1e840 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1e850 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
1e860 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
1e870 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1e880 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
1e890 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
1e8a0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1e8b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1e8c0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1e8d0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1e8e0 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1e8f0 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1e900 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1e910 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1e920 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
1e930 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1e940 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1e950 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
1e960 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1e970 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
1e980 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1e990 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1e9a0 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
1e9b0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1e9c0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1e9d0 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
1e9e0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1e9f0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
1ea00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1ea10 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1ea20 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
1ea30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ea40 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
1ea50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1ea60 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1ea70 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
1ea80 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1ea90 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1eaa0 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
1eab0 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
1eac0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1ead0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1eae0 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
1eaf0 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
1eb00 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1eb10 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
1eb20 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1eb30 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
1eb40 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
1eb50 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1eb60 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
1eb70 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
1eb80 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1eb90 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
1eba0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1ebb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ebc0 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
1ebd0 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1ebe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ebf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ec00 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1ec10 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1ec20 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1ec30 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1ec40 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1ec50 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1ec60 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1ec70 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1ec80 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1ec90 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1eca0 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1ecb0 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1ecc0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1ecd0 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
1ece0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1ecf0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
1ed00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ed10 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1ed20 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1ed30 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ed40 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1ed50 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
1ed60 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1ed70 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
1ed80 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1ed90 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  if the jump is t
1eda0 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  aken */.  int ju
1edb0 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54  mpIfTrue,   /* T
1edc0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1edd0 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74  the BETWEEN is t
1ede0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  rue */.  int jum
1edf0 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
1ee00 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1ee10 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
1ee20 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  LL */.){.  Expr 
1ee30 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20  exprAnd;     /* 
1ee40 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
1ee50 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c   in  x>=y AND x<
1ee60 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  =z  */.  Expr co
1ee70 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68  mpLeft;    /* Th
1ee80 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f  e  x>=y  term */
1ee90 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68  .  Expr compRigh
1eea0 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d  t;   /* The  x<=
1eeb0 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  z  term */.  Exp
1eec0 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f  r exprX;       /
1eed0 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70  * The  x  subexp
1eee0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1eef0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f   regFree1 = 0; /
1ef00 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
1ef10 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61  register */..  a
1ef20 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ef30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ef40 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1ef50 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
1ef60 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
1ef70 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
1ef80 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
1ef90 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
1efa0 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
1efb0 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
1efc0 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
1efd0 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
1efe0 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1eff0 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
1f000 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1f010 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1f020 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
1f030 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
1f040 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1f050 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
1f060 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1f070 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1f080 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
1f090 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69  ter(&exprX, sqli
1f0a0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f0b0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1f0c0 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
1f0d0 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1f0e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1f0f0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1f100 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1f110 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1f120 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1f130 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f140 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1f150 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f160 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1f170 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f180 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1f190 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1f1a0 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1f1b0 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1f1c0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1f1d0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1f1e0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1f1f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f200 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1f210 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1f220 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1f230 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1f240 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1f250 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1f260 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1f270 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f280 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1f290 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1f2a0 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1f2b0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1f2c0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1f2d0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1f2e0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1f2f0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1f300 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1f310 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1f320 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1f330 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1f340 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1f350 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1f360 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1f370 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1f380 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1f390 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1f3a0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1f3b0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1f3c0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1f3d0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1f3e0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1f3f0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1f400 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1f410 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1f420 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1f430 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1f440 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1f450 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1f460 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1f470 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1f480 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1f490 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1f4a0 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1f4b0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1f4c0 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1f4d0 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1f4e0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1f4f0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1f500 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1f510 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1f520 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1f530 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1f540 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1f550 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1f560 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1f570 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1f580 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1f590 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1f5a0 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1f5b0 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1f5c0 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1f5d0 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1f5e0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1f5f0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1f600 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1f610 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1f620 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1f630 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1f640 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1f650 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1f660 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f670 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1f680 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1f690 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1f6a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1f6b0 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1f6c0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1f6d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1f6e0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1f6f0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1f700 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1f710 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1f720 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1f730 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1f740 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1f750 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
1f760 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1f770 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1f780 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1f790 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1f7a0 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1f7b0 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1f7c0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1f7d0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1f7e0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1f7f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1f800 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f810 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f820 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f830 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f840 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f850 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1f860 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
1f870 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1f880 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f890 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f8a0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f8b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f8c0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1f8d0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1f8e0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f8f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f900 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f910 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1f920 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f930 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f940 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f950 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1f960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f970 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f990 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1f9a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1f9b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f9c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f9d0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f9e0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1f9f0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1fa00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1fa10 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1fa20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1fa30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1fa40 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1fa50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fa60 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1fa70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fa80 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1fa90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1faa0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1fab0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fac0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1fad0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1fae0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1faf0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1fb00 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1fb10 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1fb20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1fb30 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1fb40 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1fb50 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1fb60 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1fb70 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1fb80 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fb90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1fba0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1fbb0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1fbc0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1fbd0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1fbe0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1fbf0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1fc00 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fc10 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1fc20 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1fc30 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1fc40 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1fc50 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
1fc60 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1fc70 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1fc80 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1fc90 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1fca0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fcb0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1fcc0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1fcd0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1fce0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1fcf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fd00 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1fd10 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1fd20 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1fd30 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1fd40 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1fd50 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1fd60 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1fd70 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fd80 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1fd90 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1fda0 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1fdb0 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1fdc0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1fdd0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1fde0 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1fdf0 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1fe00 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1fe10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1fe20 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ne);.      t
1fe30 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fe40 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fe50 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fe60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fe70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fe80 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1fe90 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1fea0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1feb0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1fec0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fed0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1fee0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fef0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ff00 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ff10 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1ff20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1ff30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ff40 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ff50 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1ff60 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1ff70 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1ff80 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
1ff90 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1ffa0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1ffb0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1ffc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ffd0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1ffe0 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
1fff0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
20000 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
20010 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
20020 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20030 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
20040 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
20050 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
20060 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20070 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
20080 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20090 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
200a0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
200b0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
200c0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
200d0 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
200e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
200f0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
20100 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
20110 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
20120 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
20130 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
20140 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20150 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20160 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
20170 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20190 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
201a0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
201b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
201c0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
201d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
201e0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
201f0 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
20200 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20210 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
20220 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20230 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
20240 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20250 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20260 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
20270 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
20280 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c   pExpr, dest, 1,
20290 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
202a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
202b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
202c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
202d0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
202e0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
202f0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
20300 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20310 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
20320 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
20330 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
20340 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
20350 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
20360 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20370 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
20380 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
20390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
203a0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
203b0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
203c0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
203d0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
203e0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
203f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
20400 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
20410 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
20420 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
20430 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20440 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20450 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
20460 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
20470 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
20480 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
20490 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f       /* No-op */
204a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
204b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
204c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
204d0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
204e0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
204f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20500 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
20510 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20520 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
20530 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20540 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20550 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
20560 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20570 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20580 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
20590 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
205a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
205b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
205c0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
205d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
205e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
205f0 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
20600 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20610 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
20620 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
20630 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
20640 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
20650 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
20660 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
20670 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
20680 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
20690 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
206a0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
206b0 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
206c0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
206d0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
206e0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
206f0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
20700 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
20710 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
20720 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
20730 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
20740 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
20750 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
20760 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20770 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
20780 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
20790 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
207a0 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
207b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
207c0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
207d0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
207e0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
207f0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
20800 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
20810 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
20820 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
20830 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
20840 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
20850 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
20860 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
20870 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
20880 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
20890 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
208a0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
208b0 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
208c0 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
208d0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
208e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
208f0 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
20900 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
20910 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
20920 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
20930 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
20940 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
20950 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
20960 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
20970 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
20980 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
20990 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
209a0 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
209b0 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
209c0 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
209d0 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
209e0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
209f0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
20a10 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
20a20 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
20a30 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
20a40 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
20a50 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
20a60 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
20a70 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
20a80 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
20a90 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
20aa0 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
20ab0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
20ac0 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
20ad0 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
20ae0 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
20af0 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
20b00 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
20b10 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
20b20 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
20b30 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
20b40 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
20b50 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
20b60 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
20b70 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
20b80 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
20b90 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
20ba0 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
20bb0 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
20bc0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
20bd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
20be0 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
20bf0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
20c00 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
20c10 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
20c20 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
20c30 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
20c40 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
20c50 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
20c60 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
20c70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
20c80 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
20c90 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20ca0 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
20cb0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
20cc0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
20cd0 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
20ce0 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
20cf0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
20d00 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
20d10 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20d20 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
20d30 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
20d40 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
20d50 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
20d60 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
20d70 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20d80 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
20d90 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
20da0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20db0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
20dc0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20dd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20de0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
20df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
20e00 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
20e10 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
20e20 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
20e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20e40 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20e50 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
20e60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20e70 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
20e80 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
20e90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20ea0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20eb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20ec0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20ed0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
20ee0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20ef0 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
20f00 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
20f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20f20 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
20f30 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
20f40 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20f50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20f60 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
20f70 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20f80 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
20f90 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
20fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20fb0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20fc0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20fd0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20fe0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
20ff0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
21000 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
21010 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
21020 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
21030 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
21040 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
21050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
21060 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
21070 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
21080 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
21090 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
210a0 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
210b0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
210c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
210d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
210e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
210f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
21100 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21110 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
21120 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
21130 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
21140 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21150 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
21160 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
21170 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
21180 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
21190 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
211c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
211d0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
211e0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
211f0 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
21200 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
21210 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
21220 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
21230 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
21240 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
21250 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
21260 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
21270 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
21280 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
21290 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
212a0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
212b0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
212c0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
212d0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
212e0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
212f0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
21300 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
21310 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
21320 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
21330 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
21340 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
21350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
21360 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
21370 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
21380 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
21390 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
213a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
213b0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
213c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
213d0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
213e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
213f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
21400 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
21410 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
21420 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
21430 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
21440 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
21450 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
21460 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
21470 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
21480 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21490 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
214a0 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
214b0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
214c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
214d0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
214e0 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
214f0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
21500 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
21510 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  Q;.      codeCom
21520 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
21530 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
21540 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
21570 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
21580 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21590 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
215a0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
215b0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
215c0 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
215d0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
215e0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
215f0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
21600 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21610 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21620 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
21630 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
21640 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
21650 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
21660 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21670 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
21680 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
216a0 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
216b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
216c0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20  =TK_ISNULL );   
216d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
216e0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
216f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21700 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
21710 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
21720 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
21730 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
21740 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
21750 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
21760 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21770 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
21780 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21790 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
217a0 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
217b0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
217c0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20  pExpr, dest, 0, 
217d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
217e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
217f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21800 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
21810 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
21820 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
21830 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
21840 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
21850 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
21860 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
21870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21880 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
21890 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
218a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
218b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
218c0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
218d0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
218e0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
218f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
21900 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
21910 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
21920 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21930 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
21940 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
21950 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
21960 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
21970 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21980 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
21990 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
219a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
219b0 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
219c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
219d0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
219e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
219f0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
21a00 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
21a10 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
21a20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21a30 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21a40 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
21a50 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
21a60 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
21a70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
21a80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
21a90 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
21aa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21ab0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
21ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
21ad0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
21ae0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21af0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
21b00 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
21b10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21b20 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
21b30 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
21b40 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
21b50 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
21b60 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
21b70 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
21b80 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
21b90 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
21ba0 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
21bb0 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
21bc0 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
21bd0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
21be0 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
21bf0 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
21c00 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
21c10 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
21c20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
21c30 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
21c40 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
21c50 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
21c60 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
21c70 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
21c80 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
21c90 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
21ca0 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
21cb0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
21cc0 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
21cd0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
21ce0 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
21cf0 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
21d00 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
21d10 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
21d20 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
21d30 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
21d40 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
21d50 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
21d60 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
21d70 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
21d80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
21d90 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
21da0 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
21db0 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
21dc0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
21dd0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
21de0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
21df0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
21e00 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
21e10 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
21e20 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
21e30 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
21e40 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
21e50 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
21e60 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
21e70 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
21e80 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
21e90 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
21ea0 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
21eb0 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
21ec0 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
21ed0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
21ee0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
21ef0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
21f00 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
21f10 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
21f20 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
21f30 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
21f40 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
21f50 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
21f60 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
21f70 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
21f80 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
21f90 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
21fa0 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
21fb0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
21fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
21fd0 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
21fe0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
21ff0 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
22000 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
22010 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
22020 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
22030 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
22040 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
22050 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
22060 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
22070 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
22080 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
22090 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
220a0 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
220b0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
220c0 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
220d0 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
220e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
220f0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
22100 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
22110 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
22120 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
22130 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
22140 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
22150 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20  (pA->pLeft, pB, 
22160 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
22170 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
22180 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
22190 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
221a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
221b0 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  e(pA, pB->pLeft,
221c0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
221d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
221e0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
221f0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
22200 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  !=TK_COLUMN && A
22210 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b  LWAYS(pA->op!=TK
22220 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
22230 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
22240 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
22250 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
22260 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
22270 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
22280 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
22290 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
222a0 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
222b0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
222c0 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
222d0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
222e0 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
222f0 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
22300 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
22310 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
22320 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
22330 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
22340 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
22350 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22360 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
22370 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
22380 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
22390 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
223a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
223b0 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
223c0 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
223d0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
223e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
223f0 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
22400 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
22410 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
22420 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
22430 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
22440 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29   EP_Reduced)==0)
22450 20 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53   && pA->op!=TK_S
22460 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69  TRING ){.      i
22470 66 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  f( pA->iColumn!=
22480 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
22490 74 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66  turn 2;.      if
224a0 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
224b0 2d 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20  ->iTable .      
224c0 20 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21   && (pA->iTable!
224d0 3d 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70  =iTab || NEVER(p
224e0 42 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29  B->iTable>=0)) )
224f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
22500 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
22520 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
22530 62 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20  bjects.  Return 
22540 30 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  0 if they are id
22550 65 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20  entical and .** 
22560 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79  non-zero if they
22570 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
22580 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ay..**.** If any
22590 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
225a0 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
225b0 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
225c0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
225d0 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
225e0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
225f0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
22600 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
22610 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  iTab..**.** This
22620 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72   routine might r
22630 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66  eturn non-zero f
22640 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78  or equivalent Ex
22650 70 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a  prLists.  The.**
22660 20 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63   only consequenc
22670 65 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c  e will be disabl
22680 65 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ed optimizations
22690 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74  .  But this rout
226a0 69 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65  ine.** must neve
226b0 72 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68  r return 0 if th
226c0 65 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f  e two ExprList o
226d0 62 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65  bjects are diffe
226e0 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61  rent, or.** a ma
226f0 6c 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72  lfunction will r
22700 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  esult..**.** Two
22710 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61   NULL pointers a
22720 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  re considered to
22730 20 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42   be the same.  B
22740 75 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ut a NULL pointe
22750 72 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66  r.** always diff
22760 65 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e  ers from a non-N
22770 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
22780 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c  int sqlite3ExprL
22790 69 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c  istCompare(ExprL
227a0 69 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73  ist *pA, ExprLis
227b0 74 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29  t *pB, int iTab)
227c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
227d0 20 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20   pA==0 && pB==0 
227e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
227f0 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
22800 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
22810 66 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42  f( pA->nExpr!=pB
22820 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e  ->nExpr ) return
22830 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   1;.  for(i=0; i
22840 3c 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  <pA->nExpr; i++)
22850 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
22860 72 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45  rA = pA->a[i].pE
22870 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
22880 45 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d  ExprB = pB->a[i]
22890 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
228a0 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pA->a[i].sortOrd
228b0 65 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72  er!=pB->a[i].sor
228c0 74 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20  tOrder ) return 
228d0 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
228e0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
228f0 78 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54  xprA, pExprB, iT
22900 61 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ab) ) return 1;.
22910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22920 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22930 74 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70  true if we can p
22940 72 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c  rove the pE2 wil
22950 6c 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65  l always be true
22960 20 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72   if pE1 is.** tr
22970 75 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ue.  Return fals
22980 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63  e if we cannot c
22990 6f 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f  omplete the proo
229a0 66 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68  f or if pE2 migh
229b0 74 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20  t.** be false.  
229c0 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  Examples:.**.** 
229d0 20 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20      pE1: x==5   
229e0 20 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20      pE2: x==5   
229f0 20 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74            Result
22a00 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
22a10 31 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45  1: x>0        pE
22a20 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20  2: x==5         
22a30 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73      Result: fals
22a40 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d  e.**     pE1: x=
22a50 32 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  21       pE2: x=
22a60 32 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52  21 OR y=43     R
22a70 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
22a80 20 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20     pE1: x!=123  
22a90 20 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54     pE2: x IS NOT
22aa0 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
22ab0 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
22ac0 3a 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32  : x!=?1      pE2
22ad0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
22ae0 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
22af0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53  **     pE1: x IS
22b00 20 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53   NULL  pE2: x IS
22b10 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
22b20 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
22b30 20 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20    pE1: x IS ?2  
22b40 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
22b50 4e 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20  NULL    Reuslt: 
22b60 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  false.**.** When
22b70 20 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f   comparing TK_CO
22b80 4c 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65  LUMN nodes betwe
22b90 65 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20  en pE1 and pE2, 
22ba0 69 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78  if pE2 has.** Ex
22bb0 70 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e  pr.iTable<0 then
22bc0 20 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20   assume a table 
22bd0 6e 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20  number given by 
22be0 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  iTab..**.** When
22bf0 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
22c00 6e 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e  n false.  Return
22c10 69 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67  ing true might g
22c20 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
22c30 65 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74  e.** improvement
22c40 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c  .  Returning fal
22c50 73 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  se might cause a
22c60 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
22c70 75 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69  uction, but.** i
22c80 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69  t will always gi
22c90 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61  ve the correct a
22ca0 6e 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e  nswer and is hen
22cb0 63 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a  ce always safe..
22cc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
22cd0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78  prImpliesExpr(Ex
22ce0 70 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70  pr *pE1, Expr *p
22cf0 45 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  E2, int iTab){. 
22d00 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
22d10 43 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32  Compare(pE1, pE2
22d20 2c 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20  , iTab)==0 ){.  
22d30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
22d40 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
22d50 4b 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69  K_OR.   && (sqli
22d60 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78  te3ExprImpliesEx
22d70 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65  pr(pE1, pE2->pLe
22d80 66 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20  ft, iTab).      
22d90 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
22da0 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
22db0 28 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68  (pE1, pE2->pRigh
22dc0 74 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a  t, iTab) ).  ){.
22dd0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22de0 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d  }.  if( pE2->op=
22df0 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
22e00 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
22e10 70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c  pare(pE1->pLeft,
22e20 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
22e30 62 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31  b)==0.   && (pE1
22e40 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ->op!=TK_ISNULL 
22e50 26 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49  && pE1->op!=TK_I
22e60 53 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  S).  ){.    retu
22e70 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
22e80 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
22e90 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
22ea0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
22eb0 63 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79  cture is used by
22ec0 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72   the tree walker
22ed0 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66  .** to count ref
22ee0 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
22ef0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
22f00 61 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20  arguments of an 
22f10 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75  .** aggregate fu
22f20 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72  nction, in order
22f30 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
22f40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63  e.** sqlite3Func
22f50 74 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f  tionThisSrc() ro
22f60 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  utine..*/.struct
22f70 20 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72   SrcCount {.  Sr
22f80 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f  cList *pSrc;   /
22f90 2a 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72  * One particular
22fa0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
22fb0 61 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a  a nested query *
22fc0 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20  /.  int nThis;  
22fd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22fe0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
22ff0 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c  columns in pSrcL
23000 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74  ist */.  int nOt
23010 68 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  her;      /* Num
23020 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
23030 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
23040 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
23050 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
23060 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
23070 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
23080 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74  o columns..*/.st
23090 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63  atic int exprSrc
230a0 43 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  Count(Walker *pW
230b0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
230c0 70 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45  pr){.  /* The NE
230d0 56 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63  VER() on the sec
230e0 6f 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61  ond term is beca
230f0 75 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74  use sqlite3Funct
23100 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29  ionUsesThisSrc()
23110 0a 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  .  ** is always 
23120 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71  called before sq
23130 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
23140 41 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64  Aggregates() and
23150 20 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f   so the.  ** TK_
23160 43 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74  COLUMNs have not
23170 20 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72   yet been conver
23180 74 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  ted into TK_AGG_
23190 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a  COLUMN.  If.  **
231a0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
231b0 55 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73  UsesThisSrc() is
231c0 20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c   used differentl
231d0 79 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  y in the future,
231e0 20 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28   the.  ** NEVER(
231f0 29 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  ) will need to b
23200 65 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  e removed. */.  
23210 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
23220 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45  K_COLUMN || NEVE
23230 52 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  R(pExpr->op==TK_
23240 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20  AGG_COLUMN) ){. 
23250 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
23260 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70  ruct SrcCount *p
23270 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53   = pWalker->u.pS
23280 72 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63  rcCount;.    Src
23290 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e  List *pSrc = p->
232a0 70 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53  pSrc;.    int nS
232b0 72 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63  rc = pSrc ? pSrc
232c0 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20  ->nSrc : 0;.    
232d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b  for(i=0; i<nSrc;
232e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
232f0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
23300 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
23310 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
23320 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63  }.    if( i<nSrc
23330 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68   ){.      p->nTh
23340 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  is++;.    }else{
23350 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72  .      p->nOther
23360 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
23370 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23380 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  nue;.}../*.** De
23390 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f  termine if any o
233a0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  f the arguments 
233b0 74 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e  to the pExpr Fun
233c0 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a  ction reference.
233d0 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65  ** pSrcList.  Re
233e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
233f0 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75  y do.  Also retu
23400 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66  rn true if the f
23410 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e  unction.** has n
23420 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68  o arguments or h
23430 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74  as only constant
23440 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
23450 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78  urn false if pEx
23460 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  pr.** references
23470 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74   columns but not
23480 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c   columns of tabl
23490 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63  es found in pSrc
234a0 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  List..*/.int sql
234b0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
234c0 54 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45  ThisSrc(Expr *pE
234d0 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  xpr, SrcList *pS
234e0 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65  rcList){.  Walke
234f0 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72  r w;.  struct Sr
23500 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73  cCount cnt;.  as
23510 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
23520 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
23530 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   );.  memset(&w,
23540 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
23550 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
23560 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74  k = exprSrcCount
23570 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e  ;.  w.u.pSrcCoun
23580 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e  t = &cnt;.  cnt.
23590 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b  pSrc = pSrcList;
235a0 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30  .  cnt.nThis = 0
235b0 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d  ;.  cnt.nOther =
235c0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   0;.  sqlite3Wal
235d0 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45  kExprList(&w, pE
235e0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
235f0 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69   return cnt.nThi
23600 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65  s>0 || cnt.nOthe
23610 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  r==0;.}../*.** A
23620 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
23630 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f   to the pAggInfo
23640 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20  ->aCol[] array. 
23650 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
23660 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
23670 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
23680 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
23690 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
236a0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
236b0 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  t addAggInfoColu
236c0 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mn(sqlite3 *db, 
236d0 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
236e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
236f0 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65  o->aCol = sqlite
23700 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
23710 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20         db,.     
23720 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20    pInfo->aCol,. 
23730 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
23740 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20  fo->aCol[0]),.  
23750 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f       &pInfo->nCo
23760 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a  lumn,.       &i.
23770 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
23780 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64  .}    ../*.** Ad
23790 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
237a0 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
237b0 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20  >aFunc[] array. 
237c0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
237d0 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  x of.** the new 
237e0 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  element.  Return
237f0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
23800 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  er if malloc fai
23810 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
23820 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63  t addAggInfoFunc
23830 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
23840 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
23850 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
23860 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  >aFunc = sqlite3
23870 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
23880 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20        db, .     
23890 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a    pInfo->aFunc,.
238a0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49         sizeof(pI
238b0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a  nfo->aFunc[0]),.
238c0 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
238d0 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a  Func,.       &i.
238e0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b    );.  return i;
238f0 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .}    ../*.** Th
23900 69 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43  is is the xExprC
23910 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72  allback for a tr
23920 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69  ee walker.  It i
23930 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70  s used to.** imp
23940 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78  lement sqlite3Ex
23950 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23960 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69  tes().  See sqli
23970 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
23980 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20  gregates.** for 
23990 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
239a0 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  mation..*/.stati
239b0 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
239c0 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70  regate(Walker *p
239d0 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
239e0 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  xpr){.  int i;. 
239f0 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
23a00 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
23a10 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
23a20 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
23a30 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  e;.  SrcList *pS
23a40 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
23a50 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66  rcList;.  AggInf
23a60 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e  o *pAggInfo = pN
23a70 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20  C->pAggInfo;..  
23a80 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
23a90 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
23aa0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
23ab0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
23ac0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
23ad0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
23ae0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
23af0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23b00 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
23b10 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  UMN );.      /* 
23b20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23b30 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e  the column is in
23b40 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
23b50 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20  es in the FROM. 
23b60 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f       ** clause o
23b70 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
23b80 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69  query */.      i
23b90 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69  f( ALWAYS(pSrcLi
23ba0 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
23bb0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
23bc0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70  _item *pItem = p
23bd0 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  SrcList->a;.    
23be0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
23bf0 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
23c00 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
23c10 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
23c20 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c  ggInfo_col *pCol
23c30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
23c40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23c50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
23c60 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
23c70 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ced) );.        
23c80 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
23c90 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
23ca0 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
23cb0 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63     /* If we reac
23cc0 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
23cd0 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70   means that pExp
23ce0 72 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  r refers to a ta
23cf0 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ble.            
23d00 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  ** that is in th
23d10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
23d20 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
23d30 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20  uery.  .        
23d40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
23d50 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e     ** Make an en
23d60 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  try for the colu
23d70 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  mn in pAggInfo->
23d80 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a  aCol[] if there.
23d90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
23da0 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74  s not an entry t
23db0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
23dc0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23dd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
23de0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
23df0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f   = pAggInfo->aCo
23e00 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  l;.            f
23e10 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e  or(k=0; k<pAggIn
23e20 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  fo->nColumn; k++
23e30 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
23e40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
23e50 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  l->iTable==pExpr
23e60 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23e80 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  ol->iColumn==pEx
23e90 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
23eb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
23ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23ed0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23ee0 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f  if( (k>=pAggInfo
23ef0 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20  ->nColumn).     
23f00 20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20          && (k = 
23f10 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
23f20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67  (pParse->db, pAg
23f30 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20  gInfo))>=0 .    
23f40 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
23f50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
23f60 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
23f70 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k];.            
23f80 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70    pCol->pTab = p
23f90 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
23fa0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23fb0 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  iTable = pExpr->
23fc0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  iTable;.        
23fd0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c        pCol->iCol
23fe0 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  umn = pExpr->iCo
23ff0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
24000 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d      pCol->iMem =
24010 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
24020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
24030 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
24040 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  mn = -1;.       
24050 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78         pCol->pEx
24060 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
24070 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41            if( pA
24080 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
24090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
240a0 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20      int j, n;.  
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
240c0 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41  prList *pGB = pA
240d0 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79  ggInfo->pGroupBy
240e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
240f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
24100 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20  t_item *pTerm = 
24110 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  pGB->a;.        
24120 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d          n = pGB-
24130 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
24140 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
24150 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d   j<n; j++, pTerm
24160 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
24170 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
24180 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
241b0 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69  _COLUMN && pE->i
241c0 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
241d0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
241f0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
24200 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
24230 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
24250 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
24260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24270 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24280 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24290 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
242a0 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
242b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
242c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
242d0 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67  terColumn = pAgg
242e0 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f  Info->nSortingCo
242f0 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
24300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24320 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
24330 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70  w an entry for p
24340 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f  Expr in pAggInfo
24350 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72  ->aCol[] (either
24360 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24370 62 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74  because it was t
24380 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62  here before or b
24390 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63  ecause we just c
243a0 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20  reated it)..    
243b0 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65          ** Conve
243c0 72 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20  rt the pExpr to 
243d0 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  be a TK_AGG_COLU
243e0 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20  MN referring to 
243f0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20  that.           
24400 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   ** pAggInfo->aC
24410 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20  ol[] entry..    
24420 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24430 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56         ExprSetVV
24440 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
24450 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
24460 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
24470 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67  ->pAggInfo = pAg
24480 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  gInfo;.         
24490 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
244a0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20  K_AGG_COLUMN;.  
244b0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
244c0 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a  >iAgg = (i16)k;.
244d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
244e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f  k;.          } /
244f0 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69  * endif pExpr->i
24500 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
24510 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  ursor */.       
24520 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f   } /* end loop o
24530 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a  ver pSrcList */.
24540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
24550 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
24560 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
24570 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
24580 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43  {.      if( (pNC
24590 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
245a0 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20  nAggFunc)==0.   
245b0 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e      && pWalker->
245c0 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78  walkerDepth==pEx
245d0 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b  pr->op2.      ){
245e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
245f0 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70  k to see if pExp
24600 72 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  r is a duplicate
24610 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72   of another aggr
24620 65 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a  egate .        *
24630 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  * function that 
24640 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
24650 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63  e pAggInfo struc
24660 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ture.        */.
24670 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41          struct A
24680 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74  ggInfo_func *pIt
24690 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  em = pAggInfo->a
246a0 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f  Func;.        fo
246b0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
246c0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
246d0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
246e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
246f0 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d  prCompare(pItem-
24700 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d  >pExpr, pExpr, -
24710 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1)==0 ){.       
24720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24740 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  }.        if( i>
24750 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  =pAggInfo->nFunc
24760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
24770 20 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e   pExpr is origin
24780 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20  al.  Make a new 
24790 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66  entry in pAggInf
247a0 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20  o->aFunc[].     
247b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
247c0 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
247d0 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20  Parse->db);.    
247e0 20 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67        i = addAgg
247f0 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d  InfoFunc(pParse-
24800 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a  >db, pAggInfo);.
24810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
24820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24830 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
24840 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
24850 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
24860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
24870 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f  Item = &pAggInfo
24880 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20  ->aFunc[i];.    
24890 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
248a0 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
248b0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
248c0 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65  >iMem = ++pParse
248d0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
248e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
248f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
24900 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
24910 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
24920 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73  pItem->pFunc = s
24930 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
24940 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  on(pParse->db,. 
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24960 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
24970 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  n, sqlite3Strlen
24980 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  30(pExpr->u.zTok
24990 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
249a0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78          pExpr->x
249b0 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  .pList ? pExpr->
249c0 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  x.pList->nExpr :
249d0 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
249e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
249f0 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pr->flags & EP_D
24a00 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
24a10 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
24a20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
24a30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
24a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
24a60 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  em->iDistinct = 
24a70 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
24a80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
24a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24aa0 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f  /* Make pExpr po
24ab0 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f  int to the appro
24ac0 70 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d  priate pAggInfo-
24ad0 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20  >aFunc[] entry. 
24ae0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24af0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
24b00 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
24b10 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
24b20 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
24b30 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
24b40 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
24b50 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
24b60 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
24b70 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20  g = (i16)i;.    
24b80 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49      pExpr->pAggI
24b90 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a  nfo = pAggInfo;.
24ba0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
24bb0 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
24bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
24bd0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
24be0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
24bf0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57  }.  }.  return W
24c00 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73  RC_Continue;.}.s
24c10 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
24c20 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
24c30 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ect(Walker *pWal
24c40 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
24c50 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  lect){.  UNUSED_
24c60 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65  PARAMETER(pWalke
24c70 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  r);.  UNUSED_PAR
24c80 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b  AMETER(pSelect);
24c90 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
24ca0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
24cb0 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78   Analyze the pEx
24cc0 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  pr expression lo
24cd0 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
24ce0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
24cf0 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
24d00 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
24d10 62 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49  be added to AggI
24d20 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20  nfo object that 
24d30 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a  pNC->pAggInfo.**
24d40 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64   points to.  Add
24d50 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
24d60 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20  are made on the 
24d70 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61  AggInfo object a
24d80 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a  s.** necessary..
24d90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24da0 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
24db0 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
24dc0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
24dd0 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
24de0 65 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73  ed by sqlite3Res
24df0 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
24e00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24e10 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
24e20 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78  gates(NameContex
24e30 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45  t *pNC, Expr *pE
24e40 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  xpr){.  Walker w
24e50 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
24e60 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
24e70 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
24e80 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  = analyzeAggrega
24e90 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  te;.  w.xSelectC
24ea0 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a  allback = analyz
24eb0 65 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c  eAggregatesInSel
24ec0 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  ect;.  w.u.pNC =
24ed0 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20   pNC;.  assert( 
24ee0 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30  pNC->pSrcList!=0
24ef0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   );.  sqlite3Wal
24f00 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
24f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
24f20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
24f30 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66  zeAggregates() f
24f40 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73  or every express
24f50 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70  ion in an.** exp
24f60 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52  ression list.  R
24f70 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
24f80 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
24f90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  * If an error is
24fa0 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c   found, the anal
24fb0 79 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72  ysis is cut shor
24fc0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
24fd0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
24fe0 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74  List(NameContext
24ff0 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20   *pNC, ExprList 
25000 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63  *pList){.  struc
25010 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25020 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
25030 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
25040 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c      for(pItem=pL
25050 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
25060 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
25070 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
25080 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
25090 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
250a0 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  NC, pItem->pExpr
250b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
250c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
250d0 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69   single new regi
250e0 73 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20  ster for use to 
250f0 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d  hold some interm
25100 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a  ediate result..*
25110 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
25120 54 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70  TempReg(Parse *p
25130 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50  Parse){.  if( pP
25140 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d  arse->nTempReg==
25150 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
25160 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
25170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
25180 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d  rse->aTempReg[--
25190 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
251a0 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  ];.}../*.** Deal
251b0 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65  locate a registe
251c0 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61  r, making availa
251d0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f  ble for reuse fo
251e0 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
251f0 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  purpose..**.** I
25200 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
25210 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
25220 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75  used by the colu
25230 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a  mn cache, then.*
25240 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69  * the deallocati
25250 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75  on is deferred u
25260 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20  ntil the column 
25270 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20  cache line that 
25280 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69  uses.** the regi
25290 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61  ster becomes sta
252a0 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
252b0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
252c0 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  g(Parse *pParse,
252d0 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66   int iReg){.  if
252e0 28 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65  ( iReg && pParse
252f0 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
25300 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
25310 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e  mpReg) ){.    in
25320 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
25330 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
25340 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
25350 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
25360 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
25370 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
25380 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65        if( p->iRe
25390 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20  g==iReg ){.     
253a0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
253b0 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
253c0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
253d0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65  .    pParse->aTe
253e0 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54  mpReg[pParse->nT
253f0 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67  empReg++] = iReg
25400 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
25410 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c  llocate or deall
25420 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66  ocate a block of
25430 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76   nReg consecutiv
25440 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69  e registers.*/.i
25450 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
25460 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
25470 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b  arse, int nReg){
25480 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69  .  int i, n;.  i
25490 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67   = pParse->iRang
254a0 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72  eReg;.  n = pPar
254b0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20  se->nRangeReg;. 
254c0 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a   if( nReg<=n ){.
254d0 20 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65      assert( !use
254e0 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
254f0 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29  Parse, i, i+n-1)
25500 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
25510 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65  iRangeReg += nRe
25520 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  g;.    pParse->n
25530 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67  RangeReg -= nReg
25540 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
25550 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
25560 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
25570 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d  Mem += nReg;.  }
25580 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76  .  return i;.}.v
25590 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61  oid sqlite3Relea
255a0 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73  seTempRange(Pars
255b0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
255c0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
255d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
255e0 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
255f0 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20   iReg, nReg);.  
25600 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d  if( nReg>pParse-
25610 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20  >nRangeReg ){.  
25620 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
25630 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20  Reg = nReg;.    
25640 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
25650 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a  g = iReg;.  }.}.
25660 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20  ./*.** Mark all 
25670 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
25680 65 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61  ers as being una
25690 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
256a0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
256b0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
256c0 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
256d0 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  se){.  pParse->n
256e0 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70  TempReg = 0;.  p
256f0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
25700 20 3d 20 30 3b 0a 7d 0a                           = 0;.}.