/ Hex Artifact Content
Login

Artifact c34408e0ac1c57cf58ffa2003b339715ee9bda57:


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 65 64 2e 20 20 54 68 65 20 64 65 51 75  ormed.  The deQu
3640: 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ote.** parameter
3650: 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70   is ignored if p
3660: 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72  Token is NULL or
3670: 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f   if the token do
3680: 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72  es not.** appear
3690: 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
36a0: 49 66 20 74 68 65 20 71 75 6f 74 65 73 20 77 65  If the quotes we
36b0: 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  re of the form "
36c0: 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f  ..." (double-quo
36d0: 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65  tes).** then the
36e0: 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c   EP_DblQuoted fl
36f0: 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
3700: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
3710: 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20  ..**.** Special 
3720: 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b  case:  If op==TK
3730: 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f  _INTEGER and pTo
3740: 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ken points to a 
3750: 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63  string that.** c
3760: 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64  an be translated
3770: 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69   into a 32-bit i
3780: 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65  nteger, then the
3790: 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a   token is not.**
37a0: 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f   stored in u.zTo
37b0: 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74  ken.  Instead, t
37c0: 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
37d0: 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  s is written.** 
37e0: 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e  into u.iValue an
37f0: 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75  d the EP_IntValu
3800: 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20  e flag is set.  
3810: 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61 67 65  No extra storage
3820: 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  .** is allocated
3830: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74   to hold the int
3840: 65 67 65 72 20 74 65 78 74 20 61 6e 64 20 74 68  eger text and th
3850: 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69  e dequote flag i
3860: 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78  s ignored..*/.Ex
3870: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41  pr *sqlite3ExprA
3880: 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20  lloc(.  sqlite3 
3890: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
38a0: 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71  /* Handle for sq
38b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
38c0: 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c  o() (may be null
38d0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  ) */.  int op,  
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38f0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
3900: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54  ode */.  const T
3910: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  oken *pToken,   
3920: 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65   /* Token argume
3930: 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  nt.  Might be NU
3940: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  LL */.  int dequ
3950: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
3960: 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f  /* True to dequo
3970: 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  te */.){.  Expr 
3980: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78  *pNew;.  int nEx
3990: 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  tra = 0;.  int i
39a0: 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66  Value = 0;..  if
39b0: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
39c0: 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47  if( op!=TK_INTEG
39d0: 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d  ER || pToken->z=
39e0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  =0.          || 
39f0: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
3a00: 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c  pToken->z, &iVal
3a10: 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ue)==0 ){.      
3a20: 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d  nExtra = pToken-
3a30: 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65  >n+1;.      asse
3a40: 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b  rt( iValue>=0 );
3a50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65  .    }.  }.  pNe
3a60: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
3a70: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
3a80: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3a90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3aa0: 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28      pNew->op = (
3ab0: 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  u8)op;.    pNew-
3ac0: 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20  >iAgg = -1;.    
3ad0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
3ae0: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d      if( nExtra==
3af0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
3b00: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
3b10: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
3b20: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
3b30: 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  = iValue;.      
3b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
3b50: 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 70 4e  nt c;.        pN
3b60: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
3b70: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
3b80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3b90: 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20  pToken->z!=0 || 
3ba0: 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a  pToken->n==0 );.
3bb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b          if( pTok
3bc0: 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70  en->n ) memcpy(p
3bd0: 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70  New->u.zToken, p
3be0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e  Token->z, pToken
3bf0: 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ->n);.        pN
3c00: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f  ew->u.zToken[pTo
3c10: 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20  ken->n] = 0;.   
3c20: 20 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65       if( dequote
3c30: 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20   && nExtra>=3 . 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3c50: 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  (c = pToken->z[0
3c60: 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27  ])=='\'' || c=='
3c70: 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20  "' || c=='[' || 
3c80: 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20  c=='`') ){.     
3c90: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75       sqlite3Dequ
3ca0: 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  ote(pNew->u.zTok
3cb0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  en);.          i
3cc0: 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e 65 77  f( c=='"' ) pNew
3cd0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
3ce0: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
3cf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3d00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
3d10: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20  EXPR_DEPTH>0.   
3d20: 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d   pNew->nHeight =
3d30: 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d   1;.#endif  .  }
3d40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
3d60: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
3d70: 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a  on node from a z
3d80: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74  ero-terminated t
3d90: 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a  oken that has.**
3da0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65   already been de
3db0: 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  quoted..*/.Expr 
3dc0: 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20  *sqlite3Expr(.  
3dd0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
3de0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
3df0: 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d  e for sqlite3DbM
3e00: 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79  allocZero() (may
3e10: 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69   be null) */.  i
3e20: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
3e30: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
3e40: 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  sion opcode */. 
3e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f   const char *zTo
3e60: 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65  ken      /* Toke
3e70: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67  n argument.  Mig
3e80: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
3e90: 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e  .  Token x;.  x.
3ea0: 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e  z = zToken;.  x.
3eb0: 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c  n = zToken ? sql
3ec0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f  ite3Strlen30(zTo
3ed0: 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75  ken) : 0;.  retu
3ee0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c  rn sqlite3ExprAl
3ef0: 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20  loc(db, op, &x, 
3f00: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  0);.}../*.** Att
3f10: 61 63 68 20 73 75 62 74 72 65 65 73 20 70 4c 65  ach subtrees pLe
3f20: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f  ft and pRight to
3f30: 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70   the Expr node p
3f40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  Root..**.** If p
3f50: 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Root==NULL that 
3f60: 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d  means that a mem
3f70: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
3f80: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
3f90: 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61  d..** In that ca
3fa0: 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73  se, delete the s
3fb0: 75 62 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e  ubtrees pLeft an
3fc0: 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69  d pRight..*/.voi
3fd0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74  d sqlite3ExprAtt
3fe0: 61 63 68 53 75 62 74 72 65 65 73 28 0a 20 20 73  achSubtrees(.  s
3ff0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78  qlite3 *db,.  Ex
4000: 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70  pr *pRoot,.  Exp
4010: 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72  r *pLeft,.  Expr
4020: 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66   *pRight.){.  if
4030: 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( pRoot==0 ){.  
4040: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
4050: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
4060: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4070: 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a  ete(db, pLeft);.
4080: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4090: 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68 74  elete(db, pRight
40a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
40b0: 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20  if( pRight ){.  
40c0: 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68      pRoot->pRigh
40d0: 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
40e0: 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c    pRoot->flags |
40f0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
4100: 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 3b 0a   pRight->flags;.
4110: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c      }.    if( pL
4120: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70 52 6f  eft ){.      pRo
4130: 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65 66  ot->pLeft = pLef
4140: 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  t;.      pRoot->
4150: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
4160: 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d 3e 66  agate & pLeft->f
4170: 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lags;.    }.    
4180: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70 52  exprSetHeight(pR
4190: 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oot);.  }.}../*.
41a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 45  ** Allocate an E
41b0: 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68 20 6a  xpr node which j
41c0: 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61 73 20  oins as many as 
41d0: 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a 2a 2a  two subtrees..**
41e0: 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74 68 20  .** One or both 
41f0: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 73 20  of the subtrees 
4200: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20 52 65  can be NULL.  Re
4210: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
4220: 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45 78 70  o the new.** Exp
4230: 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69 66 20  r node.  Or, if 
4240: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
4250: 75 72 73 2c 20 73 65 74 20 70 50 61 72 73 65 2d  urs, set pParse-
4260: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4270: 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65 20 73  d,.** free the s
4280: 75 62 74 72 65 65 73 20 61 6e 64 20 72 65 74 75  ubtrees and retu
4290: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78 70 72  rn NULL..*/.Expr
42a0: 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72 28 0a   *sqlite3PExpr(.
42b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
42c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
42d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
42e0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
42f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
4300: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
4310: 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  /.  Expr *pLeft,
4320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4330: 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  eft operand */. 
4340: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20   Expr *pRight,  
4350: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
4360: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  t operand */.  c
4370: 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  onst Token *pTok
4380: 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  en     /* Argume
4390: 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  nt token */.){. 
43a0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66 28 20   Expr *p;.  if( 
43b0: 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20 70 4c  op==TK_AND && pL
43c0: 65 66 74 20 26 26 20 70 52 69 67 68 74 20 26 26  eft && pRight &&
43d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
4400: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
4410: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
4420: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4430: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4450: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4460: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4470: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4480: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20 70 54  arse->db, op, pT
4490: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71  oken, 1);.    sq
44a0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
44b0: 75 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e  ubtrees(pParse->
44c0: 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20 70 52  db, p, pLeft, pR
44d0: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ight);.  }.  if(
44e0: 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c 69 74   p ) {.    sqlit
44f0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
4500: 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65  t(pParse, p->nHe
4510: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
4520: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
4530: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
4540: 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  n is always eith
4550: 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c 53 45  er TRUE or FALSE
4560: 20 28 72 65 73 70 65 63 74 69 76 65 6c 79 29 2c   (respectively),
4570: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
4580: 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f  1.  If one canno
4590: 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  t determine the 
45a0: 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66 20 74  truth value of t
45b0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
45c0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
45d0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
45e0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
45f0: 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20 69 73  mization.  If is
4600: 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20 30 20   OK to return 0 
4610: 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20  here even if.** 
4620: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
4630: 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79 73 20  eally is always 
4640: 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65 20 28  false or false (
4650: 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  a false negative
4660: 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69 73 20  )..** But it is 
4670: 61 20 62 75 67 20 74 6f 20 72 65 74 75 72 6e 20  a bug to return 
4680: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
4690: 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65 20 64  ion might have d
46a0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c  ifferent.** bool
46b0: 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20 64 69  ean values in di
46c0: 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d 73 74  fferent circumst
46d0: 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65 20 70  ances (a false p
46e0: 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20  ositive.).**.** 
46f0: 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74 68 65  Note that if the
4700: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70   expression is p
4710: 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e  art of condition
4720: 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54  al for a.** LEFT
4730: 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65 20 63   JOIN, then we c
4740: 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20  annot determine 
4750: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
4760: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
4770: 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f 72 20  * is it true or 
4780: 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61 79 73  false, so always
4790: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
47a0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
47b0: 61 79 73 54 72 75 65 28 45 78 70 72 20 2a 70 29  aysTrue(Expr *p)
47c0: 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20  {.  int v = 0;. 
47d0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
47e0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
47f0: 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
4800: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
4810: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c 20  xprIsInteger(p, 
4820: 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  &v) ) return 0;.
4830: 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d    return v!=0;.}
4840: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
4850: 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78 70 72  AlwaysFalse(Expr
4860: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20   *p){.  int v = 
4870: 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  0;.  if( ExprHas
4880: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
4890: 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72  romJoin) ) retur
48a0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
48b0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
48c0: 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e  (p, &v) ) return
48d0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d   0;.  return v==
48e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e  0;.}../*.** Join
48f0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
4900: 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70   using an AND op
4910: 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74 68  erator.  If eith
4920: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  er expression is
4930: 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a  .** NULL, then j
4940: 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ust return the o
4950: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  ther expression.
4960: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69  .**.** If one si
4970: 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  de or the other 
4980: 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20 6b 6e  of the AND is kn
4990: 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73 65 2c  own to be false,
49a0: 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a   then instead.**
49b0: 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20 61 6e   of returning an
49c0: 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f 6e 2c   AND expression,
49d0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20 63   just return a c
49e0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
49f0: 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c  on with.** a val
4a00: 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ue of false..*/.
4a10: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
4a20: 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  rAnd(sqlite3 *db
4a30: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
4a40: 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  xpr *pRight){.  
4a50: 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a  if( pLeft==0 ){.
4a60: 20 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68      return pRigh
4a70: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
4a80: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
4a90: 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20  return pLeft;.  
4aa0: 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
4ab0: 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66 74 29  waysFalse(pLeft)
4ac0: 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73 46 61   || exprAlwaysFa
4ad0: 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b 0a 20  lse(pRight) ){. 
4ae0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4af0: 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29 3b  lete(db, pLeft);
4b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4b10: 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67 68  Delete(db, pRigh
4b20: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  t);.    return s
4b30: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4b40: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
4b50: 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
4b60: 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  s[0], 0);.  }els
4b70: 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  e{.    Expr *pNe
4b80: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
4b90: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c  lloc(db, TK_AND,
4ba0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
4bb0: 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62  te3ExprAttachSub
4bc0: 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77 2c 20  trees(db, pNew, 
4bd0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
4be0: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b      return pNew;
4bf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
4c00: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
4c10: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
4c20: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
4c30: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
4c40: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
4c50: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
4c60: 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
4c70: 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  rse, ExprList *p
4c80: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
4c90: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
4ca0: 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ew;.  sqlite3 *d
4cb0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4cc0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
4cd0: 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   );.  pNew = sql
4ce0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
4cf0: 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70  , TK_FUNCTION, p
4d00: 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28  Token, 1);.  if(
4d10: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
4d20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4d30: 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
4d40: 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72  ; /* Avoid memor
4d50: 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c  y leak when mall
4d60: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
4d70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4d80: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
4d90: 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  pList;.  assert(
4da0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
4db0: 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65  y(pNew, EP_xIsSe
4dc0: 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  lect) );.  sqlit
4dd0: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41  e3ExprSetHeightA
4de0: 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20  ndFlags(pParse, 
4df0: 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
4e00: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
4e10: 73 73 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65  ssign a variable
4e20: 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78   number to an ex
4e30: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e  pression that en
4e40: 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61 72 64  codes a wildcard
4e50: 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69  .** in the origi
4e60: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
4e70: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  t.  .**.** Wildc
4e80: 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20  ards consisting 
4e90: 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20  of a single "?" 
4ea0: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
4eb0: 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c   next sequential
4ec0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  .** variable num
4ed0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63  ber..**.** Wildc
4ee0: 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ards of the form
4ef0: 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69   "?nnn" are assi
4f00: 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20  gned the number 
4f10: 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a  "nnn".  We make.
4f20: 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73  ** sure "nnn" is
4f30: 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61   not too be to a
4f40: 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66  void a denial of
4f50: 20 73 65 72 76 69 63 65 20 61 74 74 61 63 6b 20   service attack 
4f60: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20  when.** the SQL 
4f70: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20  statement comes 
4f80: 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c  from an external
4f90: 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57   source..**.** W
4fa0: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
4fb0: 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61  form ":aaa", "@a
4fc0: 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61  aa", or "$aaa" a
4fd0: 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20  re assigned the 
4fe0: 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61  same number.** a
4ff0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69  s the previous i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73  nstance of the s
5010: 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f  ame wildcard.  O
5020: 72 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  r if this is the
5030: 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e   first.** instan
5040: 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ce of the wildca
5050: 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71  rd, the next seq
5060: 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65  uential variable
5070: 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73   number is.** as
5080: 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  signed..*/.void 
5090: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
50a0: 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65  nVarNumber(Parse
50b0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
50c0: 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65  pExpr){.  sqlite
50d0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
50e0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
50f0: 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70   *z;..  if( pExp
5100: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
5110: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5120: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5130: 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
5140: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
5150: 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70  Only) );.  z = p
5160: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
5170: 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
5180: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d  ;.  assert( z[0]
5190: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31  !=0 );.  if( z[1
51a0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ]==0 ){.    /* W
51b0: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
51c0: 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e  orm "?".  Assign
51d0: 20 74 68 65 20 6e 65 78 74 20 76 61 72 69 61 62   the next variab
51e0: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
51f0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27   assert( z[0]=='
5200: 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ?' );.    pExpr-
5210: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61  >iColumn = (ynVa
5220: 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61  r)(++pParse->nVa
5230: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
5240: 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20   ynVar x = 0;.  
5250: 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65    u32 n = sqlite
5260: 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20  3Strlen30(z);.  
5270: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20    if( z[0]=='?' 
5280: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64  ){.      /* Wild
5290: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
52a0: 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72   "?nnn".  Conver
52b0: 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e  t "nnn" to an in
52c0: 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20  teger and.      
52d0: 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65  ** use it as the
52e0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
52f0: 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b   */.      i64 i;
5300: 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d  .      int bOk =
5310: 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36   0==sqlite3Atoi6
5320: 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31  4(&z[1], &i, n-1
5330: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
5340: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
5350: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
5360: 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63  r)i;.      testc
5370: 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ase( i==0 );.   
5380: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
5390: 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
53a0: 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d  ase( i==db->aLim
53b0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
53c0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
53d0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
53e0: 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69  case( i==db->aLi
53f0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5400: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
5410: 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ] );.      if( b
5420: 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20  Ok==0 || i<1 || 
5430: 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  i>db->aLimit[SQL
5440: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
5450: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
5460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5470: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
5480: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d  ariable number m
5490: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f  ust be between ?
54a0: 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20  1 and ?%d",.    
54b0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d          db->aLim
54c0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
54d0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
54e0: 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30  );.        x = 0
54f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5500: 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56  if( i>pParse->nV
5510: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ar ){.        pP
5520: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e  arse->nVar = (in
5530: 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t)i;.      }.   
5540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
5550: 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20   Wildcards like 
5560: 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f  ":aaa", "$aaa" o
5570: 72 20 22 40 61 61 61 22 2e 20 20 52 65 75 73 65  r "@aaa".  Reuse
5580: 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62   the same variab
5590: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  le.      ** numb
55a0: 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20  er as the prior 
55b0: 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68  appearance of th
55c0: 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20  e same name, or 
55d0: 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20  if the name.    
55e0: 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61    ** has never a
55f0: 70 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20  ppeared before, 
5600: 72 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  reuse the same v
5610: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20  ariable number. 
5620: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e       */.      yn
5630: 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  Var i;.      for
5640: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
5650: 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nzVar; i++){.   
5660: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
5670: 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72  >azVar[i] && str
5680: 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  cmp(pParse->azVa
5690: 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  r[i],z)==0 ){.  
56a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
56b0: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
56c0: 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20  Var)i+1;.       
56d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
56e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
56f0: 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
5700: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
5710: 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72  = (ynVar)(++pPar
5720: 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d  se->nVar);.    }
5730: 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a  .    if( x>0 ){.
5740: 20 20 20 20 20 20 69 66 28 20 78 3e 70 50 61 72        if( x>pPar
5750: 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20  se->nzVar ){.   
5760: 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20       char **a;. 
5770: 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74         a = sqlit
5780: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
5790: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78  pParse->azVar, x
57a0: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
57b0: 20 20 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30          if( a==0
57c0: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45   ) return;  /* E
57d0: 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68  rror reported th
57e0: 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rough db->malloc
57f0: 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  Failed */.      
5800: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20    pParse->azVar 
5810: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  = a;.        mem
5820: 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e  set(&a[pParse->n
5830: 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61  zVar], 0, (x-pPa
5840: 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65  rse->nzVar)*size
5850: 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20  of(a[0]));.     
5860: 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72     pParse->nzVar
5870: 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = x;.      }.  
5880: 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f      if( z[0]!='?
5890: 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ' || pParse->azV
58a0: 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  ar[x-1]==0 ){.  
58b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
58c0: 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ree(db, pParse->
58d0: 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20  azVar[x-1]);.   
58e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
58f0: 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65  ar[x-1] = sqlite
5900: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a  3DbStrNDup(db, z
5910: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
5920: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21    }.  } .  if( !
5930: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20  pParse->nErr && 
5940: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d  pParse->nVar>db-
5950: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
5960: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
5970: 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c  MBER] ){.    sql
5980: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5990: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53  rse, "too many S
59a0: 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a  QL variables");.
59b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
59c0: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
59d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
59e0: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
59f0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 73 71  te3ExprDelete(sq
5a00: 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
5a10: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
5a20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53  ) return;.  /* S
5a30: 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73  anity check: Ass
5a40: 65 72 74 20 74 68 61 74 20 74 68 65 20 49 6e 74  ert that the Int
5a50: 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  Value is non-neg
5a60: 61 74 69 76 65 20 69 66 20 69 74 20 65 78 69 73  ative if it exis
5a70: 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
5a80: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5a90: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
5aa0: 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e   || p->u.iValue>
5ab0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70  =0 );.  if( !Exp
5ac0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5ad0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
5ae0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72  .    /* The Expr
5af0: 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65  .x union is neve
5b00: 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73 61  r used at the sa
5b10: 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e  me time as Expr.
5b20: 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73  pRight */.    as
5b30: 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74  sert( p->x.pList
5b40: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  ==0 || p->pRight
5b50: 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
5b60: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5b70: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20   p->pLeft);.    
5b80: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5b90: 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29  e(db, p->pRight)
5ba0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
5bb0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5bc0: 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69  MemToken) ) sqli
5bd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
5be0: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
5bf0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5c00: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
5c10: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ect) ){.      sq
5c20: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
5c30: 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65  e(db, p->x.pSele
5c40: 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ct);.    }else{.
5c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5c60: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5c70: 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  p->x.pList);.   
5c80: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78   }.  }.  if( !Ex
5c90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5ca0: 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20   EP_Static) ){. 
5cb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5cc0: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, p);.  }.}..
5cd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5ce0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5cf0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
5d00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74  he expression st
5d10: 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73  ructure .** pass
5d20: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
5d30: 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69  argument. This i
5d40: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20  s always one of 
5d50: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a  EXPR_FULLSIZE,.*
5d60: 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  * EXPR_REDUCEDSI
5d70: 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e  ZE or EXPR_TOKEN
5d80: 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61  ONLYSIZE..*/.sta
5d90: 74 69 63 20 69 6e 74 20 65 78 70 72 53 74 72 75  tic int exprStru
5da0: 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b  ctSize(Expr *p){
5db0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
5dc0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
5dd0: 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e  enOnly) ) return
5de0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
5df0: 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48  IZE;.  if( ExprH
5e00: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5e10: 5f 52 65 64 75 63 65 64 29 20 29 20 72 65 74 75  _Reduced) ) retu
5e20: 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45 44 53  rn EXPR_REDUCEDS
5e30: 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58  IZE;.  return EX
5e40: 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a  PR_FULLSIZE;.}..
5e50: 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45  /*.** The dupedE
5e60: 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69  xpr*Size() routi
5e70: 6e 65 73 20 65 61 63 68 20 72 65 74 75 72 6e 20  nes each return 
5e80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5e90: 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  tes required.** 
5ea0: 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20  to store a copy 
5eb0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
5ec0: 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74   or expression t
5ed0: 72 65 65 2e 20 20 54 68 65 79 20 64 69 66 66 65  ree.  They diffe
5ee0: 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68  r in.** how much
5ef0: 20 6f 66 20 74 68 65 20 74 72 65 65 20 69 73 20   of the tree is 
5f00: 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  measured..**.** 
5f10: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 74 72      dupedExprStr
5f20: 75 63 74 53 69 7a 65 28 29 20 20 20 20 20 53 69  uctSize()     Si
5f30: 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45  ze of only the E
5f40: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a  xpr structure .*
5f50: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 4e  *     dupedExprN
5f60: 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20 20 20  odeSize()       
5f70: 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73  Size of Expr + s
5f80: 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a  pace for token.*
5f90: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5fa0: 69 7a 65 28 29 20 20 20 20 20 20 20 20 20 20 20  ize()           
5fb0: 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73  Expr + token + s
5fc0: 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74  ubtree component
5fd0: 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.**.***********
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: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64  .**.** The duped
6030: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
6040: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6050: 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d  s two values OR-
6060: 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a  ed together:  .*
6070: 2a 20 28 31 29 20 74 68 65 20 73 70 61 63 65 20  * (1) the space 
6080: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 63  required for a c
6090: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 20  opy of the Expr 
60a0: 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61  structure only a
60b0: 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45  nd .** (2) the E
60c0: 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68 61 74  P_xxx flags that
60d0: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
60e0: 68 65 20 73 74 72 75 63 74 75 72 65 20 73 69 7a  he structure siz
60f0: 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20  e should be..** 
6100: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
6110: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
6120: 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45  of:.**.**      E
6130: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20  XPR_FULLSIZE.** 
6140: 20 20 20 20 20 45 58 50 52 5f 52 45 44 55 43 45       EXPR_REDUCE
6150: 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64  DSIZE   | EP_Red
6160: 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50  uced.**      EXP
6170: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20  R_TOKENONLYSIZE 
6180: 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a  | EP_TokenOnly.*
6190: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
61a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63   the structure c
61b0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
61c0: 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72  asking the retur
61d0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  n value.** of th
61e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
61f0: 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67  0xfff.  The flag
6200: 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  s can be found b
6210: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a  y masking the.**
6220: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
6230: 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  th EP_Reduced|EP
6240: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a  _TokenOnly..**.*
6250: 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68  * Note that with
6260: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
6270: 52 45 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75  REDUCE, this rou
6280: 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66  tines works on f
6290: 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72  ull-size.** (unr
62a0: 65 64 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a  educed) Expr obj
62b0: 65 63 74 73 20 61 73 20 74 68 65 79 20 6f 72 20  ects as they or 
62c0: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74  originally const
62d0: 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61  ructed by the pa
62e0: 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  rser..** During 
62f0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79  expression analy
6300: 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72  sis, extra infor
6310: 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74  mation is comput
6320: 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74  ed and moved int
6330: 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73  o.** later parts
6340: 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a   of teh Expr obj
6350: 65 63 74 20 61 6e 64 20 74 68 61 74 20 65 78 74  ect and that ext
6360: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d  ra information m
6370: 69 67 68 74 20 67 65 74 20 63 68 6f 70 70 65 64  ight get chopped
6380: 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65  .** off if the e
6390: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64  xpression is red
63a0: 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  uced.  Note also
63b0: 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
63c0: 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b  t work to.** mak
63d0: 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44  e an EXPRDUP_RED
63e0: 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65  UCE copy of a re
63f0: 64 75 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e  duced expression
6400: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65  .  It is only le
6410: 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65  gal.** to reduce
6420: 20 61 20 70 72 69 73 74 69 6e 65 20 65 78 70 72   a pristine expr
6430: 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d  ession tree from
6440: 20 74 68 65 20 70 61 72 73 65 72 2e 20 20 54 68   the parser.  Th
6450: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
6460: 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72  .** of dupedExpr
6470: 53 74 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e  StructSize() con
6480: 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73  tain multiple as
6490: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
64a0: 73 20 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a  s that attempt.*
64b0: 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69  * to enforce thi
64c0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f  s constraint..*/
64d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
64e0: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
64f0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6500: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65  gs){.  int nSize
6510: 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
6520: 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43  s==EXPRDUP_REDUC
6530: 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b  E || flags==0 );
6540: 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61   /* Only one fla
6550: 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20  g value allowed 
6560: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 58 50  */.  assert( EXP
6570: 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66  R_FULLSIZE<=0xff
6580: 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  f );.  assert( (
6590: 30 78 66 66 66 20 26 20 28 45 50 5f 52 65 64 75  0xfff & (EP_Redu
65a0: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
65b0: 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30  ))==0 );.  if( 0
65c0: 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44 55 50  ==(flags&EXPRDUP
65d0: 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20  _REDUCE) ){.    
65e0: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c  nSize = EXPR_FUL
65f0: 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LSIZE;.  }else{.
6600: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
6610: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6620: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
6630: 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
6640: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
6650: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
6660: 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20  romJoin) ); .   
6670: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
6680: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
6690: 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  MemToken) );.   
66a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
66b0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
66c0: 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20  NoReduce) );.   
66d0: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c   if( p->pLeft ||
66e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20   p->x.pList ){. 
66f0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50       nSize = EXP
6700: 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20  R_REDUCEDSIZE | 
6710: 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20  EP_Reduced;.    
6720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
6730: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d  ert( p->pRight==
6740: 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 );.      nSize
6750: 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c   = EXPR_TOKENONL
6760: 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e  YSIZE | EP_Token
6770: 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Only;.    }.  }.
6780: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
6790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
67a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
67b0: 68 65 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  he space in byte
67c0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
67d0: 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a  ore the copy .**
67e0: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
67f0: 75 63 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70  ucture and a cop
6800: 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e  y of the Expr.u.
6810: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6820: 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67  f that.** string
6830: 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f   is defined.).*/
6840: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65  .static int dupe
6850: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78  dExprNodeSize(Ex
6860: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
6870: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
6880: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
6890: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26  Size(p, flags) &
68a0: 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45   0xfff;.  if( !E
68b0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
68c0: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
68d0: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
68e0: 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71  .    nByte += sq
68f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
6900: 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20  >u.zToken)+1;.  
6910: 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  }.  return ROUND
6920: 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  8(nByte);.}../*.
6930: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
6940: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
6950: 71 75 69 72 65 64 20 74 6f 20 63 72 65 61 74 65  quired to create
6960: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
6970: 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  the .** expressi
6980: 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
6990: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
69a0: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
69b0: 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73  ment is a.** mas
69c0: 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50  k containing EXP
69d0: 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a  RDUP_XXX flags..
69e0: 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
69f0: 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65  returned include
6a00: 73 20 73 70 61 63 65 20 74 6f 20 63 72 65 61 74  s space to creat
6a10: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
6a20: 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69  Expr struct.** i
6a30: 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75  tself and the bu
6a40: 66 66 65 72 20 72 65 66 65 72 72 65 64 20 74 6f  ffer referred to
6a50: 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65   by Expr.u.zToke
6a60: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  n, if any..**.**
6a70: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
6a80: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
6a90: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  et, then the ret
6aa0: 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64  urn value includ
6ab0: 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20  es .** space to 
6ac0: 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78  duplicate all Ex
6ad0: 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20  pr nodes in the 
6ae0: 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45  tree formed by E
6af0: 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e  xpr.pLeft .** an
6b00: 64 20 45 78 70 72 2e 70 52 69 67 68 74 20 76 61  d Expr.pRight va
6b10: 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74  riables (but not
6b20: 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75   for any structu
6b30: 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f  res pointed to o
6b40: 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20  r .** descended 
6b50: 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e  from the Expr.x.
6b60: 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e  pList or Expr.x.
6b70: 70 53 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65  pSelect variable
6b80: 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s)..*/.static in
6b90: 74 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  t dupedExprSize(
6ba0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6bb0: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6bc0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
6bd0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70  .    nByte = dup
6be0: 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70  edExprNodeSize(p
6bf0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
6c00: 28 20 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f  ( flags&EXPRDUP_
6c10: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20  REDUCE ){.      
6c20: 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78  nByte += dupedEx
6c30: 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c  prSize(p->pLeft,
6c40: 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45   flags) + dupedE
6c50: 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68  xprSize(p->pRigh
6c60: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  t, flags);.    }
6c70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42  .  }.  return nB
6c80: 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  yte;.}../*.** Th
6c90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
6ca0: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
6cb0: 33 45 78 70 72 44 75 70 28 29 2c 20 65 78 63 65  3ExprDup(), exce
6cc0: 70 74 20 74 68 61 74 20 69 66 20 70 7a 42 75 66  pt that if pzBuf
6cd0: 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e  fer .** is not N
6ce0: 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66  ULL then *pzBuff
6cf0: 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
6d00: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
6d10: 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  er large enough 
6d20: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65  .** to store the
6d30: 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73   copy of express
6d40: 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65  ion p, the copie
6d50: 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  s of p->u.zToken
6d60: 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62  .** (if applicab
6d70: 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70  le), and the cop
6d80: 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c  ies of the p->pL
6d90: 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68  eft and p->pRigh
6da0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  t expressions,.*
6db0: 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65  * if any. Before
6dc0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42   returning, *pzB
6dd0: 75 66 66 65 72 20 69 73 20 73 65 74 20 74 6f 20  uffer is set to 
6de0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
6df0: 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69  ast the.** porti
6e00: 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  on of the buffer
6e10: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20   copied into by 
6e20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
6e30: 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 65  /.static Expr *e
6e40: 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a  xprDup(sqlite3 *
6e50: 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74  db, Expr *p, int
6e60: 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42   flags, u8 **pzB
6e70: 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a  uffer){.  Expr *
6e80: 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  pNew = 0;       
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ea0: 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
6eb0: 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a  n */.  if( p ){.
6ec0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
6ed0: 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73  Reduced = (flags
6ee0: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29  &EXPRDUP_REDUCE)
6ef0: 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63  ;.    u8 *zAlloc
6f00: 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74 69 63  ;.    u32 static
6f10: 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61  Flag = 0;..    a
6f20: 73 73 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d  ssert( pzBuffer=
6f30: 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20  =0 || isReduced 
6f40: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  );..    /* Figur
6f50: 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77  e out where to w
6f60: 72 69 74 65 20 74 68 65 20 6e 65 77 20 45 78 70  rite the new Exp
6f70: 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  r structure. */.
6f80: 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65 72      if( pzBuffer
6f90: 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63   ){.      zAlloc
6fa0: 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20   = *pzBuffer;.  
6fb0: 20 20 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d      staticFlag =
6fc0: 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20   EP_Static;.    
6fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c  }else{.      zAl
6fe0: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
6ff0: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70  allocRaw(db, dup
7000: 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c  edExprSize(p, fl
7010: 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ags));.    }.   
7020: 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29   pNew = (Expr *)
7030: 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28  zAlloc;..    if(
7040: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f   pNew ){.      /
7050: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
7060: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
7070: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
7080: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
7090: 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e  o.      ** by pN
70a0: 65 77 2e 20 54 68 69 73 20 69 73 20 65 69 74 68  ew. This is eith
70b0: 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  er EXPR_FULLSIZE
70c0: 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  , EXPR_REDUCEDSI
70d0: 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45  ZE or.      ** E
70e0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
70f0: 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74  E. nToken is set
7100: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
7110: 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64  f bytes consumed
7120: 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65  .      ** by the
7130: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e   copy of the p->
7140: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
7150: 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20  (if any)..      
7160: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
7170: 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53  nsigned nStructS
7180: 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  ize = dupedExprS
7190: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
71a0: 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  gs);.      const
71b0: 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20   int nNewSize = 
71c0: 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 30 78  nStructSize & 0x
71d0: 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  fff;.      int n
71e0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  Token;.      if(
71f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7200: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
7210: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
7220: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b   ){.        nTok
7230: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
7240: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
7250: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  ) + 1;.      }el
7260: 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b  se{.        nTok
7270: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  en = 0;.      }.
7280: 20 20 20 20 20 20 69 66 28 20 69 73 52 65 64 75        if( isRedu
7290: 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ced ){.        a
72a0: 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72  ssert( ExprHasPr
72b0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64  operty(p, EP_Red
72c0: 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  uced)==0 );.    
72d0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f      memcpy(zAllo
72e0: 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b  c, p, nNewSize);
72f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7300: 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20        int nSize 
7310: 3d 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65  = exprStructSize
7320: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (p);.        mem
7330: 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e  cpy(zAlloc, p, n
7340: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  Size);.        m
7350: 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53  emset(&zAlloc[nS
7360: 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55  ize], 0, EXPR_FU
7370: 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20  LLSIZE-nSize);. 
7380: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
7390: 20 53 65 74 20 74 68 65 20 45 50 5f 52 65 64 75   Set the EP_Redu
73a0: 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ced, EP_TokenOnl
73b0: 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63  y, and EP_Static
73c0: 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61   flags appropria
73d0: 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70  tely. */.      p
73e0: 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28  New->flags &= ~(
73f0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
7400: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69  kenOnly|EP_Stati
7410: 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a  c|EP_MemToken);.
7420: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7430: 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  s |= nStructSize
7440: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
7450: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20  P_TokenOnly);.  
7460: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
7470: 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a  |= staticFlag;..
7480: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
7490: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
74a0: 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ring, if any. */
74b0: 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  .      if( nToke
74c0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  n ){.        cha
74d0: 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77  r *zToken = pNew
74e0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
74f0: 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77  ar*)&zAlloc[nNew
7500: 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d  Size];.        m
7510: 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d  emcpy(zToken, p-
7520: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  >u.zToken, nToke
7530: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  n);.      }..   
7540: 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66     if( 0==((p->f
7550: 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73  lags|pNew->flags
7560: 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ) & EP_TokenOnly
7570: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
7580: 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77  Fill in the pNew
7590: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70  ->x.pSelect or p
75a0: 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d  New->x.pList mem
75b0: 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ber. */.        
75c0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
75d0: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
75e0: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
75f0: 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63    pNew->x.pSelec
7600: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
7610: 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53  tDup(db, p->x.pS
7620: 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63 65 64  elect, isReduced
7630: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
7640: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
7650: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ->x.pList = sqli
7660: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
7670: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  b, p->x.pList, i
7680: 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20  sReduced);.     
7690: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
76a0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70      /* Fill in p
76b0: 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70  New->pLeft and p
76c0: 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a  New->pRight. */.
76d0: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
76e0: 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  sProperty(pNew, 
76f0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
7700: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
7710: 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75      zAlloc += du
7720: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
7730: 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  p, flags);.     
7740: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
7750: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
7760: 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20  Reduced) ){.    
7770: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
7780: 74 20 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20  t = exprDup(db, 
7790: 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55  p->pLeft, EXPRDU
77a0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
77b0: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  c);.          pN
77c0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70  ew->pRight = exp
77d0: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
77e0: 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ht, EXPRDUP_REDU
77f0: 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20  CE, &zAlloc);.  
7800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7810: 69 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a  if( pzBuffer ){.
7820: 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66            *pzBuf
7830: 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20  fer = zAlloc;.  
7840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7850: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
7860: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
7870: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
7880: 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
7890: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
78a0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
78b0: 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20   p->pLeft, 0);. 
78c0: 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
78d0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
78e0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
78f0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
7900: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
7910: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7920: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pNew;.}../*.** C
7930: 72 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  reate and return
7940: 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20   a deep copy of 
7950: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
7960: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
7970: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  .** argument. If
7980: 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   an OOM conditio
7990: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
79a0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
79b0: 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62  ed.** and the db
79c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
79d0: 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e  lag set..*/.#ifn
79e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
79f0: 43 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20  CTE.static With 
7a00: 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33  *withDup(sqlite3
7a10: 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a   *db, With *p){.
7a20: 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30    With *pRet = 0
7a30: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7a40: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
7a50: 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
7a60: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
7a70: 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65  nCte-1);.    pRe
7a80: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
7a90: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
7aa0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74  e);.    if( pRet
7ab0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
7ac0: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74  .      pRet->nCt
7ad0: 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20  e = p->nCte;.   
7ae0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7af0: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
7b00: 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e       pRet->a[i].
7b10: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
7b20: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
7b30: 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20  ->a[i].pSelect, 
7b40: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  0);.        pRet
7b50: 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73  ->a[i].pCols = s
7b60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
7b70: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43  p(db, p->a[i].pC
7b80: 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ols, 0);.       
7b90: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d   pRet->a[i].zNam
7ba0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
7bb0: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7bc0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
7bd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7be0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65  rn pRet;.}.#else
7bf0: 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75  .# define withDu
7c00: 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a  p(x,y) 0.#endif.
7c10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
7c20: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
7c30: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
7c40: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
7c50: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
7c60: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
7c70: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
7c80: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
7c90: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
7ca0: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
7cb0: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
7cc0: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
7cd0: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
7ce0: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
7cf0: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
7d00: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
7d10: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7d20: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
7d30: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
7d40: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
7d50: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
7d60: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
7d70: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
7d80: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
7d90: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
7da0: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
7db0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
7dc0: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
7dd0: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
7de0: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
7df0: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
7e00: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
7e10: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
7e20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
7e30: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
7e40: 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61  ntains a combina
7e50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52  tion of the EXPR
7e60: 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a  DUP_XXX flags..*
7e70: 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50  * If the EXPRDUP
7e80: 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20  _REDUCE flag is 
7e90: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74  set, then the st
7ea0: 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64  ructure returned
7eb0: 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74   is a.** truncat
7ec0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
7ed0: 65 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72  e usual Expr str
7ee0: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
7ef0: 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a   be stored as.**
7f00: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d   part of the in-
7f10: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
7f20: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
7f30: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f  abase schema..*/
7f40: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
7f50: 70 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  prDup(sqlite3 *d
7f60: 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  b, Expr *p, int 
7f70: 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e  flags){.  return
7f80: 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20   exprDup(db, p, 
7f90: 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70  flags, 0);.}.Exp
7fa0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
7fb0: 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  prListDup(sqlite
7fc0: 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20  3 *db, ExprList 
7fd0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7fe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
7ff0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
8000: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
8010: 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e   *pOldItem;.  in
8020: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
8030: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8040: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
8050: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
8060: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
8070: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8080: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
8090: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
80a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
80b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
80c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
80d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
80e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
80f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
8100: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8110: 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b    i*sizeof(p->a[
8120: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
8130: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
8140: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8150: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
8160: 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49   0;.  } .  pOldI
8170: 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f  tem = p->a;.  fo
8180: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
8190: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c  r; i++, pItem++,
81a0: 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20   pOldItem++){.  
81b0: 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72    Expr *pOldExpr
81c0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78   = pOldItem->pEx
81d0: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  pr;.    pItem->p
81e0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
81f0: 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78  prDup(db, pOldEx
8200: 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  pr, flags);.    
8210: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
8220: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
8230: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  b, pOldItem->zNa
8240: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
8250: 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
8260: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8270: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
8280: 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64    pItem->sortOrd
8290: 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73  er = pOldItem->s
82a0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
82b0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
82c0: 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49     pItem->bSpanI
82d0: 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  sTab = pOldItem-
82e0: 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20  >bSpanIsTab;.   
82f0: 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64   pItem->u = pOld
8300: 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72  Item->u;.  }.  r
8310: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
8320: 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c  *.** If cursors,
8330: 20 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73   triggers, views
8340: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
8350: 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20  are all omitted 
8360: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c  from.** the buil
8370: 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20  d, then none of 
8380: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
8390: 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66  utines, except f
83a0: 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  or .** sqlite3Se
83b0: 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62  lectDup(), can b
83c0: 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65  e called. sqlite
83d0: 33 53 65 6c 65 63 74 44 75 70 28 29 20 69 73 20  3SelectDup() is 
83e0: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c  sometimes.** cal
83f0: 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  led with a NULL 
8400: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
8410: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8420: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
8430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8440: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20  MIT_TRIGGER) \. 
8450: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
8460: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8470: 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  ).SrcList *sqlit
8480: 65 33 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c  e3SrcListDup(sql
8490: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
84a0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
84b0: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  {.  SrcList *pNe
84c0: 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  w;.  int i;.  in
84d0: 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70  t nByte;.  if( p
84e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
84f0: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
8500: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
8510: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
8520: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
8530: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
8540: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8550: 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  Raw(db, nByte );
8560: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8570: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8580: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
8590: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
85a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
85b0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
85c0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
85d0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
85e0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
85f0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
8600: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
8610: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
8620: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
8630: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68    pNewItem->pSch
8640: 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ema = pOldItem->
8650: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65  pSchema;.    pNe
8660: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
8670: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8680: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8690: 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
86a0: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
86b0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
86c0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
86d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  >zName);.    pNe
86e0: 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  wItem->zAlias = 
86f0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8700: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41  db, pOldItem->zA
8710: 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lias);.    pNewI
8720: 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74  tem->fg = pOldIt
8730: 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77  em->fg;.    pNew
8740: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
8750: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
8760: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
8770: 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70  >addrFillSub = p
8780: 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  OldItem->addrFil
8790: 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74  lSub;.    pNewIt
87a0: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
87b0: 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74  pOldItem->regRet
87c0: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  urn;.    if( pNe
87d0: 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65  wItem->fg.isInde
87e0: 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20 20 70  xedBy ){.      p
87f0: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  NewItem->u1.zInd
8800: 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33  exedBy = sqlite3
8810: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c  DbStrDup(db, pOl
8820: 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  dItem->u1.zIndex
8830: 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  edBy);.    }.   
8840: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e   pNewItem->pIBIn
8850: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
8860: 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20 69 66  pIBIndex;.    if
8870: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69  ( pNewItem->fg.i
8880: 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20  sTabFunc ){.    
8890: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70    pNewItem->u1.p
88a0: 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20 20 20  FuncArg = .     
88b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
88c0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
88d0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
88e0: 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  g, flags);.    }
88f0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e 65 77  .    pTab = pNew
8900: 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c  Item->pTab = pOl
8910: 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  dItem->pTab;.   
8920: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
8930: 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
8940: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49  .    }.    pNewI
8950: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  tem->pSelect = s
8960: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
8970: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  db, pOldItem->pS
8980: 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20  elect, flags);. 
8990: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
89a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
89b0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
89c0: 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  pOn, flags);.   
89d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
89e0: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
89f0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
8a00: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
8a10: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
8a20: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
8a30: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
8a40: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
8a50: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
8a60: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8a70: 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20  , IdList *p){.  
8a80: 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  IdList *pNew;.  
8a90: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8aa0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8ab0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8ac0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8ad0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8ae0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8af0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8b00: 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  >nId = p->nId;. 
8b10: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
8b20: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8b30: 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  , p->nId*sizeof(
8b40: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
8b50: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a  ( pNew->a==0 ){.
8b60: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8b70: 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  e(db, pNew);.   
8b80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
8b90: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65   /* Note that be
8ba0: 63 61 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f  cause the size o
8bb0: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
8bc0: 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e   for p->a[] is n
8bd0: 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72  ot.  ** necessar
8be0: 69 6c 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74  ily a power of t
8bf0: 77 6f 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73  wo, sqlite3IdLis
8c00: 74 41 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f  tAppend() may no
8c10: 74 20 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a  t be called.  **
8c20: 20 6f 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74   on the duplicat
8c30: 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  e created by thi
8c40: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20  s function. */. 
8c50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8c60: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
8c70: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
8c80: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
8c90: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
8ca0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
8cb0: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
8cc0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
8cd0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
8ce0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
8cf0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
8d00: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8d10: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
8d20: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
8d30: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
8d40: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
8d50: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
8d60: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
8d70: 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74  flags){.  Select
8d80: 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b   *pNew, *pPrior;
8d90: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8da0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
8db0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8dc0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
8dd0: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
8de0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8df0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
8e00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8e10: 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  Dup(db, p->pELis
8e20: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
8e30: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
8e40: 33 53 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20  3SrcListDup(db, 
8e50: 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b  p->pSrc, flags);
8e60: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
8e70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8e80: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  (db, p->pWhere, 
8e90: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8ea0: 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
8eb0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
8ec0: 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66  , p->pGroupBy, f
8ed0: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8ee0: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
8ef0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8f00: 48 61 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a  Having, flags);.
8f10: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
8f20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
8f30: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
8f40: 64 65 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20  derBy, flags);. 
8f50: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f   pNew->op = p->o
8f60: 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  p;.  pNew->pPrio
8f70: 72 20 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c  r = pPrior = sql
8f80: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
8f90: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61  , p->pPrior, fla
8fa0: 67 73 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  gs);.  if( pPrio
8fb0: 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  r ) pPrior->pNex
8fc0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
8fd0: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
8fe0: 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  New->pLimit = sq
8ff0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9000: 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67   p->pLimit, flag
9010: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  s);.  pNew->pOff
9020: 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  set = sqlite3Exp
9030: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66  rDup(db, p->pOff
9040: 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  set, flags);.  p
9050: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
9060: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
9070: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65   = 0;.  pNew->se
9080: 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46  lFlags = p->selF
9090: 6c 61 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45  lags & ~SF_UsesE
90a0: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77  phemeral;.  pNew
90b0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
90c0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
90d0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
90e0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
90f0: 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53  electRow = p->nS
9100: 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77  electRow;.  pNew
9110: 2d 3e 70 57 69 74 68 20 3d 20 77 69 74 68 44 75  ->pWith = withDu
9120: 70 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b  p(db, p->pWith);
9130: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
9140: 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d  SetName(pNew, p-
9150: 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65  >zSelName);.  re
9160: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c  turn pNew;.}.#el
9170: 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  se.Select *sqlit
9180: 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69  e3SelectDup(sqli
9190: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
91a0: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
91b0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
91c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
91d0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
91e0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
91f0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
9200: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
9210: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
9220: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
9230: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
9240: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
9250: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  list..**.** If a
9260: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
9270: 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  on error occurs,
9280: 20 74 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74   the entire list
9290: 20 69 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a   is freed and.**
92a0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
92b0: 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20  d.  If non-NULL 
92c0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
92d0: 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
92e0: 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  ed.** that the n
92f0: 65 77 20 65 6e 74 72 79 20 77 61 73 20 73 75 63  ew entry was suc
9300: 63 65 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64  cessfully append
9310: 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  ed..*/.ExprList 
9320: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
9330: 41 70 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20  Append(.  Parse 
9340: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9350: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9360: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9370: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
9380: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
9390: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
93a0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
93b0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
93c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
93d0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70  ession to be app
93e0: 65 6e 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20  ended. Might be 
93f0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
9400: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9410: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4c 69  e->db;.  if( pLi
9420: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
9430: 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
9440: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
9450: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
9460: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
9470: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
9480: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
9490: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
94a0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
94b0: 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74  db, sizeof(pList
94c0: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
94d0: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20  ( pList->a==0 ) 
94e0: 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d  goto no_mem;.  }
94f0: 65 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d  else if( (pList-
9500: 3e 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d  >nExpr & (pList-
9510: 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b  >nExpr-1))==0 ){
9520: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
9530: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
9540: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9550: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
9560: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  a = sqlite3DbRea
9570: 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e  lloc(db, pList->
9580: 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a  a, pList->nExpr*
9590: 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  2*sizeof(pList->
95a0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
95b0: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  a==0 ){.      go
95c0: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
95d0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
95e0: 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  a;.  }.  assert(
95f0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a   pList->a!=0 );.
9600: 20 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73    if( 1 ){.    s
9610: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9620: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
9630: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9640: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
9650: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
9660: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
9670: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
9680: 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65   pExpr;.  }.  re
9690: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f  turn pList;..no_
96a0: 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41  mem:     .  /* A
96b0: 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d  void leaking mem
96c0: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61  ory if malloc ha
96d0: 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73  s failed. */.  s
96e0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
96f0: 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73  (db, pExpr);.  s
9700: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9710: 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
9720: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
9730: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
9740: 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  prList.a[].zName
9750: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
9760: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9770: 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74  ded item.** on t
9780: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
9790: 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  st..**.** pList 
97a0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f  might be NULL fo
97b0: 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65  llowing an OOM e
97c0: 72 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65  rror.  But pName
97d0: 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
97e0: 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20  .** NULL.  If a 
97f0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
9800: 6e 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61  n fails, the pPa
9810: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
9820: 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73  ailed flag.** is
9830: 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
9840: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
9850: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
9860: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
9870: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9880: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
9890: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
98a0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
98b0: 20 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e   to add the span
98c0: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  . */.  Token *pN
98d0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
98e0: 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64  * Name to be add
98f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75  ed */.  int dequ
9900: 6f 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ote             
9910: 2f 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65  /* True to cause
9920: 20 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20   the name to be 
9930: 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20  dequoted */.){. 
9940: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
9950: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
9960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
9970: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
9980: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9990: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
99a0: 65 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  em;.    assert( 
99b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
99c0: 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70  ;.    pItem = &p
99d0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
99e0: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
99f0: 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ert( pItem->zNam
9a00: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65  e==0 );.    pIte
9a10: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
9a20: 65 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72  e3DbStrNDup(pPar
9a30: 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a  se->db, pName->z
9a40: 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20  , pName->n);.   
9a50: 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20   if( dequote && 
9a60: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73  pItem->zName ) s
9a70: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49  qlite3Dequote(pI
9a80: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  tem->zName);.  }
9a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9aa0: 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  e ExprList.a[].z
9ab0: 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  Span element of 
9ac0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
9ad0: 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20  y added item.** 
9ae0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
9af0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  n list..**.** pL
9b00: 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c  ist might be NUL
9b10: 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f  L following an O
9b20: 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70  OM error.  But p
9b30: 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65  Span should neve
9b40: 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49  r be.** NULL.  I
9b50: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9b60: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65  ation fails, the
9b70: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
9b80: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a  locFailed flag.*
9b90: 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  * is set..*/.voi
9ba0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
9bb0: 74 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73  tSetSpan(.  Pars
9bc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
9bd0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9be0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9bf0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
9c00: 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77      /* List to w
9c10: 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20  hich to add the 
9c20: 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53  span. */.  ExprS
9c30: 70 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20  pan *pSpan      
9c40: 20 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74     /* The span t
9c50: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b  o be added */.){
9c60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9c70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
9c80: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
9c90: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
9ca0: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
9cb0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
9cc0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9cd0: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
9ce0: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
9cf0: 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  r-1];.    assert
9d00: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
9d10: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9d20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9d30: 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72   || pItem->pExpr
9d40: 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29  ==pSpan->pExpr )
9d50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
9d60: 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
9d70: 53 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d  Span);.    pItem
9d80: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
9d90: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9da0: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9db0: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
9de0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9df0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
9e00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
9e10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9e20: 74 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e  t pEList contain
9e30: 73 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d  s more than iLim
9e40: 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20  it elements,.** 
9e50: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
9e60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
9e70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9e80: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
9e90: 6e 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70  ngth(.  Parse *p
9ea0: 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
9eb0: 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e  t *pEList,.  con
9ec0: 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74  st char *zObject
9ed0: 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70  .){.  int mx = p
9ee0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
9ef0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
9f00: 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61  OLUMN];.  testca
9f10: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
9f20: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20  List->nExpr==mx 
9f30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
9f40: 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
9f50: 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a  >nExpr==mx+1 );.
9f60: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
9f70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78  pEList->nExpr>mx
9f80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9f90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9fa0: 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
9fb0: 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63  s in %s", zObjec
9fc0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
9fd0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
9fe0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9ff0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
a000: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a010: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
a020: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
a030: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
a040: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
a050: 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
a060: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
a070: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
a080: 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ->a!=0 || pList-
a090: 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66  >nExpr==0 );.  f
a0a0: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
a0b0: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
a0c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
a0d0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
a0e0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a0f0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
a100: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a110: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  e(db, pItem->zNa
a120: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
a130: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
a140: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20  ->zSpan);.  }.  
a150: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a160: 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  , pList->a);.  s
a170: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a180: 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
a190: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74  * Return the bit
a1a0: 77 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45  wise-OR of all E
a1b0: 78 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73  xpr.flags fields
a1c0: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   in the given.**
a1d0: 20 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33   ExprList..*/.u3
a1e0: 32 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  2 sqlite3ExprLis
a1f0: 74 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70  tFlags(const Exp
a200: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
a210: 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20   int i;.  u32 m 
a220: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  = 0;.  if( pList
a230: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
a240: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
a250: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78   i++){.       Ex
a260: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
a270: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
a280: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
a290: 28 70 45 78 70 72 29 20 29 20 6d 20 7c 3d 20 70  (pExpr) ) m |= p
a2a0: 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  Expr->flags;.   
a2b0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a2c0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  m;.}../*.** Thes
a2d0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57  e routines are W
a2e0: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  alker callbacks 
a2f0: 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78  used to check ex
a300: 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20  pressions to.** 
a310: 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20  see if they are 
a320: 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73  "constant" for s
a330: 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  ome definition o
a340: 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65  f constant.  The
a350: 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  .** Walker.eCode
a360: 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65   value determine
a370: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63  s the type of "c
a380: 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20  onstant" we are 
a390: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a  looking.** for..
a3a0: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
a3b0: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
a3c0: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
a3d0: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
a3e0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
a3f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a400: 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20  nt()            
a410: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
a420: 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73  Code==1.**     s
a430: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a440: 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20  tantNotJoin()   
a450: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a460: 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20  >eCode==2.**    
a470: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61   sqlite3ExprIsTa
a480: 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20  bleConstant()   
a490: 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65            pWalke
a4a0: 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20  r->eCode==3.**  
a4b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73     sqlite3ExprIs
a4c0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a4d0: 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c  on()        pWal
a4e0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72  ker->eCode==4 or
a4f0: 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20   5.**.** In all 
a500: 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62  cases, the callb
a510: 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e  acks set Walker.
a520: 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72  eCode=0 and abor
a530: 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  t if the express
a540: 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20  ion.** is found 
a550: 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73  to not be a cons
a560: 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tant..**.** The 
a570: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a580: 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28  stantOrFunction(
a590: 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76  ) is used for ev
a5a0: 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73  aluating express
a5b0: 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45  ions.** in a CRE
a5c0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
a5d0: 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72  ent.  The Walker
a5e0: 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20  .eCode value is 
a5f0: 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a  5 when parsing.*
a600: 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63  * an existing sc
a610: 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20  hema and 4 when 
a620: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77  processing a new
a630: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62   statement.  A b
a640: 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
a650: 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f  r raises an erro
a660: 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d  r for new statem
a670: 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c  ents, but is sil
a680: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a  ently converted.
a690: 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65  ** to NULL for e
a6a0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e  xisting schemas.
a6b0: 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71    This allows sq
a6c0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
a6d0: 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74  es that .** cont
a6e0: 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61  ain a bound para
a6f0: 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68  meter because th
a700: 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65  ey were generate
a710: 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
a720: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
a730: 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79   to be parsed by
a740: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
a750: 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75  of SQLite withou
a760: 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d  t raising a.** m
a770: 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20  alformed schema 
a780: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
a790: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
a7a0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
a7b0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
a7c0: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
a7d0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69  pWalker->eCode i
a7e0: 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 2 then any ter
a7f0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
a800: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
a810: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
a820: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
a830: 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
a840: 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65  disqualifies the
a850: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
a860: 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73   from being cons
a870: 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e  idered constant.
a880: 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65   */.  if( pWalke
a890: 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45  r->eCode==2 && E
a8a0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a8b0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
a8c0: 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  n) ){.    pWalke
a8d0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
a8e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
a8f0: 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  rt;.  }..  switc
a900: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
a910: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
a920: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20  functions to be 
a930: 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20  constant if all 
a940: 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20  their arguments 
a950: 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20  are constant.   
a960: 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70   ** and either p
a970: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
a980: 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e   or 5 or the fun
a990: 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20  ction has the.  
a9a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43    ** SQLITE_FUNC
a9b0: 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a  _CONST flag. */.
a9c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
a9d0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20  TION:.      if( 
a9e0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d  pWalker->eCode>=
a9f0: 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70  4 || ExprHasProp
aa00: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
aa10: 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  nstFunc) ){.    
aa20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
aa30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
aa40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57  else{.        pW
aa50: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30  alker->eCode = 0
aa60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
aa70: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
aa80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
aa90: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
aaa0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
aab0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
aac0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
aad0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
aae0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
aaf0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
ab00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ab10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
ab20: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
ab30: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ab40: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
ab50: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
ab60: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ab70: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
ab80: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
ab90: 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70  r->eCode==3 && p
aba0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57  Expr->iTable==pW
abb0: 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b  alker->u.iCur ){
abc0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
abd0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
abe0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
abf0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
ac00: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
ac10: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ac20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73  .      }.    cas
ac30: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
ac40: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ac50: 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20  ->eCode==5 ){.  
ac60: 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c        /* Silentl
ac70: 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20  y convert bound 
ac80: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
ac90: 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66  appear inside of
aca0: 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20   CREATE.        
acb0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ** statements in
acc0: 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70  to a NULL when p
acd0: 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54  arsing the CREAT
ace0: 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74  E statement text
acf0: 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   out.        ** 
ad00: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  of the sqlite_ma
ad10: 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
ad20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
ad30: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
ad40: 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b   }else if( pWalk
ad50: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a  er->eCode==4 ){.
ad60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75          /* A bou
ad70: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20  nd parameter in 
ad80: 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  a CREATE stateme
ad90: 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  nt that originat
ada0: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20  es from.        
adb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  ** sqlite3_prepa
adc0: 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65  re() causes an e
add0: 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
ade0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
adf0: 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
ae00: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
ae10: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
ae20: 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  all through */. 
ae30: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
ae40: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
ae50: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
ae60: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
ae70: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
ae80: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
ae90: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
aea0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
aeb0: 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  S ); /* selectNo
aec0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
aed0: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
aee0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
aef0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73  ontinue;.  }.}.s
af00: 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74  tatic int select
af10: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
af20: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
af30: 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29  Select *NotUsed)
af40: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
af50: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
af60: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
af70: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
af80: 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69  C_Abort;.}.stati
af90: 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73  c int exprIsCons
afa0: 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  t(Expr *p, int i
afb0: 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75  nitFlag, int iCu
afc0: 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
afd0: 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
afe0: 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
aff0: 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67  eCode = initFlag
b000: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
b010: 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
b020: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53  Constant;.  w.xS
b030: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
b040: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
b050: 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72  tant;.  w.u.iCur
b060: 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74   = iCur;.  sqlit
b070: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
b080: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
b090: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ode;.}../*.** Wa
b0a0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b0b0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b0c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b0d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b0e0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
b0f0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
b100: 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74  riables or funct
b110: 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  ion calls..**.**
b120: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
b130: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
b140: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
b150: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
b160: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
b170: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
b180: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
b190: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
b1a0: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
b1b0: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
b1c0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
b1d0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
b1e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
b1f0: 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29  IsConst(p, 1, 0)
b200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
b210: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
b220: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
b230: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
b240: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
b250: 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  nt.** that does 
b260: 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f  no originate fro
b270: 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  m the ON or USIN
b280: 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a  G clauses of a j
b290: 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  oin..** Return 0
b2a0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
b2b0: 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e  variables or fun
b2c0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74  ction calls or t
b2d0: 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20  erms from.** an 
b2e0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
b2f0: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
b300: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
b310: 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29  NotJoin(Expr *p)
b320: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
b330: 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b  sConst(p, 2, 0);
b340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
b350: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b360: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
b370: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
b380: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
b390: 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
b3a0: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
b3b0: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
b3c0: 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
b3d0: 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
b3e0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
b3f0: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
b400: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
b410: 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
b420: 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
b430: 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
b440: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
b450: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
b460: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
b470: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
b480: 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
b490: 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ur);.}../*.** Wa
b4a0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b4b0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b4c0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b4d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b4e0: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
b4f0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
b500: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
b510: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
b520: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
b530: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
b540: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b550: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b560: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b570: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b580: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b590: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b5a0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b5b0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b5c0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b5d0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b5e0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b5f0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
b600: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
b610: 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
b620: 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
b630: 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
b640: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
b650: 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
b660: 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit, 0);.}../*.*
b670: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
b680: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
b690: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
b6a0: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
b6b0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
b6c0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b6d0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
b6e0: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
b6f0: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
b700: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
b710: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b720: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
b730: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
b740: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
b750: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
b760: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
b770: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
b780: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
b790: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b7a0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
b7b0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
b7c0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
b7d0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
b7e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
b7f0: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
b800: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
b810: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
b820: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
b830: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
b840: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
b850: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
b860: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
b870: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
b880: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
b890: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
b8a0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
b8b0: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
b8c0: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
b8d0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
b8e0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
b8f0: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
b900: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
b910: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
b920: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
b930: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b940: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
b950: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
b960: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
b970: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
b980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b990: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
b9a0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
b9b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
b9c0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b9d0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
b9e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
b9f0: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
ba00: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
ba10: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
ba20: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
ba30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ba40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
ba50: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
ba60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ba70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
ba80: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
ba90: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
baa0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
bab0: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
bac0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
bad0: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
bae0: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
baf0: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
bb00: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
bb10: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
bb20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bb30: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
bb40: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
bb50: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
bb60: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
bb70: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
bb80: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
bb90: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
bba0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
bbb0: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
bbc0: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
bbd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
bbe0: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
bbf0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
bc00: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
bc10: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
bc20: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
bc30: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
bc40: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
bc50: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
bc60: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
bc70: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
bc80: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
bc90: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
bca0: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
bcb0: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
bcc0: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
bcd0: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
bce0: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
bcf0: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
bd00: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
bd10: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
bd20: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
bd30: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
bd40: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
bd50: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
bd60: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
bd70: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
bd80: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
bd90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
bda0: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
bdb0: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
bdc0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
bdd0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
bde0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdf0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
be00: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
be10: 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p->pTab!=0 );.  
be20: 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
be30: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
be40: 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
be50: 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
be60: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
be70: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69  >pTab->aCol[p->i
be80: 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
be90: 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  =0);.    default
bea0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
beb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
bec0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
bed0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
bee0: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
bef0: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
bf00: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
bf10: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
bf20: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
bf30: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
bf40: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
bf50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bf60: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
bf70: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
bf80: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
bf90: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
bfa0: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
bfb0: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
bfc0: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
bfd0: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
bfe0: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
bff0: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
c000: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
c010: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
c020: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
c030: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
c040: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
c050: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
c060: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
c070: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
c080: 45 5f 41 46 46 5f 42 4c 4f 42 20 29 20 72 65 74  E_AFF_BLOB ) ret
c090: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
c0a0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
c0b0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
c0c0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
c0d0: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
c0e0: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
c0f0: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
c100: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
c110: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
c120: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
c130: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
c140: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
c150: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
c160: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c170: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c180: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
c190: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
c1a0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
c1b0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
c1c0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
c1d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
c1e0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
c1f0: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
c200: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
c210: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
c220: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c230: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
c240: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c260: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
c270: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
c280: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
c290: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
c2a0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
c2b0: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
c2c0: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
c2d0: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
c2e0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
c2f0: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
c300: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
c310: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c320: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c330: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c340: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
c350: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
c360: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
c370: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
c380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
c390: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
c3a0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
c3b0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
c3c0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
c3d0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
c3e0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
c3f0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
c400: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
c410: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
c420: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c430: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
c440: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
c450: 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  to the IN operat
c460: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
c470: 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66  on a.** query of
c480: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
c490: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
c4a0: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68  CT ...).**.** Wh
c4b0: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  ere the SELECT..
c4c0: 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73  . clause is as s
c4d0: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
c4e0: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
c4f0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  s.** routine..**
c500: 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f  .** The Select o
c510: 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20  bject passed in 
c520: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
c530: 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e   preprocessed an
c540: 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68  d no.** errors h
c550: 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a  ave been found..
c560: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c570: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c580: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
c590: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
c5a0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
c5b0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
c5c0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
c5d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c5e0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c5f0: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
c600: 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74          /* right
c610: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
c620: 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   is SELECT */.  
c630: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
c640: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c650: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
c660: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
c670: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
c680: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
c690: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
c6a0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
c6b0: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
c6c0: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
c6d0: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
c6e0: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
c6f0: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
c700: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
c710: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
c720: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
c730: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
c740: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
c750: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
c760: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
c770: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
c780: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
c790: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
c7a0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
c7b0: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
c7c0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
c7d0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7f0: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
c800: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
c810: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
c820: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c830: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
c840: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
c850: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
c860: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c870: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
c880: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
c890: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
c8a0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
c8b0: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
c8c0: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
c8d0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c8e0: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
c8f0: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
c900: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
c910: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
c920: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
c930: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
c940: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
c950: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
c960: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66  >a[0].pTab;.  if
c970: 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  ( NEVER(pTab==0)
c980: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
c990: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
c9a0: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
c9b0: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
c9c0: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
c9d0: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
c9e0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
c9f0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
ca00: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
ca10: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
ca20: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
ca30: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
ca40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
ca50: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
ca60: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d      /* One colum
ca70: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
ca80: 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c  set */.  if( pEL
ca90: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
caa0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
cab0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
cac0: 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sult is a column
cad0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
cae0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
caf0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
cb00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
cb10: 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
cb20: 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
cb30: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
cb40: 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
cb50: 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
cb60: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
cb70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
cb80: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
cb90: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
cba0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
cbb0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
cbc0: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
cbd0: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
cbe0: 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
cbf0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
cc00: 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
cc10: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
cc20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
cc30: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
cc40: 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
cc50: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
cc60: 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
cc70: 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
cc80: 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
cc90: 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
cca0: 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
ccb0: 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
ccc0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
ccd0: 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
cce0: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
ccf0: 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
cd00: 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
cd10: 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
cd20: 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
cd30: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
cd40: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
cd50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd60: 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
cd70: 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
cd80: 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
cd90: 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
cda0: 6a 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  j1;.  sqlite3Vdb
cdb0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
cdc0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
cdd0: 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20 3d 20 73 71  Null);.  j1 = sq
cde0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
cdf0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
ce00: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
ce10: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
ce20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ce30: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
ce40: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
ce50: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ce60: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
ce70: 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
ce80: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
ce90: 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
cea0: 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
ceb0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cec0: 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  v, j1);.}...#ifn
ced0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cee0: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
cef0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
cf00: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
cf10: 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
cf20: 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
cf30: 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
cf40: 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
cf50: 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
cf60: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
cf70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
cf80: 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
cf90: 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
cfa0: 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
cfb0: 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
cfc0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
cfd0: 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
cfe0: 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
cff0: 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
d000: 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
d010: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
d020: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
d030: 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
d040: 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
d050: 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
d060: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d070: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
d080: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
d090: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
d0a0: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
d0b0: 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
d0c0: 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
d0d0: 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
d0e0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d0f0: 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
d100: 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
d110: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
d120: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
d130: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
d140: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d150: 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
d160: 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
d170: 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
d180: 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
d190: 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
d1a0: 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
d1b0: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
d1c0: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
d1d0: 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
d1e0: 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
d1f0: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
d200: 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
d210: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
d220: 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
d230: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
d240: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
d250: 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
d260: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
d270: 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
d280: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
d290: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
d2a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d2b0: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
d2c0: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
d2d0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
d2e0: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
d2f0: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
d300: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
d310: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
d320: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
d330: 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
d340: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d350: 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
d360: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
d370: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
d380: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
d390: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
d3a0: 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
d3b0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
d3c0: 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
d3d0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d3e0: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
d3f0: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
d420: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
d430: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
d440: 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
d450: 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
d460: 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
d470: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
d4a0: 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
d4b0: 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
d4c0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
d4d0: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
d4e0: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
d4f0: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
d500: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
d510: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
d520: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
d530: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
d540: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
d550: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
d560: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
d570: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
d580: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
d590: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
d5a0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
d5b0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
d5c0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
d5d0: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
d5e0: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
d5f0: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
d600: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
d610: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d620: 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
d630: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ble..**.** The i
d640: 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  nFlags parameter
d650: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78   must contain ex
d660: 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
d670: 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
d680: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
d690: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20  IN_INDEX_LOOP.  
d6a0: 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
d6b0: 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
d6c0: 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
d6d0: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
d6e0: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
d6f0: 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20  d for a.** fast 
d700: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
d710: 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
d720: 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
d730: 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69  set, the.** IN i
d740: 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65  ndex will be use
d750: 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
d760: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
d770: 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49   RHS of the.** I
d780: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
d790: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
d7a0: 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
d7b0: 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
d7c0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
d7d0: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
d7e0: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
d7f0: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
d800: 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
d810: 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
d820: 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
d830: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
d840: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
d850: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
d860: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
d870: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
d880: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
d890: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
d8a0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
d8b0: 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  ** has a UNIQUE 
d8c0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e  constraint or UN
d8d0: 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  IQUE index..**.*
d8e0: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
d8f0: 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
d900: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
d910: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
d920: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
d930: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
d940: 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
d950: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
d960: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
d970: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
d980: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
d990: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
d9a0: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
d9b0: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
d9c0: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
d9d0: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
d9e0: 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
d9f0: 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
da00: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
da10: 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
da20: 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
da30: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
da40: 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
da50: 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
da60: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
da70: 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
da80: 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
da90: 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
daa0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
dab0: 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
dac0: 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
dad0: 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
dae0: 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
daf0: 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
db00: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
db10: 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
db20: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
db30: 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
db40: 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
db50: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
db60: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
db70: 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
db80: 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
db90: 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
dba0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
dbb0: 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
dbc0: 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
dbd0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
dbe0: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
dbf0: 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
dc00: 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
dc10: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
dc20: 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
dc30: 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
dc40: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
dc50: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
dc60: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
dc70: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
dc80: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
dc90: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
dca0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
dcb0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
dcc0: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
dcd0: 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
dce0: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
dcf0: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
dd00: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
dd10: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
dd20: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
dd30: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
dd40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
dd50: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
dd60: 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
dd70: 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
dd80: 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
dd90: 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
dda0: 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
ddb0: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
ddc0: 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
ddd0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
dde0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
ddf0: 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
de00: 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
de10: 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
de20: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
de30: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
de40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
de50: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
de60: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
de70: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
de80: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75 33 32  e, Expr *pX, u32
de90: 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70   inFlags, int *p
dea0: 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20  rRhsHasNull){.  
deb0: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
dee0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
def0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
df00: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df20: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
df30: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
df40: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
df50: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
df60: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
df70: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
df80: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
df90: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
dfa0: 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
dfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
dfc0: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
dfd0: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
dfe0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
dff0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
e000: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
e010: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
e020: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
e030: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
e040: 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
e050: 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
e060: 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
e070: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
e080: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
e090: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
e0a0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
e0b0: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
e0c0: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
e0d0: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
e0e0: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
e0f0: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
e100: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
e110: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
e120: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
e130: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
e140: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
e150: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
e160: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
e170: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
e180: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e190: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
e1a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e1b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
e1c0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
e1d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1f0: 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
e200: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
e210: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e230: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
e240: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  mn> */.    i16 i
e250: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
e280: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
e290: 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e2c0: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
e2d0: 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73  pTab */..    ass
e2e0: 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20  ert( p );       
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e310: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e320: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
e330: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
e340: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
e350: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e360: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e370: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
e380: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
e390: 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
e3a0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e3b0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e3c0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
e3d0: 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
e3e0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
e3f0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e400: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e410: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
e420: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
e430: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70  ].pTab;.    pExp
e440: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
e450: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
e460: 43 6f 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72  Col = (i16)pExpr
e470: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20  ->iColumn;.   . 
e480: 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50     /* Code an OP
e490: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  _Transaction and
e4a0: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
e4b0: 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
e4c0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
e4d0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
e4e0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
e4f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
e500: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
e510: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
e520: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
e530: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
e540: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
e550: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
e560: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e570: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
e580: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
e590: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
e5a0: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
e5b0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
e5c0: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
e5d0: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
e5e0: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
e5f0: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
e600: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
e610: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
e620: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e630: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
e640: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
e650: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
e660: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e670: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
e680: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
e690: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
e6a0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
e6b0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
e6c0: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
e6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e6e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
e6f0: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
e700: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
e710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e730: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
e740: 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
e750: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
e760: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
e770: 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e  omparison. If an
e780: 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20   index is to.   
e790: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
e7a0: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
e7b0: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
e7c0: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
e7d0: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
e7e0: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
e7f0: 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20  sequence.  */.  
e800: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
e810: 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
e820: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
e830: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
e840: 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  t, pExpr);..    
e850: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
e860: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
e870: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
e880: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20  o perform the . 
e890: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
e8a0: 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
e8b0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
e8c0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66  f the column. If
e8d0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
e8e0: 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
e8f0: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
e900: 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ny index..      
e910: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
e920: 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
e930: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
e940: 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  k(pX, pTab->aCol
e950: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29  [iCol].affinity)
e960: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ;..      for(pId
e970: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
e980: 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
e990: 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
e9a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e9b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
e9c0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  (pIdx->aiColumn[
e9d0: 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20  0]==iCol).      
e9e0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e     && sqlite3Fin
e9f0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
ea00: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
ea10: 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a  ll[0], 0)==pReq.
ea20: 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75           && (!mu
ea30: 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70  stBeUnique || (p
ea40: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
ea50: 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  && IsUniqueIndex
ea60: 28 70 49 64 78 29 29 29 0a 20 20 20 20 20 20 20  (pIdx))).       
ea70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
ea80: 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
ea90: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
eaa0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
eab0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
eac0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ead0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
eae0: 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
eaf0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
eb00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
eb10: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
eb20: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
eb30: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
eb40: 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
eb50: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
eb60: 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44    assert( IN_IND
eb70: 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d  EX_INDEX_DESC ==
eb80: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
eb90: 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ASC+1 );.       
eba0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
ebb0: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
ebc0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
ebd0: 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  [0];..          
ebe0: 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
ebf0: 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b   && !pTab->aCol[
ec00: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
ec10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72  .            *pr
ec20: 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70  RhsHasNull = ++p
ec30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
ec40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ec50: 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
ec60: 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
ec70: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
ec80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
ec90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
eca0: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
ecb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ecc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
ecd0: 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
ece0: 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
ecf0: 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
ed00: 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
ed10: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
ed20: 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
ed30: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
ed40: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
ed50: 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
ed60: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
ed70: 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
ed80: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f  is not contant o
ed90: 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
eda0: 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
edb0: 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
edc0: 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
edd0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
ede0: 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
edf0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ee00: 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
ee10: 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
ee20: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
ee30: 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
ee40: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
ee50: 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
ee60: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
ee70: 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
ee80: 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
ee90: 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
eea0: 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
eeb0: 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
eec0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
eed0: 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20  _NOOP;.  }.     
eee0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
eef0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
ef00: 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
ef10: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
ef20: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
ef30: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
ef40: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
ef50: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
ef60: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
ef70: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
ef80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
ef90: 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
efa0: 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
efb0: 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
efc0: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
efd0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
efe0: 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
eff0: 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
f000: 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
f010: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
f020: 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
f030: 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
f040: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
f050: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
f060: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f070: 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
f080: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
f090: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
f0a0: 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
f0b0: 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
f0c0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
f0d0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
f0e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f0f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
f100: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
f110: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
f120: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
f130: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
f140: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
f150: 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
f160: 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
f170: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
f180: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
f190: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
f1a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
f1b0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
f1c0: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
f1d0: 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
f1e0: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
f1f0: 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
f200: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
f210: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
f220: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
f230: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
f240: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
f250: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
f260: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
f270: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
f280: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
f290: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
f2a0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
f2b0: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
f2c0: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
f2d0: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
f2e0: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
f2f0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
f300: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
f310: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
f320: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
f330: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
f340: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
f350: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
f360: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
f370: 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
f380: 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
f390: 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
f3a0: 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
f3b0: 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
f3c0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
f3d0: 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
f3e0: 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
f3f0: 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
f400: 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
f410: 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
f420: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
f430: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
f440: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
f450: 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
f460: 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
f470: 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
f480: 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
f490: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
f4a0: 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
f4b0: 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
f4c0: 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
f4d0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
f4e0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
f4f0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
f500: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
f510: 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
f520: 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
f530: 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
f540: 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
f550: 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72  s..** All this r
f560: 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
f570: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65  nitialize the re
f580: 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
f590: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20  rMayHaveNull.** 
f5a0: 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
f5b0: 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
f5c0: 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61  take care of cha
f5d0: 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
f5e0: 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20  ter.** value to 
f5f0: 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
f600: 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
f610: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45  ..**.** For a SE
f620: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f  LECT or EXISTS o
f630: 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20  perator, return 
f640: 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61  the register tha
f650: 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72  t holds the.** r
f660: 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f  esult.  For IN o
f670: 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61  perators or if a
f680: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f690: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
f6a0: 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65   is 0..*/.#ifnde
f6b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
f6c0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
f6d0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
f6e0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f6f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
f700: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f710: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
f720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f730: 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72  e IN, SELECT, or
f740: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
f750: 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75   */.  int rHasNu
f760: 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a  llFlag,       /*
f770: 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72   Register that r
f780: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e  ecords whether N
f790: 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48  ULLs exist in RH
f7a0: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77  S */.  int isRow
f7b0: 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  id             /
f7c0: 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f  * If true, LHS o
f7d0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  f IN operator is
f7e0: 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20   a rowid */.){. 
f7f0: 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69   int jmpIfDynami
f800: 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  c = -1;         
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f820: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
f830: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
f840: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
f870: 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
f880: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
f890: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f8a0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
f8b0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
f8c0: 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
f8d0: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
f8e0: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rse);..  /* This
f8f0: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
f900: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
f910: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
f920: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
f930: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
f940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
f950: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
f960: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
f970: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
f980: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
f990: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
f9a0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
f9b0: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
f9c0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
f9d0: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
f9e0: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
f9f0: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
fa00: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
fa10: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
fa20: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
fa30: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
fa40: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
fa50: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
fa60: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
fa70: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
fa80: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
fa90: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
faa0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
fab0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
fac0: 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
fad0: 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
fae0: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
faf0: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
fb00: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69  rage(v);.  }..#i
fb10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fb20: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
fb30: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
fb40: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
fb50: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
fb60: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
fb70: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
fb80: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
fb90: 59 20 25 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61  Y %d", jmpIfDyna
fba0: 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
fbb0: 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
fbc0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
fbd0: 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
fbe0: 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  ", pParse->iNext
fbf0: 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a  SelectId.    );.
fc00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc10: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
fc20: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
fc30: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
fc40: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
fc50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
fc60: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
fc70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
fc80: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
fc90: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
fca0: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
fcb0: 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
fcc0: 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
fcd0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcf0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
fd00: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
fd10: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
fd20: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
fd30: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
fd40: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
fd50: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
fd60: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
fd70: 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
fd80: 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
fd90: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66  ion */..      af
fda0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
fdb0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
fdc0: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
fdd0: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
fde0: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
fdf0: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
fe00: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
fe10: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
fe20: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
fe30: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
fe40: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
fe50: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
fe60: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
fe70: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
fe80: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
fe90: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
fea0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
feb0: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
fec0: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
fed0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
fee0: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
fef0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
ff00: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
ff10: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
ff20: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
ff30: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
ff40: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
ff50: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
ff60: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
ff70: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
ff80: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
ff90: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
ffa0: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
ffb0: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
ffc0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
ffd0: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
ffe0: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
fff0: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
10000 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
10010 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
10020 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
10030 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
10040 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
10050 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
10060 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
10070 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
10080 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
10090 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
100a0 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
100b0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
100c0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
100d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
100e0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
100f0 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f  r->iTable, !isRo
10100 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  wid);.      pKey
10110 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f  Info = isRowid ?
10120 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49   0 : sqlite3KeyI
10130 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
10140 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20  >db, 1, 1);..   
10150 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
10160 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
10170 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
10180 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
10190 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
101a0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
101b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
101c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
101d0 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
101e0 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
101f0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
10200 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
10210 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
10220 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
10230 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
10240 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
10250 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
10260 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
10270 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
10280 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
10290 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
102a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
102b0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
102c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
102d0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
102e0 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
102f0 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
10300 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75  est.affSdst = (u
10310 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
10320 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
10330 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
10340 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
10350 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
10360 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
10370 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65   = 0;.        te
10380 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d  stcase( pSelect-
10390 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
103a0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
103b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
103c0 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
103d0 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
103e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
103f0 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
10400 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
10410 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
10420 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
10430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
10440 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
10450 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
10460 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
10470 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
10480 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
10490 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
104a0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
104b0 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
104c0 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
104d0 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
104e0 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  () */.        as
104f0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
10500 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10510 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
10520 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
10530 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
10540 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
10550 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
10560 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
10570 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
10580 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
10590 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
105a0 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30       pEList->a[0
105f0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10600 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
10610 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
10620 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
10630 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
10640 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
10650 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
10660 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
10670 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
10680 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
10690 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
106a0 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
106b0 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
106c0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
106d0 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
106e0 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
106f0 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
10700 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
10710 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
10720 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
10730 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
10740 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
10750 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
10760 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
10770 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
10780 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
10790 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
107a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
107b0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
107c0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
107d0 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
107e0 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
107f0 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
10800 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
10810 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
10820 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
10830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10840 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
10850 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
10860 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
10870 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
10880 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
10890 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
108a0 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
108b0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
108c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
108d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
108e0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
108f0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
10900 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
10910 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
10920 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10930 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
10940 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
10950 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10960 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
10970 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
10980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10990 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
109a0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
109b0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
109c0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
109d0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
109e0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
109f0 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
10a00 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
10a10 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
10a20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
10a30 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10a40 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
10a50 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
10a60 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
10a70 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
10a80 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
10a90 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
10aa0 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
10ab0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
10ac0 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
10ad0 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
10ae0 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
10af0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
10b00 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
10b10 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
10b20 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
10b30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10b40 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
10b50 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
10b60 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10b70 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
10b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10b90 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
10ba0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
10bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
10bc0 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
10bd0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
10be0 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
10bf0 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
10c00 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
10c10 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
10c20 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
10c30 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
10c40 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10c50 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
10c60 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
10c70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
10c90 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
10ca0 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
10cb0 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
10cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10cd0 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
10ce0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
10cf0 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
10d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10d10 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
10d20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10d30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10d40 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
10d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10d80 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
10da0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10db0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10dc0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10dd0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
10de0 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
10df0 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
10e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10e10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10e20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10e30 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
10e40 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
10e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
10e60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10e70 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
10e80 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10eb0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
10ec0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10ed0 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
10ee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
10ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10f00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10f10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10f20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
10f30 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10f40 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
10f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10f60 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
10f70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10f80 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
10f90 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
10fa0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
10fb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10fc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10fd0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
10fe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
10ff0 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
11000 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
11010 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
11020 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
11030 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11040 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
11050 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
11060 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
11070 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
11080 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
11090 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
110a0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
110b0 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
110c0 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
110d0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
110e0 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
110f0 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
11100 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
11110 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
11120 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
11130 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
11140 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
11150 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
11160 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11180 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11190 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
111a0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
111b0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
111c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
111d0 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
111e0 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
111f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11200 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
11210 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
11220 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
11230 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
11240 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11250 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
11260 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
11270 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
11280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
11290 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
112a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
112b0 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
112c0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
112d0 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
112e0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
112f0 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
11300 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
11310 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
11320 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
11330 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
11340 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
11350 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
11360 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
11370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
11390 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
113a0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
113b0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
113c0 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
113d0 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
113e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
113f0 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
11400 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
11410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11420 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11430 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
11440 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
11450 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
11460 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
11470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11480 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
11490 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
114a0 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
114b0 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
114c0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
114d0 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
114e0 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
11510 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
11520 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
11530 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
11540 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
11550 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
11560 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11570 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
11580 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
11590 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
115a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
115b0 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
115c0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
115d0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
115e0 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
115f0 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
11600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
11610 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
11620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
11630 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
11640 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
11650 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
11660 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
11670 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
11680 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11690 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
116a0 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
116b0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
116c0 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
116d0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
116e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
116f0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
11700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11710 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
11720 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
11730 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
11740 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
11750 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
11760 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
11770 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
11780 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
11790 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
117a0 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78  ) is a scalar ex
117b0 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72  pression.  The r
117c0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
117d0 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72  RHS).** is an ar
117e0 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
117f0 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65  ore values.  The
11800 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11810 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  rue if the LHS i
11820 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77  s.** contained w
11830 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
11840 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
11850 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
11860 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a  nknown (NULL).**
11870 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e   if the LHS is N
11880 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48  ULL or if the LH
11890 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
118a0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
118b0 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53  S and the.** RHS
118c0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
118d0 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
118e0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
118f0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
11900 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
11910 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
11920 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
11930 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
11940 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
11950 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
11960 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
11970 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
11980 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
11990 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
119a0 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
119b0 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
119c0 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
119d0 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
119e0 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
119f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11a00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
11a10 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
11a20 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
11a30 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
11a40 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
11a50 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
11a60 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
11a70 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
11a80 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
11a90 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
11aa0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
11ab0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
11ac0 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
11ad0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
11ae0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
11af0 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
11b00 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
11b10 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
11b20 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
11b30 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
11b40 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
11b50 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
11b60 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
11b70 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69  */.  char affini
11b80 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ty;        /* Co
11b90 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74  mparison affinit
11ba0 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y to use */.  in
11bb0 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
11bc0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
11bd0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
11be0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
11bf0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75    /* Temporary u
11c00 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
11c10 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
11c20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
11c30 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
11c40 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  uction */..  /* 
11c50 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e  Compute the RHS.
11c60 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74     After this st
11c70 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69  ep, the table wi
11c80 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70  th cursor.  ** p
11c90 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c  Expr->iTable wil
11ca0 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  l contains the v
11cb0 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
11cc0 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  up the RHS..  */
11cd0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
11ce0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
11cf0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
11d00 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
11d10 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
11d20 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
11d30 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
11d40 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
11d50 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
11d60 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
11d70 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d90 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
11da0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
11db0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
11dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
11de0 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
11df0 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
11e00 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a  sHasNull);..  /*
11e10 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
11e20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
11e30 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
11e40 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
11e50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70  .  ** of the exp
11e60 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
11e70 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
11e80 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
11e90 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34  able for.  ** P4
11ea0 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
11eb0 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69  d..  */.  affini
11ec0 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
11ed0 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
11ee0 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
11ef0 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
11f00 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
11f10 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71  ...)"..  */.  sq
11f20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
11f30 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31  sh(pParse);.  r1
11f40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11f50 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
11f60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11f70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11f80 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a  Left, r1);..  /*
11f90 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
11fa0 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
11fb0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
11fc0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
11fd0 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
11fe0 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
11ff0 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
12000 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
12010 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
12020 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
12030 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  s..  */.  if( eT
12040 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
12050 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
12060 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
12070 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
12080 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
12090 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
120a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
120b0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
120c0 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
120d0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
120e0 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
120f0 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
12100 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
12110 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
12120 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
12130 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
12140 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
12150 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
12160 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
12170 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
12180 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
12190 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
121a0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
121b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
121c0 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72  OP_BitAnd, r1, r
121d0 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  1, regCkNull);. 
121e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
121f0 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
12200 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
12210 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12220 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12230 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
12240 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
12250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
12260 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
12270 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
12280 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
12290 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
122a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
122b0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
122c0 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
122d0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
122e0 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
122f0 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
12300 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
12310 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
12320 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12330 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
12340 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a  1, labelOk, r2,.
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
12370 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
12380 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  EQ);.        Vdb
12390 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
123a0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
123b0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
123c0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d  overageIf(v, ii=
123d0 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  =pList->nExpr-1)
123e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
123f0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12400 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20   affinity);.    
12410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12420 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
12430 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
12440 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
12450 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12460 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74   OP_Ne, r1, dest
12470 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20  IfFalse, r2,.   
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
124a0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
124b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
124c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
124d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
124e0 2c 20 61 66 66 69 6e 69 74 79 20 7c 20 53 51 4c  , affinity | SQL
124f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
12500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12510 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12520 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
12530 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
12540 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
12550 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12560 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12570 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
12580 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
12590 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
125a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
125b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
125c0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
125d0 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
125e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
125f0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
12600 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
12610 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12620 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
12630 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
12640 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  .    /* If the L
12650 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  HS is NULL, then
12660 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65   the result is e
12670 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e  ither false or N
12680 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20  ULL depending.  
12690 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20    ** on whether 
126a0 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79  the RHS is empty
126b0 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74   or not, respect
126c0 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ively..    */.  
126d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
126e0 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72  rCanBeNull(pExpr
126f0 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
12700 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
12710 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
12720 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  .        /* Shor
12730 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
12740 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
12750 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
12760 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
12770 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
12780 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  me. */.        s
12790 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
127a0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
127b0 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  1, destIfNull); 
127c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
127d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
127e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
127f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12800 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
12810 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65  l, r1); VdbeCove
12820 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12840 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
12850 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12860 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
12870 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12880 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
12890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128a0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
128b0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
128c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
128d0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
128e0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
128f0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54 79  }.  .    if( eTy
12900 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
12910 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ID ){.      /* I
12920 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
12930 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
12940 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
12950 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
12960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12970 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
12980 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  nt, r1, destIfFa
12990 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  lse); VdbeCovera
129a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
129b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
129c0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
129d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
129e0 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
129f0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
12a00 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
12a10 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
12a20 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
12a30 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
12a40 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tree..      */. 
12a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12a60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
12a70 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c  inity, r1, 1, 0,
12a80 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
12a90 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
12aa0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
12ab0 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
12ac0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12ad0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22   the .      ** "
12ae0 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
12af0 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
12b00 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
12b10 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
12b20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
12b30 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12b40 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12b50 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
12b60 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
12b70 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12b80 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
12b90 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12ba0 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
12bb0 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
12bc0 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  LL..      */.   
12bd0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
12be0 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75  fFalse!=destIfNu
12bf0 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c  ll || rRhsHasNul
12c00 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  l==0 );.      if
12c10 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
12c20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
12c30 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
12c40 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61  if it is known a
12c50 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74  t compile time t
12c60 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20  hat the RHS.    
12c70 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f      ** cannot co
12c80 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65  ntain NULL value
12c90 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
12ca0 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
12cb0 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
12cc0 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
12cd0 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
12ce0 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
12cf0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
12d00 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
12d10 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
12d20 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
12d30 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a  FALSE.        **
12d40 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
12d50 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
12d60 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12d80 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
12d90 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
12da0 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
12db0 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20  alse, r1, 1);.  
12dc0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12dd0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
12de0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
12df0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74  n this branch, t
12e00 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12e10 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
12e20 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20   NULL and.      
12e30 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
12e40 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
12e50 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
12e60 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
12e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  .        ** outc
12e80 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ome..        */.
12e90 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a          int j1;.
12ea0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69    .        /* Fi
12eb0 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
12ec0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   if the LHS is c
12ed0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
12ee0 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20  RHS.  If so,.   
12ef0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
12f00 20 61 6e 73 77 65 72 20 69 73 20 54 52 55 45 20   answer is TRUE 
12f10 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
12f20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
12f30 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a   does.        **
12f40 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66   not matter.  If
12f50 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
12f60 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
12f70 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20   RHS, then the. 
12f80 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72         ** answer
12f90 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
12fa0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
12fb0 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65  Ls and the answe
12fc0 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  r is.        ** 
12fd0 46 41 4c 53 45 20 69 66 20 74 68 65 20 52 48 53  FALSE if the RHS
12fe0 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20   is NULL-free.. 
12ff0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13000 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
13010 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
13020 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
13030 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31  iTable, 0, r1, 1
13040 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
13050 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13070 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
13080 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
13090 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
130a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
130b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
130c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130d0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
130e0 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
130f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13100 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
13110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13120 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
13130 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
13140 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  se, r1);.  sqlit
13150 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
13160 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  Parse);.  VdbeCo
13170 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49  mment((v, "end I
13180 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e  N expr"));.}.#en
13190 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
131a0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
131b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
131c0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
131d0 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
131e0 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
131f0 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
13200 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
13210 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
13220 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
13230 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
13240 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
13250 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
13260 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
13270 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
13280 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
13290 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
132a0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
132b0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
132c0 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
132d0 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
132e0 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
132f0 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
13300 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
13310 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
13320 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
13330 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
13340 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
13350 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
13360 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c  e value;.    sql
13370 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c  ite3AtoF(z, &val
13380 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ue, sqlite3Strle
13390 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
133a0 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TF8);.    assert
133b0 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  ( !sqlite3IsNaN(
133c0 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65  value) ); /* The
133d0 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20   new AtoF never 
133e0 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20  returns NaN */. 
133f0 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61     if( negateFla
13400 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c  g ) value = -val
13410 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ue;.    sqlite3V
13420 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c  dbeAddOp4Dup8(v,
13430 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
13440 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75  m, 0, (u8*)&valu
13450 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  e, P4_REAL);.  }
13460 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
13470 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
13480 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
13490 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
134a0 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
134b0 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
134c0 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
134d0 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
134e0 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
134f0 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
13500 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
13510 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
13520 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
13530 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
13540 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
13550 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
13560 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
13570 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
13580 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
13590 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
135a0 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
135b0 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
135c0 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
135d0 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
135e0 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
135f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13600 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
13610 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
13620 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
13630 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
13640 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
13650 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
13660 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
13670 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
13680 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
13690 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
136a0 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32  f( c==0 || (c==2
136b0 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a   && negFlag) ){.
136c0 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
136d0 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
136e0 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  2 ? SMALLEST_INT
136f0 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
13700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13710 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50  AddOp4Dup8(v, OP
13720 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
13730 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
13740 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20   P4_INT64);.    
13750 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
13760 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
13770 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73  NG_POINT.      s
13780 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13790 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65  Parse, "oversize
137a0 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22  d integer: %s%s"
137b0 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20  , negFlag ? "-" 
137c0 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a  : "", z);.#else.
137d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
137e0 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a  MIT_HEX_INTEGER.
137f0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13800 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78  3_strnicmp(z,"0x
13810 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
13820 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13830 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78 20  sg(pParse, "hex 
13840 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a  literal too big:
13850 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
13860 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
13870 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64     {.        cod
13880 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46  eReal(v, z, negF
13890 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  lag, iMem);.    
138a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
138b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
138c0 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72  ear a cache entr
138d0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
138e0 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
138f0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
13900 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13910 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
13920 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
13930 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
13940 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
13950 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
13960 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
13970 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
13980 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
13990 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
139a0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
139b0 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
139c0 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63   Record in the c
139d0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74  olumn cache that
139e0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f   a particular co
139f0 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70  lumn from a.** p
13a00 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20  articular table 
13a10 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70  is stored in a p
13a20 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73 74  articular regist
13a30 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
13a40 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
13a50 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13a60 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69   int iTab, int i
13a70 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  Col, int iReg){.
13a80 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d    int i;.  int m
13a90 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78  inLru;.  int idx
13aa0 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43  Lru;.  struct yC
13ab0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f  olCache *p;..  /
13ac0 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  * Unless an erro
13ad0 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20  r has occurred, 
13ae0 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
13af0 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69   are always posi
13b00 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tive. */.  asser
13b10 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61  t( iReg>0 || pPa
13b20 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61  rse->nErr || pPa
13b30 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
13b40 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72  ailed );.  asser
13b50 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69  t( iCol>=-1 && i
13b60 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a  Col<32768 );  /*
13b70 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e   Finite column n
13b80 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20  umbers */..  /* 
13b90 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  The SQLITE_Colum
13ba0 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73 61  nCache flag disa
13bb0 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  bles the column 
13bc0 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73 20  cache.  This is 
13bd0 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65  used.  ** for te
13be0 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20  sting only - to 
13bf0 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c 69  verify that SQLi
13c00 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20 74  te always gets t
13c10 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
13c20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74   ** with and wit
13c30 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  hout the column 
13c40 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
13c50 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
13c60 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  sabled(pParse->d
13c70 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e  b, SQLITE_Column
13c80 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b  Cache) ) return;
13c90 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70  ..  /* First rep
13ca0 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e  lace any existin
13cb0 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20  g entry..  **.  
13cc0 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65  ** Actually, the
13cd0 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20   way the column 
13ce0 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e 74  cache is current
13cf0 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65 20  ly used, we are 
13d00 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20  guaranteed.  ** 
13d10 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20  that the object 
13d20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61  will never alrea
13d30 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20  dy be in cache. 
13d40 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75 61   Verify this gua
13d50 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66  rantee..  */.#if
13d60 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f  ndef NDEBUG.  fo
13d70 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
13d80 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
13d90 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
13da0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
13db0 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d  assert( p->iReg=
13dc0 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21  =0 || p->iTable!
13dd0 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c  =iTab || p->iCol
13de0 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d  umn!=iCol );.  }
13df0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69  .#endif..  /* Fi
13e00 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74  nd an empty slot
13e10 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
13e20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  */.  for(i=0, p=
13e30 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13e40 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13e50 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13e60 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13e70 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  eg==0 ){.      p
13e80 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
13e90 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
13ea0 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20        p->iTable 
13eb0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d  = iTab;.      p-
13ec0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
13ed0 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
13ee0 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e   iReg;.      p->
13ef0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
13f00 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
13f10 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
13f20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
13f30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
13f40 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20  eplace the last 
13f50 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  recently used */
13f60 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66  .  minLru = 0x7f
13f70 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75  ffffff;.  idxLru
13f80 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30   = -1;.  for(i=0
13f90 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13fa0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13fb0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13fc0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
13fd0 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a  ->lru<minLru ){.
13fe0 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69        idxLru = i
13ff0 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d  ;.      minLru =
14000 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20   p->lru;.    }. 
14010 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28   }.  if( ALWAYS(
14020 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20  idxLru>=0) ){.  
14030 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61    p = &pParse->a
14040 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d  ColCache[idxLru]
14050 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20  ;.    p->iLevel 
14060 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
14070 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54  Level;.    p->iT
14080 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20  able = iTab;.   
14090 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43   p->iColumn = iC
140a0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20  ol;.    p->iReg 
140b0 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74  = iReg;.    p->t
140c0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  empReg = 0;.    
140d0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
140e0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
140f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
14100 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
14110 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20 62  that registers b
14120 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65  etween iReg..iRe
14130 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69  g+nReg-1 are bei
14140 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
14150 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61 6e  ** Purge the ran
14160 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
14170 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
14180 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cache..*/.void s
14190 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
141a0 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  emove(Parse *pPa
141b0 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69  rse, int iReg, i
141c0 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt nReg){.  int 
141d0 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d  i;.  int iLast =
141e0 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31   iReg + nReg - 1
141f0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
14200 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
14210 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
14220 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
14230 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
14240 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
14250 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
14260 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26    if( r>=iReg &&
14270 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20   r<=iLast ){.   
14280 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
14290 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
142a0 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
142b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
142c0 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
142d0 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e  e current column
142e0 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20   cache context. 
142f0 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73   Any new entries
14300 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20   added.** added 
14310 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  to the column ca
14320 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 63  che after this c
14330 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20  all are removed 
14340 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  when the.** corr
14350 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63  esponding pop oc
14360 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
14370 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
14380 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  sh(Parse *pParse
14390 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61  ){.  pParse->iCa
143a0 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64  cheLevel++;.#ifd
143b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
143c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
143d0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
143e0 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
143f0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
14400 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50  USH to %d\n", pP
14410 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
14420 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  l);.  }.#endif.}
14430 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66  ../*.** Remove f
14440 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  rom the column c
14450 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73  ache any entries
14460 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65 64   that were added
14470 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68   since the.** th
14480 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74  e previous sqlit
14490 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 20  e3ExprCachePush 
144a0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f  operation.  In o
144b0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74  ther words, rest
144c0 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ore.** the cache
144d0 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69 74   to the state it
144e0 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68   was in prior th
144f0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75  e most recent Pu
14500 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  sh..*/.void sqli
14510 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
14520 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
14530 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
14540 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
14550 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14560 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31  ->iCacheLevel>=1
14570 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43   );.  pParse->iC
14580 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66  acheLevel--;.#if
14590 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
145a0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
145b0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
145c0 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
145d0 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
145e0 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70  POP  to %d\n", p
145f0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14600 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
14610 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14620 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14630 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14640 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
14650 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
14660 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61  && p->iLevel>pPa
14670 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14680 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
14690 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
146a0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
146b0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
146c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e   }.}../*.** When
146d0 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e   a cached column
146e0 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65   is reused, make
146f0 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20 72   sure that its r
14700 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f  egister is.** no
14710 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c   longer availabl
14720 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67 69  e as a temp regi
14730 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33  ster.  ticket #3
14740 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a  879:  that same.
14750 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67 68  ** register migh
14760 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
14770 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  e in multiple pl
14780 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65  aces, so be sure
14790 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20   to.** get them 
147a0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  all..*/.static v
147b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
147c0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
147d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
147e0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
147f0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
14800 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
14810 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14820 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14830 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14840 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
14850 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20  ( p->iReg==iReg 
14860 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70  ){.      p->temp
14870 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
14880 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
14890 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74  rate code to ext
148a0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f  ract the value o
148b0 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  f the iCol-th co
148c0 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e  lumn of a table.
148d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
148e0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
148f0 6e 4f 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65  nOfTable(.  Vdbe
14900 20 2a 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *v,        /* T
14910 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
14920 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
14930 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
14940 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e  /* The table con
14950 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
14960 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43  e */.  int iTabC
14970 75 72 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ur,    /* The ta
14980 62 6c 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20  ble cursor.  Or 
14990 74 68 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f  the PK cursor fo
149a0 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
149b0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
149c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
149d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65   the column to e
149e0 78 74 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20  xtract */.  int 
149f0 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45  regOut      /* E
14a00 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
14a10 20 69 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73   into this regis
14a20 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ter */.){.  if( 
14a30 69 43 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d  iCol<0 || iCol==
14a40 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
14a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14a60 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64  dOp2(v, OP_Rowid
14a70 2c 20 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75  , iTabCur, regOu
14a80 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
14a90 20 69 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74   int op = IsVirt
14aa0 75 61 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56  ual(pTab) ? OP_V
14ab0 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75  Column : OP_Colu
14ac0 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20  mn;.    int x = 
14ad0 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48  iCol;.    if( !H
14ae0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
14af0 0a 20 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74  .      x = sqlit
14b00 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28  e3ColumnOfIndex(
14b10 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
14b20 79 49 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43  yIndex(pTab), iC
14b30 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ol);.    }.    s
14b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14b50 28 76 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c  (v, op, iTabCur,
14b60 20 78 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d   x, regOut);.  }
14b70 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29  .  if( iCol>=0 )
14b80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  {.    sqlite3Col
14b90 75 6d 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54  umnDefault(v, pT
14ba0 61 62 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74  ab, iCol, regOut
14bb0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
14bc0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
14bd0 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20  at will extract 
14be0 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
14bf0 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61  olumn from.** ta
14c00 62 6c 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f  ble pTab and sto
14c10 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  re the column va
14c20 6c 75 65 20 69 6e 20 61 20 72 65 67 69 73 74 65  lue in a registe
14c30 72 2e 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a  r.  An effort.**
14c40 20 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72   is made to stor
14c50 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  e the column val
14c60 75 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ue in register i
14c70 52 65 67 2c 20 62 75 74 20 74 68 69 73 20 69 73  Reg, but this is
14c80 0a 2a 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65  .** not guarante
14c90 65 64 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f  ed.  The locatio
14ca0 6e 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n of the column 
14cb0 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
14cc0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  d..**.** There m
14cd0 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63  ust be an open c
14ce0 75 72 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e  ursor to pTab in
14cf0 20 69 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69   iTable when thi
14d00 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
14d10 63 61 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c  called.  If iCol
14d20 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20  umn<0 then code 
14d30 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 68 61  is generated tha
14d40 74 20 65 78 74 72 61 63 74 73 20 74 68 65 20 72  t extracts the r
14d50 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
14d60 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
14d70 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a  olumn(.  Parse *
14d80 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
14d90 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
14da0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
14db0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
14dc0 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  b,     /* Descri
14dd0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62  ption of the tab
14de0 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  le we are readin
14df0 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  g from */.  int 
14e00 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20  iColumn,     /* 
14e10 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  Index of the tab
14e20 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  le column */.  i
14e30 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
14e40 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f  /* The cursor po
14e50 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61  inting to the ta
14e60 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ble */.  int iRe
14e70 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f  g,        /* Sto
14e80 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  re results here 
14e90 2a 2f 0a 20 20 75 38 20 70 35 20 20 20 20 20 20  */.  u8 p5      
14ea0 20 20 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75        /* P5 valu
14eb0 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20  e for OP_Column 
14ec0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
14ed0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14ee0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
14ef0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
14f00 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ..  for(i=0, p=p
14f10 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14f20 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14f30 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14f40 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
14f50 67 3e 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65  g>0 && p->iTable
14f60 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69  ==iTable && p->i
14f70 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
14f80 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  ){.      p->lru 
14f90 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
14fa0 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Cnt++;.      sql
14fb0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
14fc0 52 65 67 69 73 74 65 72 28 70 50 61 72 73 65 2c  Register(pParse,
14fd0 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20   p->iReg);.     
14fe0 20 72 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b   return p->iReg;
14ff0 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61  .    }.  }  .  a
15000 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
15010 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15020 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
15030 28 76 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65  (v, pTab, iTable
15040 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
15050 3b 0a 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20  ;.  if( p5 ){.  
15060 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15070 6e 67 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20  ngeP5(v, p5);.  
15080 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71  }else{   .    sq
15090 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
150a0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ore(pParse, iTab
150b0 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65  le, iColumn, iRe
150c0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
150d0 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iReg;.}../*.** 
150e0 43 6c 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e  Clear all column
150f0 20 63 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a   cache entries..
15100 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
15110 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 50 61  xprCacheClear(Pa
15120 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
15130 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15140 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23  yColCache *p;..#
15150 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
15160 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
15170 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
15180 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
15190 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43  ){.    printf("C
151a0 4c 45 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  LEAR\n");.  }.#e
151b0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
151c0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
151d0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
151e0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
151f0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
15200 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61  iReg ){.      ca
15210 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
15220 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
15230 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
15240 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
15250 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  Record the fact 
15260 74 68 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79  that an affinity
15270 20 63 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75   change has occu
15280 72 72 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a  rred on iCount.*
15290 2a 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  * registers star
152a0 74 69 6e 67 20 77 69 74 68 20 69 53 74 61 72 74  ting with iStart
152b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
152c0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
152d0 74 79 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a  tyChange(Parse *
152e0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61  pParse, int iSta
152f0 72 74 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b  rt, int iCount){
15300 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
15310 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
15320 2c 20 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74  , iStart, iCount
15330 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
15340 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76  rate code to mov
15350 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72  e content from r
15360 65 67 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e  egisters iFrom..
15370 2e 69 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a  .iFrom+nReg-1.**
15380 20 6f 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54   over to iTo..iT
15390 6f 2b 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74  o+nReg-1. Keep t
153a0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
153b0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76  up-to-date..*/.v
153c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
153d0 6f 64 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70  odeMove(Parse *p
153e0 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
153f0 2c 20 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e  , int iTo, int n
15400 52 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Reg){.  assert( 
15410 69 46 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20  iFrom>=iTo+nReg 
15420 7c 7c 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69  || iFrom+nReg<=i
15430 54 6f 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  To );.  sqlite3V
15440 64 62 65 41 64 64 4f 70 33 28 70 50 61 72 73 65  dbeAddOp3(pParse
15450 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65  ->pVdbe, OP_Move
15460 2c 20 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52  , iFrom, iTo, nR
15470 65 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  eg);.  sqlite3Ex
15480 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
15490 61 72 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65  arse, iFrom, nRe
154a0 67 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  g);.}..#if defin
154b0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
154c0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
154d0 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
154e0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
154f0 72 75 65 20 69 66 20 61 6e 79 20 72 65 67 69 73  rue if any regis
15500 74 65 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65  ter in the range
15510 20 69 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63   iFrom..iTo (inc
15520 6c 75 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73  lusive).** is us
15530 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
15540 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
15550 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15560 6e 65 20 69 73 20 75 73 65 64 20 77 69 74 68 69  ne is used withi
15570 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
15580 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
15590 20 6f 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65   only.** and doe
155a0 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20  s not appear in 
155b0 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  a normal build..
155c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73  */.static int us
155d0 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28  edAsColumnCache(
155e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
155f0 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
15600 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  o){.  int i;.  s
15610 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
15620 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
15630 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
15640 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
15650 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
15660 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
15670 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
15680 20 72 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d   r>=iFrom && r<=
15690 69 54 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20  iTo ) return 1; 
156a0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
156b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
156c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
156d0 45 5f 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54  E_DEBUG || SQLIT
156e0 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20  E_COVERAGE_TEST 
156f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
15700 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
15710 6e 6f 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47  node to a TK_REG
15720 49 53 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20  ISTER.*/.static 
15730 76 6f 69 64 20 65 78 70 72 54 6f 52 65 67 69 73  void exprToRegis
15740 74 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ter(Expr *p, int
15750 20 69 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32   iReg){.  p->op2
15760 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f   = p->op;.  p->o
15770 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b  p = TK_REGISTER;
15780 0a 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69  .  p->iTable = i
15790 52 65 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72  Reg;.  ExprClear
157a0 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53  Property(p, EP_S
157b0 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  kip);.}../*.** G
157c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
157d0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
157e0 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
157f0 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
15800 65 73 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74  ession.  Attempt
15810 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65   to store the re
15820 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
15830 72 20 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52  r "target"..** R
15840 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
15850 65 72 20 77 68 65 72 65 20 72 65 73 75 6c 74 73  er where results
15860 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a   are stored..**.
15870 2a 2a 20 57 69 74 68 20 74 68 69 73 20 72 6f 75  ** With this rou
15880 74 69 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e  tine, there is n
15890 6f 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  o guarantee that
158a0 20 72 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a   results will.**
158b0 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61   be stored in ta
158c0 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
158d0 74 20 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65  t might be store
158e0 64 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d in some other.
158f0 2a 2a 20 72 65 67 69 73 74 65 72 20 69 66 20 69  ** register if i
15900 74 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20  t is convenient 
15910 74 6f 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63  to do so.  The c
15920 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
15930 2a 2a 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68  ** must check th
15940 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e  e return code an
15950 64 20 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c  d move the resul
15960 74 73 20 74 6f 20 74 68 65 20 64 65 73 69 72 65  ts to the desire
15970 64 0a 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a  d.** register..*
15980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
15990 72 43 6f 64 65 54 61 72 67 65 74 28 50 61 72 73  rCodeTarget(Pars
159a0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
159b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
159c0 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
159d0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
159e0 20 2f 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72   /* The VM under
159f0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
15a00 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a20 54 68 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67  The opcode being
15a30 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
15a40 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20  inReg = target; 
15a50 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
15a60 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
15a70 74 65 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69  ter inReg */.  i
15a80 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
15a90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
15aa0 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
15ab0 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
15ac0 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ster */.  int re
15ad0 67 46 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20  gFree2 = 0;     
15ae0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
15af0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
15b00 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
15b10 2a 2f 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c  */.  int r1, r2,
15b20 20 72 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f   r3, r4;       /
15b30 2a 20 56 61 72 69 6f 75 73 20 72 65 67 69 73 74  * Various regist
15b40 65 72 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  er numbers */.  
15b50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
15b60 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65  arse->db; /* The
15b70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
15b80 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74  tion */.  Expr t
15b90 65 6d 70 58 3b 20 20 20 20 20 20 20 20 20 20 20  empX;           
15ba0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
15bb0 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
15bc0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
15bd0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
15be0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
15bf0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  );.  if( v==0 ){
15c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15c10 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
15c20 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74  ailed );.    ret
15c30 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66  urn 0;.  }..  if
15c40 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
15c50 20 20 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a    op = TK_NULL;.
15c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20    }else{.    op 
15c70 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d  = pExpr->op;.  }
15c80 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
15c90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
15ca0 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
15cb0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
15cc0 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
15cd0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75  Info;.      stru
15ce0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
15cf0 70 43 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f  pCol = &pAggInfo
15d00 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41  ->aCol[pExpr->iA
15d10 67 67 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  gg];.      if( !
15d20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
15d30 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
15d40 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d  assert( pCol->iM
15d50 65 6d 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  em>0 );.        
15d60 69 6e 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d  inReg = pCol->iM
15d70 65 6d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  em;.        brea
15d80 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  k;.      }else i
15d90 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65  f( pAggInfo->use
15da0 53 6f 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20  SortingIdx ){.  
15db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15dc0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
15dd0 6c 75 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  lumn, pAggInfo->
15de0 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a  sortingIdxPTab,.
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
15e10 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
15e20 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  n, target);.    
15e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15e40 20 7d 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65   }.      /* Othe
15e50 72 77 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75  rwise, fall thru
15e60 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c   into the TK_COL
15e70 55 4d 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  UMN case */.    
15e80 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
15e90 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  LUMN: {.      in
15ea0 74 20 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  t iTab = pExpr->
15eb0 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  iTable;.      if
15ec0 28 20 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20  ( iTab<0 ){.    
15ed0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
15ee0 63 6b 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20  ckBase>0 ){.    
15ef0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15f00 69 6e 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  ing CHECK constr
15f10 61 69 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69  aints or inserti
15f20 6e 67 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20  ng into partial 
15f30 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20  index */.       
15f40 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72     inReg = pExpr
15f50 2d 3e 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72  ->iColumn + pPar
15f60 73 65 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20  se->ckBase;.    
15f70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15f80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15f90 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e        /* Deletin
15fa0 67 20 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c  g from a partial
15fb0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
15fc0 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
15fd0 65 2d 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a  e->iPartIdxTab;.
15fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ff0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
16000 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
16010 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
16020 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16050 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
16060 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16090 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65  >op2);.      bre
160a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
160b0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
160c0 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
160d0 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
160e0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
160f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16100 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16110 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
16120 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
16130 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
16140 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16150 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16160 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16170 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
16180 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16190 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
161a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
161b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
161c0 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
161d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
161e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
161f0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16200 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16210 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
16220 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61  P_String8, 0, ta
16230 72 67 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  rget, 0, pExpr->
16240 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20  u.zToken, 0);.  
16250 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16260 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
16270 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
16280 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16290 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
162a0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
162b0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
162c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
162d0 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
162e0 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
162f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
16300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
16310 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62       char *zBlob
16320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16330 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16340 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
16350 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
16360 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
16370 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c  Token[0]=='x' ||
16380 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16390 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20  [0]=='X' );.    
163a0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
163b0 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c  >u.zToken[1]=='\
163c0 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  '' );.      z = 
163d0 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  &pExpr->u.zToken
163e0 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  [2];.      n = s
163f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
16400 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) - 1;.      ass
16410 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20  ert( z[n]=='\'' 
16420 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d  );.      zBlob =
16430 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f   sqlite3HexToBlo
16440 62 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  b(sqlite3VdbeDb(
16450 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  v), z, n);.     
16460 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16470 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e  p4(v, OP_Blob, n
16480 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a  /2, target, 0, z
16490 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43  Blob, P4_DYNAMIC
164a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
164b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
164c0 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
164d0 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
164e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
164f0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
16500 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
16510 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16520 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20  u.zToken!=0 );. 
16530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
16540 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21  pr->u.zToken[0]!
16550 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
16560 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16570 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
16580 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61  xpr->iColumn, ta
16590 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
165a0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
165b0 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [1]!=0 ){.      
165c0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
165d0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f  >u.zToken[0]=='?
165e0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
165f0 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d  || strcmp(pExpr-
16600 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73  >u.zToken, pPars
16610 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
16620 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29  iColumn-1])==0 )
16630 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16640 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
16650 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56   -1, pParse->azV
16660 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
16670 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29  n-1], P4_STATIC)
16680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
166a0 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
166b0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  R: {.      inReg
166c0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
166d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
166e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
166f0 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  _AS: {.      inR
16700 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
16710 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
16720 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16730 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
16740 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
16750 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16760 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54  _CAST.    case T
16770 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20  K_CAST: {.      
16780 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f  /* Expressions o
16790 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41  f the form:   CA
167a0 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65  ST(pLeft AS toke
167b0 6e 29 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65  n) */.      inRe
167c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
167d0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
167e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
167f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
16800 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
16810 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16820 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16830 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67   OP_SCopy, inReg
16840 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16850 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
16860 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
16870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16880 70 32 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74  p2(v, OP_Cast, t
16890 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
168b0 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
168c0 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pe(pExpr->u.zTok
168d0 65 6e 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74  en, 0));.      t
168e0 65 73 74 63 61 73 65 28 20 75 73 65 64 41 73 43  estcase( usedAsC
168f0 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
16900 65 2c 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29  e, inReg, inReg)
16910 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16920 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
16930 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
16940 20 69 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20   inReg, 1);.    
16950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16960 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16970 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
16980 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
16990 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
169a0 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
169b0 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
169c0 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
169d0 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
169e0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
169f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
16a00 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16a10 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16a20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16a30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16a40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
16a50 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
16a60 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
16a70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
16a80 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
16a90 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16ab0 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51  1, r2, inReg, SQ
16ac0 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20  LITE_STOREP2);. 
16ad0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
16ae0 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
16af0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
16b00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16b10 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
16b20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
16b30 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
16b40 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
16b50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
16b60 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
16b70 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
16b80 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
16b90 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
16ba0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
16bb0 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
16bc0 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
16bd0 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
16be0 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
16bf0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16c00 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
16c10 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
16c20 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16c30 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
16c40 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16c50 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
16c60 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
16c70 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16c80 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
16c90 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
16ca0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16cb0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
16cc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16cd0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
16ce0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16cf0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16d00 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
16d10 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
16d20 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16d30 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
16d40 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
16d50 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
16d60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16d70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16d80 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
16d90 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
16da0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16db0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
16dc0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
16dd0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
16de0 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
16df0 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
16e00 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
16e10 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
16e20 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
16e30 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
16e50 2c 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c  , r2, inReg, SQL
16e60 49 54 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51  ITE_STOREP2 | SQ
16e70 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
16e80 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
16e90 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
16ea0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
16eb0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
16ec0 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
16ed0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
16ee0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
16ef0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
16f00 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
16f10 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16f20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
16f30 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
16f40 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
16f50 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
16f60 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
16f70 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
16f80 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
16f90 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
16fa0 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
16fb0 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
16fc0 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
16fd0 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
16fe0 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
16ff0 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
17000 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
17010 50 5f 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20  P_And );        
17020 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17030 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
17040 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d    assert( TK_OR=
17050 3d 4f 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20  =OP_Or );       
17060 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17070 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20   op==TK_OR );.  
17080 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50      assert( TK_P
17090 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20  LUS==OP_Add );  
170a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
170b0 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29  e( op==TK_PLUS )
170c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
170d0 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
170e0 74 72 61 63 74 20 29 3b 20 20 20 20 20 74 65 73  tract );     tes
170f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49  tcase( op==TK_MI
17100 4e 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NUS );.      ass
17110 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
17120 52 65 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20  Remainder );    
17130 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17140 54 4b 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20  TK_REM );.      
17150 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
17160 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20  D==OP_BitAnd ); 
17170 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17180 70 3d 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a  p==TK_BITAND );.
17190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
171a0 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
171b0 20 29 3b 20 20 20 20 20 20 20 20 74 65 73 74 63   );        testc
171c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f  ase( op==TK_BITO
171d0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
171e0 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
171f0 44 69 76 69 64 65 20 29 3b 20 20 20 20 20 20 20  Divide );       
17200 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17210 5f 53 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20  _SLASH );.      
17220 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
17230 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
17240 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
17250 70 3d 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a  p==TK_LSHIFT );.
17260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17270 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _RSHIFT==OP_Shif
17280 74 52 69 67 68 74 20 29 3b 20 20 74 65 73 74 63  tRight );  testc
17290 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49  ase( op==TK_RSHI
172a0 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
172b0 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f  rt( TK_CONCAT==O
172c0 50 5f 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20  P_Concat );     
172d0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
172e0 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20  K_CONCAT );.    
172f0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
17300 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17310 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17320 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
17330 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
17340 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17350 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
17360 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
17370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17380 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32  AddOp3(v, op, r2
17390 2c 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , r1, target);. 
173a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
173b0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
173c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
173d0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
173e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
173f0 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
17400 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
17410 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
17420 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
17430 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
17440 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
17450 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
17460 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e  {.        codeIn
17470 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c  teger(pParse, pL
17480 65 66 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  eft, 1, target);
17490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
174a0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
174b0 49 4e 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  INT.      }else 
174c0 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
174d0 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
174e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
174f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17500 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
17510 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52  );.        codeR
17520 65 61 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e  eal(v, pLeft->u.
17530 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65  zToken, 1, targe
17540 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  t);.#endif.     
17550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17560 74 65 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e  tempX.op = TK_IN
17570 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74  TEGER;.        t
17580 65 6d 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f  empX.flags = EP_
17590 49 6e 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65  IntValue|EP_Toke
175a0 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74  nOnly;.        t
175b0 65 6d 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20  empX.u.iValue = 
175c0 30 3b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  0;.        r1 = 
175d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
175e0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d  emp(pParse, &tem
175f0 70 58 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pX, &regFree1);.
17600 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
17610 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17620 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17630 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 32  pLeft, &regFree2
17640 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17650 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17660 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c  OP_Subtract, r2,
17670 20 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   r1, target);.  
17680 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17690 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
176a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52       }.      inR
176b0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
176c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
176d0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
176e0 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
176f0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  NOT: {.      ass
17700 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d  ert( TK_BITNOT==
17710 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74  OP_BitNot );   t
17720 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17730 42 49 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  BITNOT );.      
17740 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
17750 4f 50 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20  OP_Not );       
17760 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17770 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_NOT );.      
17780 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17790 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
177a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
177b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
177c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
177d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
177e0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
177f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17800 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
17810 31 2c 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20  1, inReg);.     
17820 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17830 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
17840 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
17850 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  TNULL: {.      i
17860 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61  nt addr;.      a
17870 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c  ssert( TK_ISNULL
17880 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20  ==OP_IsNull );  
17890 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
178a0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  K_ISNULL );.    
178b0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
178c0 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
178d0 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70   ); testcase( op
178e0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a  ==TK_NOTNULL );.
178f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17900 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17910 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
17920 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
17930 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17940 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17950 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17960 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
17970 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
17980 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
17990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179a0 31 28 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20  1(v, op, r1);.  
179b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
179c0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
179d0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65  ULL);.      Vdbe
179e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
179f0 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20  ==TK_NOTNULL);. 
17a00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17a10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
17a20 65 67 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29  eger, 0, target)
17a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17a40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17a50 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ddr);.      brea
17a60 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17a70 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
17a80 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
17a90 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70  fo *pInfo = pExp
17aa0 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
17ab0 20 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20     if( pInfo==0 
17ac0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17ad0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
17ae0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
17af0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
17b00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17b10 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
17b20 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a  se of aggregate:
17b30 20 25 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75   %s()", pExpr->u
17b40 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
17b50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
17b60 6e 52 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46  nReg = pInfo->aF
17b70 75 6e 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  unc[pExpr->iAgg]
17b80 2e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  .iMem;.      }. 
17b90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17ba0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  }.    case TK_FU
17bb0 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
17bc0 45 78 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b  ExprList *pFarg;
17bd0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
17be0 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
17bf0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
17c00 74 20 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20  t nFarg;        
17c10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17c20 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
17c30 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75  ents */.      Fu
17c40 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
17c50 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
17c60 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
17c70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  object */.      
17c80 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
17c90 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
17ca0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
17cb0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a   name in bytes *
17cc0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
17cd0 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f  ar *zId;       /
17ce0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
17cf0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  ame */.      u32
17d00 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20   constMask = 0; 
17d10 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66      /* Mask of f
17d20 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
17d30 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74  s that are const
17d40 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ant */.      int
17d50 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
17d60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
17d70 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ter */.      u8 
17d80 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20  enc = ENC(db);  
17d90 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
17da0 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79  encoding used by
17db0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
17dc0 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
17dd0 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f  *pColl = 0;    /
17de0 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  * A collating se
17df0 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20  quence */..     
17e00 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
17e10 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17e20 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
17e30 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
17e40 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17e50 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
17e60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
17e70 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
17e80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
17e90 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
17ea0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
17eb0 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20    nFarg = pFarg 
17ec0 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a  ? pFarg->nExpr :
17ed0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
17ee0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
17ef0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
17f00 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
17f10 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
17f20 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
17f30 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
17f40 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
17f50 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
17f60 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
17f70 64 2c 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65  d, nId, nFarg, e
17f80 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
17f90 28 20 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65  ( pDef==0 || pDe
17fa0 66 2d 3e 78 46 75 6e 63 3d 3d 30 20 29 7b 0a 20  f->xFunc==0 ){. 
17fb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
17fc0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17fd0 75 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  unknown function
17fe0 3a 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20  : %.*s()", nId, 
17ff0 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  zId);.        br
18000 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
18010 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61      /* Attempt a
18020 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e   direct implemen
18030 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75  tation of the bu
18040 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28  ilt-in COALESCE(
18050 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49  ) and.      ** I
18060 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e  FNULL() function
18070 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64 73 20  s.  This avoids 
18080 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c  unnecessary eval
18090 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20  uation of.      
180a0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  ** arguments pas
180b0 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  t the first non-
180c0 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20  NULL argument.. 
180d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
180e0 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
180f0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
18100 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20  COALESCE ){.    
18110 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65      int endCoale
18120 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  sce = sqlite3Vdb
18130 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18140 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
18150 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20  Farg>=2 );.     
18160 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
18170 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
18180 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[0].pExpr, ta
18190 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  rget);.        f
181a0 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b  or(i=1; i<nFarg;
181b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
181c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
181d0 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c  p2(v, OP_NotNull
181e0 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61  , target, endCoa
181f0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
18200 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18220 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
18230 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61 72 67  ove(pParse, targ
18240 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  et, 1);.        
18250 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18260 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
18270 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18280 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
18290 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
182a0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
182b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
182c0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
182d0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  se);.        }. 
182e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
182f0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18300 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
18310 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18320 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
18330 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20   The UNLIKELY() 
18340 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
18350 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74  -op.  The result
18360 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20   is the value.  
18370 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
18380 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
18390 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
183a0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
183b0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
183c0 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
183d0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
183e0 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=1 );.        i
183f0 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
18400 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
18410 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
18420 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
18430 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18440 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
18450 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
18460 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
18470 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
18480 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
18490 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
184a0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
184b0 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
184c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
184d0 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
184e0 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
184f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
18500 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
18510 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
18520 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
18530 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
18540 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
18550 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
18560 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
18570 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
18580 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18590 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
185a0 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
185b0 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
185c0 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
185d0 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
185e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
185f0 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
18600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18610 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
18620 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
18630 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
18640 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
18650 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
18660 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
18670 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
18680 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
18690 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
186a0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
186b0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
186c0 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
186d0 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
186e0 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
186f0 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
18700 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
18710 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
18720 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
18730 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18740 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
18750 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
18760 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
18770 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
18780 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
18790 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
187a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
187b0 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
187c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
187d0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
187e0 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
187f0 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
18800 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
18810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18820 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
18830 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
18840 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
18850 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18860 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
18870 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
18880 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
18890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
188a0 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
188b0 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
188c0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
188d0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
188e0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
188f0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
18900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
18910 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
18920 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
18930 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
18940 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
18950 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
18960 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
18970 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18980 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18990 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
189a0 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
189b0 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
189c0 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
189d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
189e0 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
189f0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 0a 20  se, pFarg, r1,. 
18a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18a20 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
18a30 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
18a40 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
18a50 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
18a60 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
18a70 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
18a80 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
18a90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
18aa0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
18ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ac0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
18ad0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
18ae0 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
18af0 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
18b00 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
18b10 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
18b20 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
18b30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18b40 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
18b50 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
18b60 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
18b70 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
18b80 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
18b90 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
18ba0 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
18bb0 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
18bc0 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
18bd0 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
18be0 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
18bf0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
18c00 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
18c10 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
18c20 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
18c30 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
18c40 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
18c50 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
18c60 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
18c70 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
18c80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
18c90 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
18ca0 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
18cb0 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
18cc0 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
18cd0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
18ce0 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
18cf0 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
18d00 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
18d10 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
18d20 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
18d30 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
18d40 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
18d50 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
18d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18d70 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
18d80 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
18d90 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
18da0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
18db0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
18dc0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
18dd0 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
18de0 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
18df0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
18e00 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
18e10 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
18e20 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
18e30 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
18e40 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
18e50 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
18e60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
18e70 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
18e80 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
18e90 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
18ea0 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
18eb0 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
18ec0 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
18ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18ee0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
18ef0 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
18f00 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
18f10 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
18f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18f30 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
18f40 6e 63 74 69 6f 6e 30 2c 20 63 6f 6e 73 74 4d 61  nction0, constMa
18f50 73 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a  sk, r1, target,.
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
18f80 44 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  Def, P4_FUNCDEF)
18f90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18fa0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
18fb0 75 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  u8)nFarg);.     
18fc0 20 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f   if( nFarg && co
18fd0 6e 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20  nstMask==0 ){.  
18fe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
18ff0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
19000 61 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29  arse, r1, nFarg)
19010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19020 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
19030 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19040 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
19050 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
19060 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
19070 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
19080 73 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  se( op==TK_EXIST
19090 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
190a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45  ase( op==TK_SELE
190b0 43 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65  CT );.      inRe
190c0 67 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53  g = sqlite3CodeS
190d0 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
190e0 20 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20   pExpr, 0, 0);. 
190f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19100 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  }.    case TK_IN
19110 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
19120 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
19130 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19140 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
19150 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69  estIfNull = sqli
19160 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19170 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
19180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19190 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67  OP_Null, 0, targ
191a0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
191b0 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
191c0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
191d0 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e  IfFalse, destIfN
191e0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
191f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19200 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
19210 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
19220 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19230 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
19240 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71  False);.      sq
19250 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19260 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61  v, OP_AddImm, ta
19270 72 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  rget, 0);.      
19280 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
19290 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
192a0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
192b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
192c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
192d0 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20  _SUBQUERY */... 
192e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20     /*.    **    
192f0 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
19300 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
19310 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65  This is equivale
19320 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20  nt to.    **.   
19330 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20   **    x>=y AND 
19340 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  x<=z.    **.    
19350 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69  ** X is stored i
19360 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a  n pExpr->pLeft..
19370 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72      ** Y is stor
19380 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
19390 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a  st->a[0].pExpr..
193a0 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72      ** Z is stor
193b0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  ed in pExpr->pLi
193c0 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a  st->a[1].pExpr..
193d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
193e0 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
193f0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
19400 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
19410 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
19420 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
19430 65 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  em = pExpr->x.pL
19440 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78  ist->a;.      Ex
19450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49  pr *pRight = pLI
19460 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20  tem->pExpr;..   
19470 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
19480 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
19490 73 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46  se, pLeft, &regF
194a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
194b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
194c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
194d0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
194e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
194f0 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
19500 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19510 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
19520 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
19530 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19540 72 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d  rse);.      r4 =
19550 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
19560 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
19570 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
19580 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
19590 67 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20  ght, OP_Ge,.    
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
195b0 2c 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45  , r2, r3, SQLITE
195c0 5f 53 54 4f 52 45 50 32 29 3b 20 20 56 64 62 65  _STOREP2);  Vdbe
195d0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
195e0 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20     pLItem++;.   
195f0 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74     pRight = pLIt
19600 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
19610 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19620 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19630 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
19640 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
19650 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
19660 20 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65   pRight, &regFre
19670 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e2);.      testc
19680 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
19690 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f   );.      codeCo
196a0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
196b0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
196c0 4c 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20  Le, r1, r2, r4, 
196d0 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b  SQLITE_STOREP2);
196e0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
196f0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
19700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
19710 76 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72  v, OP_And, r3, r
19720 34 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  4, target);.    
19730 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
19740 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
19750 72 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r3);.      sqlit
19760 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19770 28 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20  (pParse, r4);.  
19780 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19790 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
197a0 4c 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20  LATE: .    case 
197b0 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
197c0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
197d0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
197e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
197f0 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
19800 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19810 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54  }..    case TK_T
19820 52 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  RIGGER: {.      
19830 2f 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65  /* If the opcode
19840 20 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20   is TK_TRIGGER, 
19850 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
19860 69 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e  ion is a referen
19870 63 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ce.      ** to a
19880 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e   column in the n
19890 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73  ew.* or old.* ps
198a0 65 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69  eudo-tables avai
198b0 6c 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a  lable to.      *
198c0 2a 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  * trigger progra
198d0 6d 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ms. In this case
198e0 20 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20   Expr.iTable is 
198f0 73 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65  set to 1 for the
19900 0a 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20  .      ** new.* 
19910 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72  pseudo-table, or
19920 20 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a   0 for the old.*
19930 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45   pseudo-table. E
19940 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  xpr.iColumn.    
19950 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74    ** is set to t
19960 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  he column of the
19970 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f   pseudo-table to
19980 20 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20   read, or to -1 
19990 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  to.      ** read
199a0 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64   the rowid field
199b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
199c0 20 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   ** The expressi
199d0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
199e0 64 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61  d using an OP_Pa
199f0 72 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20  ram opcode. The 
19a00 70 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61  p1.      ** para
19a10 6d 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  meter is set to 
19a20 30 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77  0 for an old.row
19a30 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72  id reference, or
19a40 20 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20   to (i+1).      
19a50 2a 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  ** to reference 
19a60 61 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f  another column o
19a70 66 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  f the old.* pseu
19a80 64 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20  do-table, where 
19a90 0a 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74  .      ** i is t
19aa0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
19ab0 63 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65  column. For a ne
19ac0 77 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63  w.rowid referenc
19ad0 65 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a  e, p1 is.      *
19ae0 2a 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20  * set to (n+1), 
19af0 77 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e  where n is the n
19b00 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
19b10 20 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d   in each pseudo-
19b20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
19b30 46 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20  For a reference 
19b40 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c  to any other col
19b50 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
19b60 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70   pseudo-table, p
19b70 31 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65  1.      ** is se
19b80 74 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68  t to (n+2+i), wh
19b90 65 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20  ere n and i are 
19ba0 61 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69  as defined previ
19bb0 6f 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20  ously. For.     
19bc0 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20   ** example, if 
19bd0 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69  the table on whi
19be0 63 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20  ch triggers are 
19bf0 62 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20  being fired is. 
19c00 20 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64       ** declared
19c10 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
19c20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
19c30 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
19c40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19c50 2a 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74  * Then p1 is int
19c60 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
19c70 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
19c80 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20      **   p1==0  
19c90 20 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64   ->    old.rowid
19ca0 20 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20       p1==3   -> 
19cb0 20 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20     new.rowid.   
19cc0 20 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20     **   p1==1   
19cd0 2d 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20  ->    old.a     
19ce0 20 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20      p1==4   ->  
19cf0 20 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a    new.a.      **
19d00 20 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20     p1==2   ->   
19d10 20 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70   old.b         p
19d20 31 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==5   ->    new
19d30 2e 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .b       .      
19d40 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
19d50 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
19d60 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  ab;.      int p1
19d70 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
19d80 20 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31   * (pTab->nCol+1
19d90 29 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69  ) + 1 + pExpr->i
19da0 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61  Column;..      a
19db0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54  ssert( pExpr->iT
19dc0 61 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72  able==0 || pExpr
19dd0 2d 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  ->iTable==1 );. 
19de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
19df0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20  pr->iColumn>=-1 
19e00 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
19e10 6e 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  n<pTab->nCol );.
19e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
19e30 61 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70  ab->iPKey<0 || p
19e40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  Expr->iColumn!=p
19e50 54 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20  Tab->iPKey );.  
19e60 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d      assert( p1>=
19e70 30 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e  0 && p1<(pTab->n
19e80 43 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20  Col*2+2) );..   
19e90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19ea0 64 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d  dOp2(v, OP_Param
19eb0 2c 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20  , p1, target);. 
19ec0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
19ed0 28 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24  ((v, "%s.%s -> $
19ee0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45  %d",.        (pE
19ef0 78 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e  xpr->iTable ? "n
19f00 65 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20  ew" : "old"),.  
19f10 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43        (pExpr->iC
19f20 6f 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64  olumn<0 ? "rowid
19f30 22 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d  " : pExpr->pTab-
19f40 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f  >aCol[pExpr->iCo
19f50 6c 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20  lumn].zName),.  
19f60 20 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20        target.   
19f70 20 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20     ));..#ifndef 
19f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
19f90 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
19fa0 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
19fb0 6e 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e  n has REAL affin
19fc0 69 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72  ity, it may curr
19fd0 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ently be stored 
19fe0 61 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69  as an.      ** i
19ff0 6e 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52  nteger. Use OP_R
1a000 65 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d  ealAffinity to m
1a010 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72  ake sure it is r
1a020 65 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20  eally real..    
1a030 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
1a040 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39  IDENCE-OF: R-609
1a050 38 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20  85-57662 SQLite 
1a060 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
1a070 20 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20   value back to. 
1a080 20 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67       ** floating
1a090 20 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72   point when extr
1a0a0 61 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74  acting it from t
1a0b0 68 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20  he record.  */. 
1a0c0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1a0d0 69 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20  iColumn>=0 .    
1a0e0 20 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c     && pTab->aCol
1a0f0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1a100 2e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  .affinity==SQLIT
1a110 45 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20  E_AFF_REAL.     
1a120 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a130 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
1a140 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79   OP_RealAffinity
1a150 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1a160 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1a170 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1a180 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     /*.    ** For
1a190 6d 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m A:.    **   CA
1a1a0 53 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45  SE x WHEN e1 THE
1a1b0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
1a1c0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
1a1d0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
1a1e0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
1a1f0 2a 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a  * Form B:.    **
1a200 20 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20     CASE WHEN e1 
1a210 54 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20  THEN r1 WHEN e2 
1a220 54 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e  THEN r2 ... WHEN
1a230 20 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45   eN THEN rN ELSE
1a240 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
1a250 20 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63    ** Form A is c
1a260 61 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65  an be transforme
1a270 64 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76  d into the equiv
1a280 61 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20  alent form B as 
1a290 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20  follows:.    ** 
1a2a0 20 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31    CASE WHEN x=e1
1a2b0 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d   THEN r1 WHEN x=
1a2c0 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20  e2 THEN r2 .... 
1a2d0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45     **        WHE
1a2e0 4e 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45  N x=eN THEN rN E
1a2f0 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a  LSE y END.    **
1a300 0a 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74  .    ** X (if it
1a310 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70   exists) is in p
1a320 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
1a330 20 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20   ** Y is in the 
1a340 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  last element of 
1a350 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69  pExpr->x.pList i
1a360 66 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  f pExpr->x.pList
1a370 2d 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a  ->nExpr is.    *
1a380 2a 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73  * odd.  The Y is
1a390 20 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20   also optional. 
1a3a0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
1a3b0 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e  f elements in x.
1a3c0 70 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20  pList.    ** is 
1a3d0 65 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20  even, then Y is 
1a3e0 6f 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20  omitted and the 
1a3f0 22 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75  "otherwise" resu
1a400 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20  lt is NULL..    
1a410 2a 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70  ** Ei is in pExp
1a420 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d  r->pList->a[i*2]
1a430 20 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72   and Ri is pExpr
1a440 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31  ->pList->a[i*2+1
1a450 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ]..    **.    **
1a460 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
1a470 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1a480 20 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20   the Ri for the 
1a490 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45  first matching E
1a4a0 69 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  i,.    ** or if 
1a4b0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
1a4c0 68 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53  hing Ei, the ELS
1a4d0 45 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20  E term Y, or if 
1a4e0 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20  there is.    ** 
1a4f0 6e 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55  no ELSE term, NU
1a500 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LL..    */.    d
1a510 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20  efault: assert( 
1a520 6f 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b  op==TK_CASE ); {
1a530 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61  .      int endLa
1a540 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
1a550 20 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f           /* GOTO
1a560 20 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f   label for end o
1a570 66 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20  f CASE stmt */. 
1a580 20 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73       int nextCas
1a590 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a5a0 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
1a5b0 61 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48  abel for next WH
1a5c0 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  EN clause */.   
1a5d0 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20     int nExpr;   
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65       /* 2x numbe
1a600 72 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20  r of WHEN terms 
1a610 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1a640 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1a650 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1a660 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1a670 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1a680 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
1a690 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
1a6a0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
1a6b0 65 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20  elem;  /* Array 
1a6c0 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
1a6d0 0a 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f  .      Expr opCo
1a6e0 6d 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20  mpare;          
1a6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a700 58 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e  X==Ei expression
1a710 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
1a720 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1a730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a740 68 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20  he X expression 
1a750 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
1a760 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
1a770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d             /* X=
1a780 3d 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20  =Ei (form A) or 
1a790 6a 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29  just Ei (form B)
1a7a0 20 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e   */.      VVA_ON
1a7b0 4c 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65  LY( int iCacheLe
1a7c0 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
1a7d0 61 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20  acheLevel; )..  
1a7e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1a7f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1a800 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1a810 29 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ) && pExpr->x.pL
1a820 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ist );.      ass
1a830 65 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ert(pExpr->x.pLi
1a840 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
1a850 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
1a860 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1a870 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
1a880 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
1a890 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
1a8a0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
1a8b0 6e 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  ndLabel = sqlite
1a8c0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1a8d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  );.      if( (pX
1a8e0 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29   = pExpr->pLeft)
1a8f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74  !=0 ){.        t
1a900 65 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20  empX = *pX;.    
1a910 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
1a920 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1a930 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54  );.        exprT
1a940 6f 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58  oRegister(&tempX
1a950 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
1a960 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58  eTemp(pParse, pX
1a970 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20  , &regFree1));. 
1a980 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a990 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1a9a0 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72          opCompar
1a9b0 65 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20  e.op = TK_EQ;.  
1a9c0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
1a9d0 70 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a  pLeft = &tempX;.
1a9e0 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20          pTest = 
1a9f0 26 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  &opCompare;.    
1aa00 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33      /* Ticket b3
1aa10 35 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39  51d95f9cd5ef17e9
1aa20 64 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31  d9dbae18f5ca8611
1aa30 31 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20  190001:.        
1aa40 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20  ** The value in 
1aa50 72 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67  regFree1 might g
1aa60 65 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f  et SCopy-ed into
1aa70 20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74   the file result
1aa80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20  ..        ** So 
1aa90 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1aaa0 68 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69  he regFree1 regi
1aab0 73 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73  ster is not reus
1aac0 65 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20  ed for other.   
1aad0 20 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73       ** purposes
1aae0 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76   and possibly ov
1aaf0 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
1ab00 20 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20         regFree1 
1ab10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1ab20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
1ab30 78 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20  xpr-1; i=i+2){. 
1ab40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ab50 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1ab60 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
1ab70 20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20   pX ){.         
1ab80 20 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d   assert( pTest!=
1ab90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  0 );.          o
1aba0 70 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20  pCompare.pRight 
1abb0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
1abc0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  Expr;.        }e
1abd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1abe0 54 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d  Test = aListelem
1abf0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
1ac00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78     }.        nex
1ac10 74 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56  tCase = sqlite3V
1ac20 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
1ac30 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1ac40 65 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b  e( pTest->op==TK
1ac50 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1ac60 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1ac70 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
1ac80 65 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53  est, nextCase, S
1ac90 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1aca0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1acb0 61 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69  ase( aListelem[i
1acc0 2b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  +1].pExpr->op==T
1acd0 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
1ace0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1acf0 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
1ad00 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
1ad10 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1ad20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ad30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1ad40 20 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20   0, endLabel);. 
1ad50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ad60 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
1ad70 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
1ad80 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ad90 62 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29  bel(v, nextCase)
1ada0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1adb0 69 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30  if( (nExpr&1)!=0
1adc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1add0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1ade0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1adf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ae00 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
1ae10 2d 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78  ->a[nExpr-1].pEx
1ae20 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
1ae30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ae40 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1ae50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ae60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ae70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
1ae80 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
1ae90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1aea0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1aeb0 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
1aec0 65 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20  e->nErr>0 .     
1aed0 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d        || pParse-
1aee0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43  >iCacheLevel==iC
1aef0 61 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20  acheLevel );.   
1af00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1af10 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
1af20 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  dLabel);.      b
1af30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1af40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1af50 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
1af60 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
1af70 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1af80 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52  ->affinity==OE_R
1af90 6f 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20  ollback .       
1afa0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
1afb0 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74  finity==OE_Abort
1afc0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1afd0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1afe0 4f 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20  OE_Fail.        
1aff0 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
1b000 69 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65  inity==OE_Ignore
1b010 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1b020 69 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72  if( !pParse->pTr
1b030 69 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20  iggerTab ){.    
1b040 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1b050 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
1b080 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
1b090 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
1b0a0 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
1b0b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1b0c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
1b0d0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1b0e0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
1b0f0 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
1b100 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
1b110 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1b120 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1b130 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1b140 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69  alue) );.      i
1b150 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  f( pExpr->affini
1b160 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  ty==OE_Ignore ){
1b170 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b180 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
1b190 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61          v, OP_Ha
1b1a0 6c 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f  lt, SQLITE_OK, O
1b1b0 45 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78  E_Ignore, 0, pEx
1b1c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b  pr->u.zToken,0);
1b1d0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
1b1e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
1b1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1b200 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
1b210 61 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c  aint(pParse, SQL
1b220 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54  ITE_CONSTRAINT_T
1b230 52 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20  RIGGER,.        
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
1b260 69 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e  inity, pExpr->u.
1b270 7a 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20  zToken, 0, 0);. 
1b280 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
1b290 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1b2a0 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  f.  }.  sqlite3R
1b2b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1b2c0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1b2d0 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1b2e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b2f0 20 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65   regFree2);.  re
1b300 74 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f  turn inReg;.}../
1b310 2a 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20  *.** Factor out 
1b320 74 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20  the code of the 
1b330 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
1b340 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   to initializati
1b350 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
1b360 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b370 41 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20  AtInit(.  Parse 
1b380 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1b390 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1b3a0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1b3b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
1b3c0 72 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20  ression to code 
1b3d0 77 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e  when the VDBE in
1b3e0 69 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69  itializes */.  i
1b3f0 6e 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20  nt regDest,     
1b400 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61   /* Store the va
1b410 6c 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69  lue in this regi
1b420 73 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75  ster */.  u8 reu
1b430 73 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54  sable       /* T
1b440 72 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72  rue if this expr
1b450 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62  ession is reusab
1b460 6c 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  le */.){.  ExprL
1b470 69 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  ist *p;.  assert
1b480 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28  ( ConstFactorOk(
1b490 70 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d  pParse) );.  p =
1b4a0 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1b4b0 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73  xpr;.  pExpr = s
1b4c0 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
1b4d0 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
1b4e0 20 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74   0);.  p = sqlit
1b4f0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1b500 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70  (pParse, p, pExp
1b510 72 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  r);.  if( p ){. 
1b520 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1b530 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1b540 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72  = &p->a[p->nExpr
1b550 2d 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  -1];.     pItem-
1b560 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  >u.iConstExprReg
1b570 20 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20   = regDest;.    
1b580 20 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65   pItem->reusable
1b590 20 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d   = reusable;.  }
1b5a0 0a 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  .  pParse->pCons
1b5b0 74 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  tExpr = p;.}../*
1b5c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1b5d0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e  e to evaluate an
1b5e0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
1b5f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1b600 73 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69  s.** into a regi
1b610 73 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ster.  Return th
1b620 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
1b630 72 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75  r where the resu
1b640 6c 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  lts.** are store
1b650 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1b660 72 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65  register is a te
1b670 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
1b680 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61   that can be dea
1b690 6c 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65  llocated,.** the
1b6a0 6e 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62  n write its numb
1b6b0 65 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20  er into *pReg.  
1b6c0 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
1b6d0 67 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a  gister is not.**
1b6e0 20 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68   a temporary, th
1b6f0 65 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20  en set *pReg to 
1b700 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  zero..**.** If p
1b710 45 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61  Expr is a consta
1b720 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1b730 75 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65  utine might gene
1b740 72 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64  rate this.** cod
1b750 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65  e to fill the re
1b760 67 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e  gister in the in
1b770 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63  itialization sec
1b780 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56  tion of the.** V
1b790 44 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20  DBE program, in 
1b7a0 6f 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20  order to factor 
1b7b0 69 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76  it out of the ev
1b7c0 61 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a  aluation loop..*
1b7d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1b7e0 72 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20  rCodeTemp(Parse 
1b7f0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b800 45 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29  Expr, int *pReg)
1b810 7b 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45  {.  int r2;.  pE
1b820 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1b830 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78  rSkipCollate(pEx
1b840 70 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74  pr);.  if( Const
1b850 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1b860 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  .   && pExpr->op
1b870 21 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20  !=TK_REGISTER.  
1b880 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1b890 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
1b8a0 28 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20  (pExpr).  ){.   
1b8b0 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70   ExprList *p = p
1b8c0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1b8d0 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  r;.    int i;.  
1b8e0 20 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20    *pReg  = 0;.  
1b8f0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1b900 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1b910 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1b920 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d      for(pItem=p-
1b930 3e 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20  >a, i=p->nExpr; 
1b940 69 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d  i>0; pItem++, i-
1b950 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -){.        if( 
1b960 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
1b970 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
1b980 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
1b990 70 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20  pr,pExpr,-1)==0 
1b9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1b9b0 75 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f  urn pItem->u.iCo
1b9c0 6e 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20  nstExprReg;.    
1b9d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b9e0 20 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70    }.    r2 = ++p
1b9f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1ba00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ba10 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70  AtInit(pParse, p
1ba20 45 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20  Expr, r2, 1);.  
1ba30 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1ba40 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
1ba50 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1ba60 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1ba70 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1ba80 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29  arse, pExpr, r1)
1ba90 3b 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31  ;.    if( r2==r1
1baa0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20   ){.      *pReg 
1bab0 3d 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = r1;.    }else{
1bac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1bad0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1bae0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
1baf0 2a 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  *pReg = 0;.    }
1bb00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32  .  }.  return r2
1bb10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1bb20 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1bb30 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
1bb40 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
1bb50 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1bb60 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1bb70 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
1bb80 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
1bb90 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
1bba0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1bbb0 61 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  arget..*/.void s
1bbc0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50  qlite3ExprCode(P
1bbd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1bbe0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1bbf0 61 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e  arget){.  int in
1bc00 52 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Reg;..  assert( 
1bc10 74 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67  target>0 && targ
1bc20 65 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  et<=pParse->nMem
1bc30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
1bc40 26 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  && pExpr->op==TK
1bc50 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20  _REGISTER ){.   
1bc60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bc70 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1bc80 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72  , OP_Copy, pExpr
1bc90 2d 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74  ->iTable, target
1bca0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1bcb0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1bcc0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1bcd0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1bce0 67 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  get);.    assert
1bcf0 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20  ( pParse->pVdbe 
1bd00 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1bd10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1bd20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1bd30 72 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e  rget && pParse->
1bd40 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73  pVdbe ){.      s
1bd50 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1bd60 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1bd70 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c  OP_SCopy, inReg,
1bd80 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a   target);.    }.
1bd90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1bda0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1bdb0 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
1bdc0 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
1bdd0 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1bde0 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1bdf0 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
1be00 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
1be10 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
1be20 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
1be30 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
1be40 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
1be50 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
1be60 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
1be70 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
1be80 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
1be90 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
1bea0 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1beb0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1bec0 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
1bed0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1bee0 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1bef0 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
1bf00 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1bf10 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1bf20 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
1bf30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1bf40 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1bf50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1bf60 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  get, 0);.  }else
1bf70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1bf80 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1bf90 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1bfa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1bfb0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
1bfc0 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65  aluates the give
1bfd0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
1bfe0 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
1bff0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1c000 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
1c010 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
1c020 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1c030 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
1c040 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
1c050 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
1c060 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
1c070 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
1c080 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1c090 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
1c0a0 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
1c0b0 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
1c0c0 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
1c0d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1c0e0 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
1c0f0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
1c100 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
1c110 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
1c120 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
1c130 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
1c140 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1c150 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
1c160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1c170 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
1c180 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c190 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1c1a0 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1c1b0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c1c0 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
1c1d0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1c1e0 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1c1f0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1c200 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71  REGISTER );.  sq
1c210 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1c220 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1c230 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b  get);.  iMem = +
1c240 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1c250 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c260 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74  p2(v, OP_Copy, t
1c270 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20  arget, iMem);.  
1c280 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
1c290 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a  Expr, iMem);.}..
1c2a0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c2b0 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
1c2c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
1c2d0 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
1c2e0 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1c2f0 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
1c300 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1c310 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
1c320 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
1c330 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1c340 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1c350 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a   evaluated..**.*
1c360 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1c370 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65  L_DUP flag preve
1c380 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74  nts the argument
1c390 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  s from being.** 
1c3a0 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f  filled using OP_
1c3b0 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20  SCopy.  OP_Copy 
1c3c0 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
1c3d0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tead..**.** The 
1c3e0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1c3f0 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f  OR argument allo
1c400 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ws constant argu
1c410 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66  ments to be.** f
1c420 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f  actored out into
1c430 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1c440 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
1c450 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1c460 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
1c470 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
1c480 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c490 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1c4a0 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
1c4b0 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
1c4c0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
1c4d0 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
1c4e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
1c4f0 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
1c500 75 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  u8 flags        
1c510 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45     /* SQLITE_ECE
1c520 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  L_* flags */.){.
1c530 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1c540 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1c550 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 75 38 20   int i, n;.  u8 
1c560 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67 73 20  copyOp = (flags 
1c570 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  & SQLITE_ECEL_DU
1c580 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a 20 4f  P) ? OP_Copy : O
1c590 50 5f 53 43 6f 70 79 3b 0a 20 20 61 73 73 65 72  P_SCopy;.  asser
1c5a0 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
1c5b0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1c5c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c5d0 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
1c5e0 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74  );  /* Never get
1c5f0 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72  s this far other
1c600 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c  wise */.  n = pL
1c610 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
1c620 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  ( !ConstFactorOk
1c630 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73  (pParse) ) flags
1c640 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c   &= ~SQLITE_ECEL
1c650 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70  _FACTOR;.  for(p
1c660 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1c670 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
1c680 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
1c690 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
1c6a0 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
1c6b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1c6c0 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20  ECEL_FACTOR)!=0 
1c6d0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1c6e0 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
1c6f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1c700 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1c710 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1c720 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20  rget+i, 0);.    
1c730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1c740 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
1c750 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
1c760 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61  Parse, pExpr, ta
1c770 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69  rget+i);.      i
1c780 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1c790 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64  +i ){.        Vd
1c7a0 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20  beOp *pOp;.     
1c7b0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
1c7c0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
1c7d0 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d      if( copyOp==
1c7e0 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20  OP_Copy.        
1c7f0 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33   && (pOp=sqlite3
1c800 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29  VdbeGetOp(v, -1)
1c810 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  )->opcode==OP_Co
1c820 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  py.         && p
1c830 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p1+pOp->p3+1
1c840 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ==inReg.        
1c850 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d   && pOp->p2+pOp-
1c860 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a  >p3+1==target+i.
1c870 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1c880 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a       pOp->p3++;.
1c890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c8a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c8b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f  VdbeAddOp2(v, co
1c8c0 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72  pyOp, inReg, tar
1c8d0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  get+i);.        
1c8e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c8f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
1c900 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1c910 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54  e code for a BET
1c920 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  WEEN operator..*
1c930 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45  *.**    x BETWEE
1c940 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20  N y AND z.**.** 
1c950 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71 75  The above is equ
1c960 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a  ivalent to .**.*
1c970 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c  *    x>=y AND x<
1c980 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74  =z.**.** Code it
1c990 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67   as such, taking
1c9a0 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20   care to do the 
1c9b0 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73  common subexpres
1c9c0 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74  sion.** eliminat
1c9d0 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61  ion of x..*/.sta
1c9e0 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64  tic void exprCod
1c9f0 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73  eBetween(.  Pars
1ca00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1ca10 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
1ca20 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
1ca30 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
1ca40 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54  pExpr,      /* T
1ca50 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72 65  he BETWEEN expre
1ca60 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
1ca70 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  est,         /* 
1ca80 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65  Jump here if the
1ca90 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a   jump is taken *
1caa0 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72  /.  int jumpIfTr
1cab0 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ue,   /* Take th
1cac0 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1cad0 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f  TWEEN is true */
1cae0 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
1caf0 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65  l    /* Take the
1cb00 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54   jump if the BET
1cb10 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a  WEEN is NULL */.
1cb20 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e  ){.  Expr exprAn
1cb30 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e  d;     /* The AN
1cb40 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78  D operator in  x
1cb50 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f  >=y AND x<=z  */
1cb60 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74  .  Expr compLeft
1cb70 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d  ;    /* The  x>=
1cb80 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  y  term */.  Exp
1cb90 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f  r compRight;   /
1cba0 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72  * The  x<=z  ter
1cbb0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72  m */.  Expr expr
1cbc0 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  X;       /* The 
1cbd0 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69 6f   x  subexpressio
1cbe0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  n */.  int regFr
1cbf0 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70  ee1 = 0; /* Temp
1cc00 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
1cc10 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
1cc20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1cc30 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1cc40 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72  elect) );.  expr
1cc50 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66  X = *pExpr->pLef
1cc60 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20  t;.  exprAnd.op 
1cc70 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72  = TK_AND;.  expr
1cc80 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d  And.pLeft = &com
1cc90 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1cca0 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52  .pRight = &compR
1ccb0 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  ight;.  compLeft
1ccc0 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63  .op = TK_GE;.  c
1ccd0 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20  ompLeft.pLeft = 
1cce0 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65  &exprX;.  compLe
1ccf0 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ft.pRight = pExp
1cd00 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d  r->x.pList->a[0]
1cd10 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69  .pExpr;.  compRi
1cd20 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a  ght.op = TK_LE;.
1cd30 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66    compRight.pLef
1cd40 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1cd50 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d  mpRight.pRight =
1cd60 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1cd70 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65  >a[1].pExpr;.  e
1cd80 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26 65  xprToRegister(&e
1cd90 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70  xprX, sqlite3Exp
1cda0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1cdb0 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46 72  , &exprX, &regFr
1cdc0 65 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75 6d  ee1));.  if( jum
1cdd0 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73  pIfTrue ){.    s
1cde0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1cdf0 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1ce00 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1ce10 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
1ce20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1ce30 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65  False(pParse, &e
1ce40 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75  xprAnd, dest, ju
1ce50 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20  mpIfNull);.  }. 
1ce60 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1ce70 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1ce80 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20  egFree1);..  /* 
1ce90 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65 20  Ensure adequate 
1cea0 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f  test coverage */
1ceb0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1cec0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1ced0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1cee0 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1cef0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1cf00 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1cf10 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46  fNull==0 && regF
1cf20 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1cf30 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1cf40 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1cf50 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1cf60 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1cf70 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1cf80 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  0 && jumpIfNull!
1cf90 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1cfa0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1cfb0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1cfc0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1cfd0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1cfe0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1cff0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1d000 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1d010 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1d020 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d030 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1d040 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1d050 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1d060 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1d070 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1d080 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1d090 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e1!=0 );.}../*.*
1d0a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d0b0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
1d0c0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
1d0d0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
1d0e0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
1d0f0 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
1d100 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
1d110 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
1d120 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1d130 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1d140 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1d150 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
1d160 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1d170 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1d180 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
1d190 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
1d1a0 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
1d1b0 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
1d1c0 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49  ull flag is SQLI
1d1d0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a  TE_JUMPIFNULL..*
1d1e0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
1d1f0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
1d200 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
1d210 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
1d220 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
1d230 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
1d240 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
1d250 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
1d260 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
1d270 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
1d280 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
1d290 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
1d2a0 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
1d2b0 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
1d2c0 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
1d2d0 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
1d2e0 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
1d2f0 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
1d300 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
1d310 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
1d320 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
1d330 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
1d340 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d350 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
1d360 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1d370 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
1d380 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1d390 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1d3a0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1d3b0 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74  nt op = 0;.  int
1d3c0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1d3d0 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
1d3e0 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b  0;.  int r1, r2;
1d3f0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70  ..  assert( jump
1d400 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a  IfNull==SQLITE_J
1d410 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d  UMPIFNULL || jum
1d420 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1d430 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20  if( NEVER(v==0) 
1d440 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f  )     return;  /
1d450 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
1d460 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
1d470 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e  aller */.  if( N
1d480 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29  EVER(pExpr==0) )
1d490 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20   return;  /* No 
1d4a0 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61 70  way this can hap
1d4b0 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45  pen */.  op = pE
1d4c0 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63  xpr->op;.  switc
1d4d0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1d4e0 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
1d4f0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
1d500 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1d510 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  v);.      testca
1d520 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1d530 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1d540 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1d550 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1d560 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c  ft, d2,jumpIfNul
1d570 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  l^SQLITE_JUMPIFN
1d580 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
1d590 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1d5a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1d5b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1d5c0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1d5d0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1d5e0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1d5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1d600 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1d610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d620 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1d630 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1d640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d650 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1d660 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1d670 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1d680 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1d690 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1d6a0 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1d6b0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1d6c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1d6d0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1d6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d6f0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1d700 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1d710 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1d720 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1d730 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1d740 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1d750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d760 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1d770 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1d780 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1d790 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1d7a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1d7b0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1d7c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1d7d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d7e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
1d7f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
1d800 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
1d810 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
1d820 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
1d830 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1d840 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1d850 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1d860 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1d870 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1d880 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1d890 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1d8a0 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1d8b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1d8c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1d8d0 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1d8e0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64  ree2);.      cod
1d8f0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1d900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1d910 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1d920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d930 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1d940 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1d950 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c       assert(TK_L
1d960 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63  T==OP_Lt); testc
1d970 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20  ase(op==OP_Lt); 
1d980 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1d990 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20  ,op==OP_Lt);.   
1d9a0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d     assert(TK_LE=
1d9b0 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73  =OP_Le); testcas
1d9c0 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64  e(op==OP_Le); Vd
1d9d0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1d9e0 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20  p==OP_Le);.     
1d9f0 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f   assert(TK_GT==O
1da00 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65 28  P_Gt); testcase(
1da10 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65  op==OP_Gt); Vdbe
1da20 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1da30 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61  =OP_Gt);.      a
1da40 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f  ssert(TK_GE==OP_
1da50 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ge); testcase(op
1da60 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ge); VdbeCo
1da70 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1da80 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Ge);.      ass
1da90 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71  ert(TK_EQ==OP_Eq
1daa0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1dab0 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65  OP_Eq); VdbeCove
1dac0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1dad0 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
1dae0 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1daf0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1db00 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Ne); VdbeCovera
1db10 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65  geIf(v,op==OP_Ne
1db20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1db30 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1db40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1db50 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
1db60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1db70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1db80 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  IS:.    case TK_
1db90 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  ISNOT: {.      t
1dba0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1dbb0 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1dbc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1dbd0 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  OT );.      r1 =
1dbe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dbf0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1dc00 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
1dc10 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
1dc20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1dc30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1dc40 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
1dc50 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f  gFree2);.      o
1dc60 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20  p = (op==TK_IS) 
1dc70 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b  ? TK_EQ : TK_NE;
1dc80 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1dc90 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1dca0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1dcb0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1dcd0 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
1dce0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
1dcf0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1dd00 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
1dd10 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1dd20 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1dd30 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
1dd40 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1dd50 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1dd60 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
1dd70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dd80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1dd90 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
1dda0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
1ddb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
1ddc0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
1ddd0 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
1dde0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
1ddf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1de00 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
1de10 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
1de20 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
1de30 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ULL );.      r1 
1de40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1de50 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1de60 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1de70 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71  Free1);.      sq
1de80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1de90 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29  v, op, r1, dest)
1dea0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1deb0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1dec0 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
1ded0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1dee0 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
1def0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1df00 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
1df10 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1df20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1df30 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
1df40 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1df50 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1df60 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
1df70 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
1df80 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49  , dest, 1, jumpI
1df90 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1dfa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1dfb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1dfc0 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1dfd0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1dfe0 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20  int destIfFalse 
1dff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1e000 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1e010 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
1e020 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64  = jumpIfNull ? d
1e030 65 73 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73  est : destIfFals
1e040 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
1e050 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1e060 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66  e, pExpr, destIf
1e070 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c  False, destIfNul
1e080 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1e090 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e0a0 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
1e0b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e0c0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1e0d0 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1e0e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e0f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1e100 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1e110 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
1e120 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
1e130 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e140 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1e150 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
1e160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
1e170 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1e180 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
1e190 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * No-op */.     
1e1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e1b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1e1c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1e1d0 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
1e1e0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
1e1f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1e200 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74   OP_If, r1, dest
1e210 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
1e220 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
1e230 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
1e240 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1e250 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1e260 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e270 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1e290 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1e2a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1e2b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1e2c0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1e2d0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1e2e0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1e2f0 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  2);  .}../*.** G
1e300 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1e310 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
1e320 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
1e330 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
1e340 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
1e350 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
1e360 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1e370 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1e380 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1e390 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1e3a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1e3b0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
1e3c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
1e3d0 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
1e3e0 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
1e3f0 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20   false) then.** 
1e400 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75  jump if jumpIfNu
1e410 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ll is SQLITE_JUM
1e420 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20  PIFNULL or fall 
1e430 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
1e440 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a  fNull.** is 0..*
1e450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1e460 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
1e470 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1e480 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20  Expr, int dest, 
1e490 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b  int jumpIfNull){
1e4a0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1e4b0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
1e4c0 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t op = 0;.  int 
1e4d0 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20  regFree1 = 0;.  
1e4e0 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
1e4f0 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a  ;.  int r1, r2;.
1e500 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49  .  assert( jumpI
1e510 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55  fNull==SQLITE_JU
1e520 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70  MPIFNULL || jump
1e530 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69  IfNull==0 );.  i
1e540 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29  f( NEVER(v==0) )
1e550 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73   return; /* Exis
1e560 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1e570 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1e580 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  */.  if( pExpr==
1e590 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a  0 )    return;..
1e5a0 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    /* The value o
1e5b0 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20  f pExpr->op and 
1e5c0 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64 20 61  op are related a
1e5d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1e5e0 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72    **       pExpr
1e5f0 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1e600 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d  op.  **       --
1e610 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20  -------         
1e620 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a   ----------.  **
1e630 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c         TK_ISNULL
1e640 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74            OP_Not
1e650 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1e660 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20  TK_NOTNULL      
1e670 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a     OP_IsNull.  *
1e680 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20  *       TK_NE   
1e690 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71             OP_Eq
1e6a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45  .  **       TK_E
1e6b0 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  Q              O
1e6c0 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Ne.  **       
1e6d0 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20 20 20  TK_GT           
1e6e0 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20     OP_Le.  **   
1e6f0 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20      TK_LE       
1e700 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a         OP_Gt.  *
1e710 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20  *       TK_GE   
1e720 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74             OP_Lt
1e730 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1e740 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  T              O
1e750 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  P_Ge.  **.  ** F
1e760 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20  or other values 
1e770 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70  of pExpr->op, op
1e780 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   is undefined an
1e790 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54  d unused..  ** T
1e7a0 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20  he value of TK_ 
1e7b0 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
1e7c0 73 20 61 72 65 20 61 72 72 61 6e 67 65 64 20 73  s are arranged s
1e7d0 75 63 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a  uch that we.  **
1e7e0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1e7f0 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75   mapping above u
1e800 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sing the followi
1e810 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20  ng expression.. 
1e820 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20 76 65   ** Assert()s ve
1e830 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
1e840 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72  mputation is cor
1e850 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20  rect..  */.  op 
1e860 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54  = ((pExpr->op+(T
1e870 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d  K_ISNULL&1))^1)-
1e880 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a  (TK_ISNULL&1);..
1e890 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72    /* Verify corr
1e8a0 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  ect alignment of
1e8b0 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e   TK_ and OP_ con
1e8c0 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73  stants.  */.  as
1e8d0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1e8e0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70  =TK_ISNULL || op
1e8f0 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a  ==OP_NotNull );.
1e900 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e910 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20  >op!=TK_NOTNULL 
1e920 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  || op==OP_IsNull
1e930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1e940 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c  xpr->op!=TK_NE |
1e950 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  | op==OP_Eq );. 
1e960 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1e970 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d  op!=TK_EQ || op=
1e980 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65  =OP_Ne );.  asse
1e990 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1e9a0 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47  K_LT || op==OP_G
1e9b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1e9c0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20  Expr->op!=TK_LE 
1e9d0 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a  || op==OP_Gt );.
1e9e0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1e9f0 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70  >op!=TK_GT || op
1ea00 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73  ==OP_Le );.  ass
1ea10 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1ea20 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GE || op==OP_
1ea30 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  Lt );..  switch(
1ea40 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1ea50 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b    case TK_AND: {
1ea60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ea70 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1ea80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ea90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1eaa0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1eab0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1eac0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1ead0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1eae0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1eaf0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1eb00 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1eb10 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1eb20 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1eb30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1eb40 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1eb50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1eb60 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1eb70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1eb80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1eb90 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1eba0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1ebb0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1ebc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1ebd0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1ebe0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75  r->pLeft, d2, ju
1ebf0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1ec00 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1ec10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ec20 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1ec30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ec40 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1ec50 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ec60 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1ec70 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
1ec80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1ec90 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
1eca0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1ecb0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1ecc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ecd0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
1ece0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ecf0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1ed00 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1ed10 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1ed20 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ed30 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ed40 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1ed50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ed60 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1ed70 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1ed80 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1ed90 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1eda0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1edb0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1edc0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1edd0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ede0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1edf0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ee00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ee10 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ee20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1ee30 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ee40 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1ee50 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1ee60 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1ee70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ee80 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1ee90 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1eea0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1eeb0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1eec0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1eed0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1eee0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1eef0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1ef00 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1ef10 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1ef20 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1ef30 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1ef40 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1ef50 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1ef60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1ef70 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1ef80 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1ef90 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1efa0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1efb0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1efc0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1efd0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1efe0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1eff0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1f000 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1f010 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1f020 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1f030 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f040 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1f050 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1f060 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1f070 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1f080 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1f090 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1f0a0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f0b0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1f0c0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f0d0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1f0e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f0f0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1f100 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1f110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f120 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1f130 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1f140 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
1f150 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
1f160 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f170 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f180 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f190 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f1a0 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f1b0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f1c0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f1d0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f1e0 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1f1f0 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1f200 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1f210 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f220 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f230 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f240 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f250 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f260 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e  , dest, SQLITE_N
1f270 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
1f280 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1f290 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
1f2a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f2b0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
1f2c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f2d0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f2e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1f2f0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
1f300 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f310 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1f320 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
1f330 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
1f340 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1f350 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f360 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f370 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f380 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f390 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
1f3a0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
1f3b0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1f3c0 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43 6f  NULL );   VdbeCo
1f3d0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1f3e0 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
1f3f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f400 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20 56  TK_NOTNULL );  V
1f410 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f420 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29   op==TK_NOTNULL)
1f430 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f440 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1f450 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f460 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f470 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
1f480 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f490 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f4a0 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65    exprCodeBetwee
1f4b0 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
1f4c0 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49 66   dest, 0, jumpIf
1f4d0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1f4e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1f4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
1f500 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
1f510 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
1f520 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29 7b  f( jumpIfNull ){
1f530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f540 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73  ExprCodeIN(pPars
1f550 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20  e, pExpr, dest, 
1f560 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1f570 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1f580 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c  destIfNull = sql
1f590 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
1f5a0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  l(v);.        sq
1f5b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
1f5c0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64  pParse, pExpr, d
1f5d0 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  est, destIfNull)
1f5e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f5f0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1f600 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
1f610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f620 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1f630 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1f640 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 70   {.      if( exp
1f650 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78  rAlwaysFalse(pEx
1f660 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
1f670 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f680 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1f690 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1f6a0 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
1f6b0 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
1f6c0 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70          /* no-op
1f6d0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
1f6e0 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
1f6f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1f700 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  p(pParse, pExpr,
1f710 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1f720 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f730 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
1f740 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75  ot, r1, dest, ju
1f750 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20  mpIfNull!=0);.  
1f760 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f770 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74  ge(v);.        t
1f780 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1f790 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1f7a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f7b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f7c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1f7d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1f7e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1f7f0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1f800 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  e1);.  sqlite3Re
1f810 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f820 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a  rse, regFree2);.
1f830 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  }../*.** Like sq
1f840 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f850 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 61  () except that a
1f860 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
1f870 20 70 45 78 70 72 20 62 65 66 6f 72 65 0a 2a 2a   pExpr before.**
1f880 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1f890 2c 20 61 6e 64 20 74 68 61 74 20 63 6f 70 79 20  , and that copy 
1f8a0 69 73 20 64 65 6c 65 74 65 64 20 61 66 74 65 72  is deleted after
1f8b0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1f8c0 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73 75 72 65  . This.** ensure
1f8d0 73 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  s that the origi
1f8e0 6e 61 6c 20 70 45 78 70 72 20 69 73 20 75 6e 63  nal pExpr is unc
1f8f0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  hanged..*/.void 
1f900 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f910 73 65 44 75 70 28 50 61 72 73 65 20 2a 70 50 61  seDup(Parse *pPa
1f920 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1f930 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e 74 20 6a  , int dest,int j
1f940 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 73 71  umpIfNull){.  sq
1f950 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1f960 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
1f970 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
1f980 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
1f990 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
1f9a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
1f9b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1f9c0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1f9d0 2c 20 70 43 6f 70 79 2c 20 64 65 73 74 2c 20 6a  , pCopy, dest, j
1f9e0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1f9f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1fa00 65 74 65 28 64 62 2c 20 70 43 6f 70 79 29 3b 0a  ete(db, pCopy);.
1fa10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64  }.../*.** Do a d
1fa20 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  eep comparison o
1fa30 66 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  f two expression
1fa40 20 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20   trees.  Return 
1fa50 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  0 if the two.** 
1fa60 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
1fa70 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65 6e 74  completely ident
1fa80 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20 31 20  ical.  Return 1 
1fa90 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20 6f  if they differ o
1faa0 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f 4c 4c  nly.** by a COLL
1fab0 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61 74 20  ATE operator at 
1fac0 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e 20 20  the top level.  
1fad0 52 65 74 75 72 6e 20 32 20 69 66 20 74 68 65 72  Return 2 if ther
1fae0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65  e are difference
1faf0 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20  s.** other than 
1fb00 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 43 4f  the top-level CO
1fb10 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a  LLATE operator..
1fb20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
1fb30 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
1fb40 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
1fb50 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
1fb60 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
1fb70 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
1fb80 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
1fb90 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
1fba0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
1fbb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41 20 73  ..**.** The pA s
1fbc0 69 64 65 20 6d 69 67 68 74 20 62 65 20 75 73 69  ide might be usi
1fbd0 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52 2e 20  ng TK_REGISTER. 
1fbe0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
1fbf0 63 61 73 65 20 61 6e 64 20 70 42 20 69 73 0a 2a  case and pB is.*
1fc00 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b 5f 52  * not using TK_R
1fc10 45 47 49 53 54 45 52 20 62 75 74 20 69 73 20 6f  EGISTER but is o
1fc20 74 68 65 72 77 69 73 65 20 65 71 75 69 76 61 6c  therwise equival
1fc30 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20  ent, then still 
1fc40 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
1fc50 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73 20 72  Sometimes this r
1fc60 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1fc70 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74 68 65  rn 2 even if the
1fc80 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 73   two expressions
1fc90 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65 20 65  .** really are e
1fca0 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66 20 77  quivalent.  If w
1fcb0 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65 20 74  e cannot prove t
1fcc0 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
1fcd0 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65 6e 74  ons are.** ident
1fce0 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72 6e 20  ical, we return 
1fcf0 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  2 just to be saf
1fd00 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
1fd10 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1fd20 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20 64 6f  s 2, then you do
1fd30 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e 6f 77   not really know
1fd40 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69 66 20   for certain if 
1fd50 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65  the two.** expre
1fd60 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
1fd70 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79 6f 75  ame.  But if you
1fd80 20 67 65 74 20 61 20 30 20 6f 72 20 31 20 72 65   get a 0 or 1 re
1fd90 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75 0a 2a  turn, then you.*
1fda0 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  * can be sure th
1fdb0 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  e expressions ar
1fdc0 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49 6e 20  e the same.  In 
1fdd0 74 68 65 20 70 6c 61 63 65 73 20 77 68 65 72 65  the places where
1fde0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1fdf0 20 69 73 20 75 73 65 64 2c 20 69 74 20 64 6f 65   is used, it doe
1fe00 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20 67 65  s not hurt to ge
1fe10 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d 20 74  t an extra 2 - t
1fe20 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69 67 68  hat.** just migh
1fe30 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f 6d 65  t result in some
1fe40 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72   slightly slower
1fe50 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65 74 75   code.  But retu
1fe60 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e 63 6f  rning.** an inco
1fe70 72 72 65 63 74 20 30 20 6f 72 20 31 20 63 6f 75  rrect 0 or 1 cou
1fe80 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d 61 6c  ld lead to a mal
1fe90 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1fea0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1feb0 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78  are(Expr *pA, Ex
1fec0 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62  pr *pB, int iTab
1fed0 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69 6e 65  ){.  u32 combine
1fee0 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 41  dFlags;.  if( pA
1fef0 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 7b 0a  ==0 || pB==0 ){.
1ff00 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 70      return pB==p
1ff10 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d 0a 20  A ? 0 : 2;.  }. 
1ff20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 3d   combinedFlags =
1ff30 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70 42 2d   pA->flags | pB-
1ff40 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 63 6f  >flags;.  if( co
1ff50 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
1ff60 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
1ff70 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 26   if( (pA->flags&
1ff80 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49 6e 74  pB->flags&EP_Int
1ff90 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70 41 2d  Value)!=0 && pA-
1ffa0 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d 3e 75  >u.iValue==pB->u
1ffb0 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  .iValue ){.     
1ffc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1ffd0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
1ffe0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
1fff0 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 69  =pB->op ){.    i
20000 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pA->op==TK_CO
20010 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65 33  LLATE && sqlite3
20020 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
20030 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61 62 29  pLeft, pB, iTab)
20040 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
20050 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
20060 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pB->op==TK_C
20070 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74 65  OLLATE && sqlite
20080 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2c  3ExprCompare(pA,
20090 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
200a0 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
200b0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
200c0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20   return 2;.  }. 
200d0 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f   if( pA->op!=TK_
200e0 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53  COLUMN && ALWAYS
200f0 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  (pA->op!=TK_AGG_
20100 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d 3e 75  COLUMN) && pA->u
20110 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69  .zToken ){.    i
20120 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e 75 2e  f( strcmp(pA->u.
20130 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a 54 6f  zToken,pB->u.zTo
20140 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ken)!=0 ){.     
20150 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70 3d 3d   return pA->op==
20160 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31 20 3a  TK_COLLATE ? 1 :
20170 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
20180 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73 20 26  if( (pA->flags &
20190 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21 3d 28   EP_Distinct)!=(
201a0 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44  pB->flags & EP_D
201b0 69 73 74 69 6e 63 74 29 20 29 20 72 65 74 75 72  istinct) ) retur
201c0 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  n 2;.  if( ALWAY
201d0 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  S((combinedFlags
201e0 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29   & EP_TokenOnly)
201f0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ==0) ){.    if( 
20200 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
20210 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 20 72  EP_xIsSelect ) r
20220 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
20230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
20240 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70  are(pA->pLeft, p
20250 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 20  B->pLeft, iTab) 
20260 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20270 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
20280 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
20290 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c 20 69  t, pB->pRight, i
202a0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
202b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
202c0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
202d0 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70 42 2d  pA->x.pList, pB-
202e0 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 29 20  >x.pList, iTab) 
202f0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
20300 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
20310 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 52  inedFlags & EP_R
20320 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26 20 70  educed)==0) && p
20330 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47  A->op!=TK_STRING
20340 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
20350 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
20360 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
20370 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
20380 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
20390 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
203a0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
203b0 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
203c0 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
203d0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
203e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
203f0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
20400 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
20410 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
20420 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
20430 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
20440 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
20450 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
20460 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
20470 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
20480 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
20490 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
204a0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
204b0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
204c0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
204d0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
204e0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
204f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20500 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
20510 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
20520 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
20530 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
20540 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
20550 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
20560 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
20570 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
20580 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
20590 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
205a0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
205b0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
205c0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
205d0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
205e0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
205f0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
20600 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
20610 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
20620 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
20630 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
20640 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
20650 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
20660 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
20670 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
20680 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
20690 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
206a0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
206b0 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
206c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
206d0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
206e0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
206f0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
20700 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
20710 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
20720 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
20730 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
20740 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
20750 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
20760 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
20770 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
20780 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
20790 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
207a0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
207b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
207c0 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
207d0 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29   pExprB, iTab) )
207e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
207f0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20800 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20810 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
20820 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
20830 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
20840 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
20850 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
20860 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
20870 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
20880 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
20890 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
208a0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
208b0 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
208c0 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
208d0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
208e0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
208f0 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
20900 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
20910 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
20920 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
20930 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
20940 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
20950 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
20960 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
20970 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
20980 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
20990 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
209a0 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
209b0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
209c0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
209d0 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
209e0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
209f0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
20a00 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
20a10 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
20a20 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
20a30 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
20a40 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
20a50 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
20a60 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
20a70 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
20a80 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
20a90 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
20aa0 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
20ab0 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
20ac0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
20ad0 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
20ae0 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
20af0 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
20b00 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
20b10 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
20b20 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
20b30 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
20b40 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
20b50 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
20b60 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
20b70 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
20b80 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
20b90 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
20ba0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
20bb0 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
20bc0 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
20bd0 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
20be0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
20bf0 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
20c00 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
20c10 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
20c20 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
20c30 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
20c40 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
20c50 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
20c60 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
20c70 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
20c80 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
20c90 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
20ca0 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
20cb0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
20cc0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
20cd0 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c  OTNULL.   && sql
20ce0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20cf0 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d  pE1->pLeft, pE2-
20d00 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
20d10 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21  .   && (pE1->op!
20d20 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
20d30 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20  1->op!=TK_IS).  
20d40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
20d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
20d70 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
20d80 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
20d90 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
20da0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
20db0 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
20dc0 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
20dd0 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
20de0 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
20df0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
20e00 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
20e10 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
20e20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
20e30 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
20e40 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
20e50 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
20e60 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
20e70 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
20e80 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
20e90 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
20ea0 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
20eb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
20ec0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
20ed0 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
20ee0 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
20ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20f00 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20f10 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
20f20 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
20f30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
20f40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
20f50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
20f60 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
20f70 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
20f80 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
20f90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
20fa0 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
20fb0 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
20fc0 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
20fd0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
20fe0 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
20ff0 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
21000 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
21010 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
21020 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
21030 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
21040 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
21050 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
21060 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
21070 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
21080 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
21090 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
210a0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
210b0 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
210c0 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
210d0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
210e0 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
210f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
21100 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
21110 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
21120 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
21130 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
21140 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
21150 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
21160 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
21170 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
21180 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
21190 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
211a0 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
211b0 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
211c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
211d0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
211e0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
211f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21200 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
21210 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
21220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21230 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
21240 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21250 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
21260 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
21270 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
21280 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
21290 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
212a0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
212b0 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
212c0 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
212d0 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
212e0 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
212f0 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
21300 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
21310 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
21320 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
21330 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
21340 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
21350 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
21360 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
21370 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
21380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21390 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
213a0 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
213b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
213c0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
213d0 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
213e0 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
213f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
21400 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
21410 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
21420 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
21430 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
21440 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
21450 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
21460 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
21470 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
21480 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
21490 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
214a0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
214b0 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
214c0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
214d0 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
214e0 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
214f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
21500 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
21510 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
21520 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
21530 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
21540 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
21550 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
21560 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
21570 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
21580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
21590 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
215a0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
215b0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
215c0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
215d0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
215e0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
215f0 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
21600 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
21610 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
21620 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
21630 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
21640 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
21650 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
21660 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
21670 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
21680 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
21690 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
216a0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
216b0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
216c0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
216d0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
216e0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
216f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
21700 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
21710 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
21720 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
21730 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
21740 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
21750 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
21760 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
21770 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
21780 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
21790 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
217a0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
217b0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
217c0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
217d0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
217e0 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
217f0 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
21800 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
21810 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
21820 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
21830 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
21840 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
21850 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
21860 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
21870 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
21880 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
21890 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
218a0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
218b0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
218c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
218d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
218e0 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
218f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
21900 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
21910 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
21920 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
21930 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
21940 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
21950 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
21960 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
21970 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
21980 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
21990 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
219a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
219b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
219c0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
219d0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
219e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
219f0 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
21a00 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
21a10 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
21a20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
21a30 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
21a40 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
21a50 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
21a60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
21a70 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
21a80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
21a90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
21aa0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
21ab0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
21ac0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
21ad0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
21ae0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
21af0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
21b00 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
21b10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
21b20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
21b30 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
21b40 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
21b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21b60 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
21b70 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
21b80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
21b90 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
21ba0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
21bb0 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
21bc0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
21bd0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
21be0 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
21bf0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
21c00 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
21c10 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
21c20 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
21c30 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
21c40 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
21c50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
21c60 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
21c70 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
21c80 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
21c90 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
21ca0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21cb0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
21cc0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
21cd0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
21ce0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
21cf0 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
21d00 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
21d10 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
21d20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
21d30 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
21d40 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
21d50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
21d60 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
21d70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
21d80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
21d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21db0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
21dc0 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
21dd0 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
21de0 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
21df0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
21e00 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
21e10 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
21e20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
21e30 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
21e40 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
21e50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
21e60 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
21e70 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
21e80 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
21e90 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
21ea0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
21eb0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
21ec0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
21ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21ee0 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
21ef0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
21f00 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
21f10 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
21f20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
21f30 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
21f40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
21f50 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
21f60 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
21f80 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
21f90 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
21fa0 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
21fb0 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
21fd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
21fe0 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
21ff0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
22000 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
22010 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
22020 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
22030 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
22040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22050 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
22060 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22080 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
22090 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
220a0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
220b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
220c0 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
220d0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
220e0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
220f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22100 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
22110 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
22120 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22170 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
22180 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
22190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
221a0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
221b0 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
221c0 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
221d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
221e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
221f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
22200 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
22210 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
22220 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
22230 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
22240 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
22250 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
22260 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
22270 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
22280 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
22290 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
222a0 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
222b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
222c0 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
222d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
222e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
222f0 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
22300 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
22310 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
22320 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
22330 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
22340 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
22350 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
22360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
22370 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
22380 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
22390 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
223a0 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
223b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
223c0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
223d0 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
223e0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
223f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
22400 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
22410 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
22420 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22430 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
22440 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
22450 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
22460 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
22470 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
22480 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
22490 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
224a0 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
224b0 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
224c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
224d0 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
224e0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
224f0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
22500 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
22510 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
22520 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
22530 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
22540 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22550 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
22560 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
22570 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
22580 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
22590 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
225a0 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
225b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
225c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
225d0 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
225e0 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
225f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22600 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22610 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22620 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
22630 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
22640 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
22650 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
22660 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
22670 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
22680 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
22690 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
226a0 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
226b0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
226c0 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
226d0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
226e0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
226f0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
22700 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
22710 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
22720 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
22730 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
22740 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
22750 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
22760 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
22770 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
22780 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
22790 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
227a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
227b0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
227c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
227d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
227e0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
227f0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
22800 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
22810 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
22820 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
22830 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
22840 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71  pr->u.zToken, sq
22850 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
22860 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a  xpr->u.zToken),.
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
22890 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
228a0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
228b0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
228c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
228d0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
228e0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
228f0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
22900 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
22910 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
22920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22930 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
22940 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
22950 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22970 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
22980 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
22990 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
229a0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
229b0 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
229c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
229d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
229e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
229f0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
22a00 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
22a10 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
22a20 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
22a30 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
22a40 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
22a50 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
22a60 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
22a70 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
22a80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
22a90 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
22aa0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
22ab0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
22ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22ad0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
22ae0 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
22af0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
22b00 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
22b10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
22b20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
22b30 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
22b40 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
22b50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22b60 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
22b70 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
22b80 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
22b90 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
22ba0 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
22bb0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
22bc0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
22bd0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
22be0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
22bf0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
22c00 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
22c10 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
22c20 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
22c30 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
22c40 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
22c50 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
22c60 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
22c70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
22c80 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
22c90 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
22ca0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
22cb0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
22cc0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
22cd0 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
22ce0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
22cf0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
22d00 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
22d10 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
22d20 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
22d30 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
22d40 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
22d50 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
22d60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
22d70 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
22d80 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
22d90 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
22da0 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
22db0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
22dc0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
22dd0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
22de0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
22df0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
22e00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22e10 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
22e20 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
22e30 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
22e40 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
22e50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
22e60 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
22e70 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
22e80 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
22e90 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
22ea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22eb0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
22ec0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
22ed0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
22ee0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
22ef0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
22f00 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
22f10 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
22f20 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
22f30 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
22f40 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
22f50 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
22f60 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22f70 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
22f80 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
22f90 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
22fa0 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
22fb0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
22fc0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
22fd0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
22fe0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
22ff0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
23000 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
23010 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
23020 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
23030 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
23040 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
23050 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
23060 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
23070 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
23080 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
23090 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
230a0 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
230b0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
230c0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
230d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
230e0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
230f0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
23100 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
23110 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
23120 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
23130 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
23140 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
23150 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
23160 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
23170 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
23180 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
23190 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
231a0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
231b0 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
231c0 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
231d0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
231e0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
231f0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
23200 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
23210 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
23220 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
23230 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
23240 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
23250 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
23260 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
23270 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
23280 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
23290 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
232a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
232b0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
232c0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
232d0 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
232e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
232f0 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
23300 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
23310 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
23320 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
23330 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
23340 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
23350 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
23360 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
23370 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
23380 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
23390 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
233a0 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
233b0 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
233c0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
233d0 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
233e0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
233f0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
23400 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
23410 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
23420 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
23430 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
23440 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
23450 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
23460 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
23470 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
23480 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
23490 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
234a0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c  int nReg){.  sql
234b0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
234c0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
234d0 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
234e0 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
234f0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
23500 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
23510 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
23520 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
23530 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
23540 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
23550 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
23560 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
23570 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
23580 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
23590 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
235a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
235b0 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
235c0 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
235d0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
235e0 0a 7d 0a                                         .}.