/ Hex Artifact Content
Login

Artifact 0f996b684f975f35b09f53f0d1b375aaec4cf1af7594a1d5b279b81c8ad491cd:


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 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
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 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }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 4e 4f 4e 45 3b 0a 20 20 7d 0a  E_AFF_NONE;.  }.
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 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65  F_NONE:.      re
1ea0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65  turn 1;.    case
1eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1ec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  :.      return i
1ed0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
1ee0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
1ef0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1f00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f10: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1f20: 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  (idx_affinity);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1f40: 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65  urn the P5 value
1f50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f60: 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  used for a binar
1f70: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  y comparison.** 
1f80: 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f  opcode (OP_Eq, O
1f90: 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20  P_Ge etc.) used 
1fa0: 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72  to compare pExpr
1fb0: 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f  1 and pExpr2..*/
1fc0: 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72  .static u8 binar
1fd0: 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20  yCompareP5(Expr 
1fe0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
1ff0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
2000: 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66  fNull){.  u8 aff
2010: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2020: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2030: 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75  pr2);.  aff = (u
2040: 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  8)sqlite3Compare
2050: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
2060: 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70   aff) | (u8)jump
2070: 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e  IfNull;.  return
2080: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   aff;.}../*.** R
2090: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20a0: 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  to the collation
20b0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73   sequence that s
20c0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79  hould be used by
20d0: 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  .** a binary com
20e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
20f0: 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74   comparing pLeft
2100: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a   and pRight..**.
2110: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  ** If the left h
2120: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68  and expression h
2130: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
2140: 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68  equence type, th
2150: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64  en it is.** used
2160: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
2170: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2180: 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ce for the right
2190: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
21a0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20  .** is used, or 
21b0: 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e  the default (BIN
21c0: 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20  ARY) if neither 
21d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
21e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79   collating.** ty
21f0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  pe..**.** Argume
2200: 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e  nt pRight (but n
2210: 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65  ot pLeft) may be
2220: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
2230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2240: 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  * it is not cons
2250: 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53  idered..*/.CollS
2260: 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72  eq *sqlite3Binar
2270: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  , .  Expr *pLeft
22a0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  , .  Expr *pRigh
22b0: 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  t.){.  CollSeq *
22c0: 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pColl;.  assert(
22d0: 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20   pLeft );.  if( 
22e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
22f0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
2300: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2310: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2320: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  se, pLeft);.  }e
2330: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26  lse if( pRight &
2340: 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  & (pRight->flags
2350: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
2360: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
2370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2380: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2390: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
23a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23b0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23c0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
23d0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
23e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
23f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2400: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2420: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
2430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2440: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
2450: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
2460: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
2470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
2480: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2490: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
24a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
24b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
24c0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
24d0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
24f0: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2500: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2510: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2530: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2540: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2550: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2560: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2570: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2580: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2590: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
25a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
25b0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
25c0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
25d0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
25e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
25f0: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2600: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2610: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2620: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2640: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2650: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2660: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2670: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
26a0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
26b0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26e0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
26f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2700: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2710: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2720: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2730: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
2740: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
2750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2760: 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74  argument nHeight
2770: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2780: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
2790: 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73  ximum.** express
27a0: 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65  ion depth allowe
27b0: 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  d. If it is not,
27c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27d0: 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50  message in.** pP
27e0: 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  arse..*/.int sql
27f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2800: 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ght(Parse *pPars
2810: 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b  e, int nHeight){
2820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48  TE_OK;.  int mxH
2840: 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e  eight = pParse->
2850: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2860: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
2870: 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67  TH];.  if( nHeig
2880: 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20  ht>mxHeight ){. 
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
28b0: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
28c0: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
28d0: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
28e0: 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20  %d)", mxHeight. 
28f0: 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53     );.    rc = S
2900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2920: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
2930: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
2940: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
2950: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
2960: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
2970: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
2980: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
2990: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
29a0: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
29b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
29c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
29d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29e0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
2a10: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
2a20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2a30: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
2a40: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
2a50: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
2a60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
2a70: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
2a80: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
2a90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2aa0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
2ab0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
2ac0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2ae0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
2af0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
2b00: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
2b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2b20: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
2b40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
2b50: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2b60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2b90: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2ba0: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
2bb0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
2bc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2bd0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2be0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
2bf0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2c00: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
2c10: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
2c20: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
2c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c40: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
2c50: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2c60: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
2c70: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2c80: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2c90: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
2ca0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2cb0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
2cc0: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
2cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2ce0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
2cf0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
2d20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
2d40: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
2d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d60: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
2d80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2d90: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
2da0: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
2db0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
2dc0: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
2dd0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
2de0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
2df0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
2e00: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
2e10: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
2e20: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
2e30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2e40: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
2e50: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
2e60: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
2e70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
2e80: 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65  ate EP_Propagate
2e90: 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45   flags up from E
2ea0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45  xpr.x.pList to E
2eb0: 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66  xpr.flags,.** if
2ec0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ee0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2f20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2f30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2f40: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2f50: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2f60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2f70: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2f80: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2f90: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2fa0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ight);.  }else i
2fb0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  f( p->x.pList ){
2fc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2fd0: 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74  rList(p->x.pList
2fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , &nHeight);.   
2ff0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
3000: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
3010: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
3020: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
3030: 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  }.  p->nHeight =
3040: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
3050: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
3060: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
3070: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65  able using the e
3080: 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66  xprSetHeight() f
3090: 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74  unction. If.** t
30a0: 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65  he height is gre
30b0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ater than the ma
30c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78  ximum allowed ex
30d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a  pression depth,.
30e0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
30f0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  r in pParse..**.
3100: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
3110: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
3120: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
3130: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
3140: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
3150: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
3160: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3170: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
3180: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
3190: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
31a0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
31b0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
31c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
31d0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
31e0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
3210: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
3220: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
3230: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
3240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3250: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
3260: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3270: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
3280: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
3290: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
32a0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
32b0: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
32c0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
32d0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f  eight;.}.#else /
32e0: 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74  * ABOVE:  Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61   enforcement ena
3300: 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65  bled.  BELOW: He
3310: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
3320: 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72   off */./*.** Pr
3330: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
3340: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
3350: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
3360: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
3370: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
3380: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
3390: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
33a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
33b0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
33c0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26  && p->x.pList &&
33d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
33e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
33f0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61  t) ){.    p->fla
3400: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3410: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
3420: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
3430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65  List);.  }.}.#de
3440: 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67  fine exprSetHeig
3450: 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ht(y).#endif /* 
3460: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3470: 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  DEPTH>0 */../*.*
3480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3490: 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63  s the core alloc
34a0: 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f  ator for Expr no
34b0: 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  des..**.** Const
34c0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
34d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
34e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34f0: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
3500: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
3510: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b  and for the pTok
3520: 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  en argument is a
3530: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
3540: 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  on.** obtained f
3550: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3560: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
3570: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
3580: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3590: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
35a0: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
35b0: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
35c0: 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  *.** If dequote 
35d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
35e0: 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65  e token (if it e
35f0: 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74  xists) is dequot
3600: 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  ed..** If dequot
3610: 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64  e is false, no d
3620: 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66  equoting is perf
3630: 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65  ormance.  The de
3640: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
3650: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
3660: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
3670: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
3680: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
3690: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
36a0: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
36b0: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
36c0: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
36d0: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
36e0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
36f0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
3700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
3710: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
3720: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
3730: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
3740: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
3750: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
3760: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
3770: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
3780: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
3790: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
37a0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
37b0: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
37c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
37d0: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
37e0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
37f0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
3800: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
3810: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
3820: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
3830: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
3840: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
3850: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
3860: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
3870: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3880: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
3890: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
38a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
38b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
38c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
38d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3900: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
3910: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
3920: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
3930: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
3940: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
3950: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
3960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
3970: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
3980: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
3990: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
39a0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
39b0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
39c0: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
39d0: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
39e0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
39f0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3a00: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3a10: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
3a20: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
3a30: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
3a40: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
3a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
3a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3a80: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a90: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3aa0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  {.    pNew->op =
3ab0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
3ac0: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3ad0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
3ae0: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
3af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3b00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3b10: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
3b20: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
3b30: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3b50: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
3b60: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
3b70: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3b80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3b90: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
3ba0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3bc0: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
3bd0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
3be0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
3bf0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
3c00: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
3c10: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
3c30: 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20  te && nExtra>=3 
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3c50: 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a   ((c = pToken->z
3c60: 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  [0])=='\'' || c=
3c70: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='"' || c=='[' |
3c80: 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20  | c=='`') ){.   
3c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
3ca0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
3cb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
3cc0: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e   if( c=='"' ) pN
3cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3ce0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
3cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d00: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3d10: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d20: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d70: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d80: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3da0: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3db0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3dc0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3df0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3e00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3e10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e60: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e90: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3ea0: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3eb0: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ec0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3ed0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ef0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3f10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3fa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3fb0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fc0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fe0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4000: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
4010: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4020: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4030: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4040: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4070: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4090: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
40a0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
40b0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40d0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40e0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40f0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
4100: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
4110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4120: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4130: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4140: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4150: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4160: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4170: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4180: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4190: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
41a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41b0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41c0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41d0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41e0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41f0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
4200: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
4210: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4220: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4230: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4240: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4250: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4260: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4270: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4280: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4290: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
42a0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
42b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42e0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4300: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4310: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4330: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4340: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4360: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4370: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4380: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4390: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
43a0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
43b0: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43c0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
43d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
4400: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4410: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4420: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4440: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4450: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4470: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4480: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
4490: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20  pToken, 1);.    
44a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
44b0: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
44c0: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
44d0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
44e0: 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c  f( p ) {.    sql
44f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
4500: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
4510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  Height);.  }.  r
4520: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4530: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4540: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4550: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4560: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4570: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4580: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4590: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
45a0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
45b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
45c0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
45d0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
45e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
45f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
4600: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
4610: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
4620: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
4630: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
4640: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4650: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4660: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4670: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4680: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4690: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
46a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
46b0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
46c0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
46d0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
46e0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
46f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
4700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4710: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
4720: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
4730: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
4740: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4750: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4760: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4770: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4780: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4790: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
47b0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
47c0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
47d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
47e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
47f0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
4800: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
4810: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
4820: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
4830: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
4840: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4850: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4860: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4870: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4890: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
48a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
48b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
48c0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
48d0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
48e0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
48f0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4900: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4910: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4930: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4950: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4960: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4970: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4980: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4990: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
49a0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
49b0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
49c0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
49d0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
49e0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
49f0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4a00: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4a40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4a50: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4a70: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4a80: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4a90: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4ab0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4ac0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4ad0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4af0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4b10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4b20: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b40: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4b50: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4b60: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4b70: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4b90: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4ba0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4bb0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4bc0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4bd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4be0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4bf0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4c00: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4c10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4c20: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4c30: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4c40: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4c50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4c60: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4c70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4c80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4c90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4ca0: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4cd0: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4ce0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4cf0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4d00: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4d10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4d30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4d40: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4d50: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4d60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d80: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4d90: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4da0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4db0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4dc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4dd0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4de0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4df0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4e00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4e10: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4e20: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4e30: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4e40: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4e50: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4e60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4e70: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
4e80: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
4e90: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
4ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4eb0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
4ec0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
4ed0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4ee0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4ef0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4f00: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4f10: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4f20: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4f30: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4f40: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4f50: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4f60: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4f70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
4f80: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
4f90: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
4fa0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4fb0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
4fc0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
4fd0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4fe0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4ff0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
5000: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5010: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
5020: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
5030: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
5040: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5050: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5060: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5070: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5080: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5090: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
50a0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
50b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
50c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
50d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50e0: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
50f0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
5100: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
5110: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5130: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
5140: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5150: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5160: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5190: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
51a0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
51b0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
51c0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
51d0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
51e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
51f0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
5200: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
5210: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5220: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
5230: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
5240: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5250: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5260: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5270: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5280: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5290: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
52a0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
52b0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
52c0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
52d0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
52e0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
52f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
5300: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
5310: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
5320: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
5330: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
5340: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5350: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5360: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5370: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5390: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
53a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
53b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53d0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
53e0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
53f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5410: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
5420: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
5430: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
5440: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5450: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5480: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5490: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
54a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
54b0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
54c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
54d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
54e0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
54f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5500: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
5510: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
5520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
5530: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5560: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5570: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5580: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5590: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
55a0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
55b0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
55c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
55d0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
55e0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
55f0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
5600: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
5610: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
5620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5630: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
5640: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5650: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5660: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5670: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5680: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5690: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
56a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
56b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
56c0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
56d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56f0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
5700: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
5710: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
5720: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
5730: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5750: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5760: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5780: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5790: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
57a0: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
57b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
57c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
57d0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
57e0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
57f0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
5800: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
5810: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5820: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5830: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5840: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5850: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5870: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5880: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5890: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
58a0: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
58c0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
58e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
58f0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
5900: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5910: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5920: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5930: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5940: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5950: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5960: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5970: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
59a0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
59b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
59c0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
59d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
59e0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
59f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5a10: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5a30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5a40: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5a50: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5a60: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5a70: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a90: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5aa0: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5ab0: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
5ac0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ad0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
5af0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
5b00: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
5b10: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
5b20: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
5b30: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
5b40: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
5b50: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ht==0 );.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
5b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5b90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
5ba0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5bb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bc0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
5bd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5be0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
5bf0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
5c20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5c30: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
5c40: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
5c50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5c60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5c70: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ca0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5cc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5cf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5d20: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5d40: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5d50: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5d60: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5d70: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5d80: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5d90: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5da0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5dc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5dd0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5de0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5df0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5e20: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5e30: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5e40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5e60: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5e70: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5e90: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5ea0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5eb0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5ec0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5ed0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5ee0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5ef0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5f00: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5f10: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5f20: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5f30: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5f40: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5f50: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5f60: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5f70: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5f80: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5f90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5fa0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5fb0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5fc0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5fd0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
6030: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6040: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
6050: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
6060: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
6070: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
6080: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
6090: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
60a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
60b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
60c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
60d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
60e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
60f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
6100: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
6110: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
6120: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
6130: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
6140: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
6150: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
6160: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
6170: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6180: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
61a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
61b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
61c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
61d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
61e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
61f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
6200: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
6210: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
6220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
6230: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
6240: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
6250: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
6260: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
6270: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
6280: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
6290: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
62a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
62b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
62c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
62d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
62e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
62f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
6300: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
6310: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
6320: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
6330: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
6340: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
6350: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
6360: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
6370: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
6380: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
63a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
63b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
63c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
63d0: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
63e0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
63f0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
6400: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
6410: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
6420: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
6430: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
6440: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
6450: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
6460: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
6470: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
6480: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
6490: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
64a0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
64b0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
64c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
64d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
64e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
64f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6500: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
6510: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
6520: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6530: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
6540: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
6550: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
6560: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
6570: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
6580: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
6590: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
65a0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
65b0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
65c0: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
65d0: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
65e0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
65f0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
6600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
6610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6620: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
6630: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
6640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6650: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6660: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
6670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6690: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
66b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66c0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
66d0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
66e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
66f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6730: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
6740: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
6750: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
6760: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
6770: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
6790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
67a0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
67b0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
67c0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
67d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
67e0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
67f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
6800: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
6810: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
6820: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
6830: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6850: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6860: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6870: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6880: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6890: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
68a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
68b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
68c0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
68d0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
68e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
6910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
6920: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
6930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6940: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6950: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
6960: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
6970: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
6980: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
6990: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
69a0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
69b0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
69c0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
69d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
69f0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
6a00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
6a10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
6a20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
6a30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
6a40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
6a50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
6a60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
6a70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
6a80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
6a90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
6aa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
6ab0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
6ac0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
6ad0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
6ae0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
6af0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
6b00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
6b10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
6b20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
6b30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
6b40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
6b50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
6b60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
6b70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
6b80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
6b90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
6ba0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6bb0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6bc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
6bd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
6be0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6bf0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6c00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
6c10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
6c20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
6c30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
6c40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
6c50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
6c60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
6c70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
6c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6ca0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
6cb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
6cc0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
6cd0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
6ce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
6cf0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
6d00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
6d20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
6d30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
6d40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
6d50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
6d60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
6d70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
6d80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
6d90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
6da0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
6db0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
6dc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
6dd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
6de0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6df0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
6e00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
6e10: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
6e20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
6e40: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
6e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
6e60: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
6e70: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
6e80: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
6eb0: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
6ec0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
6ed0: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
6ee0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6ef0: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
6f00: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
6f10: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
6f20: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
6f30: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
6f40: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
6f50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
6f60: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
6f70: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
6f80: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
6f90: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
6fa0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
6fb0: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
6fc0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6fe0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
6ff0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
7000: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7010: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
7020: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
7030: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
7040: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7050: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
7060: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
7070: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
7080: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
7090: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
70a0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
70b0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
70c0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
70d0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
70e0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
70f0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
7100: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7110: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
7120: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
7130: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
7140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
7150: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
7160: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
7170: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
7180: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
7190: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
71b0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
71c0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
71d0: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
71e0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
71f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7200: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
7210: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
7220: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
7230: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7240: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7250: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
7270: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
7280: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
7290: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
72a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
72b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
72c0: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
72d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
72e0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
72f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
7310: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
7320: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7330: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
7340: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
7350: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7360: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7370: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7380: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7390: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
73a0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
73b0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
73c0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
73d0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
73e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
73f0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7400: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
7410: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
7420: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
7430: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
7440: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
7450: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
7460: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7470: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7480: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7490: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
74a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
74b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
74c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
74d0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
74e0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
74f0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7500: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
7510: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
7520: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
7530: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
7540: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
7550: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
7560: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7580: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7590: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
75a0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
75b0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
75c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
75d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
75e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
75f0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7600: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7610: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7620: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
7630: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
7640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7650: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
7660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7670: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7680: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76a0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
76b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
76c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
76d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
76e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
76f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7710: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7720: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7730: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
7740: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7750: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7760: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7780: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7790: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
77a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
77b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
77c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
77d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
77e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
77f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7810: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7860: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7870: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7890: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
78d0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7920: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7930: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7940: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7950: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7960: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7970: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7980: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7990: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
79a0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
79b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
79c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79d0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7a00: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7a10: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7a20: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7a30: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7a40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7a50: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7a60: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7a70: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7a80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7a90: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7aa0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7ab0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7ac0: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7ad0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7af0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7b00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7b10: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7b20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7b30: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7b50: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7b80: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7b90: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7ba0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7bb0: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7bc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7be0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7bf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7c00: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7c10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7c20: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7c30: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7c40: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7c50: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7c60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7c70: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7c90: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7ca0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7cb0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7cc0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7cd0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7ce0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7cf0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7d00: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7d10: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7d20: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7d30: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7d40: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7d50: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7d60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7d70: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
7d80: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
7d90: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
7da0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
7db0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
7dc0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
7dd0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
7de0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
7df0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
7e00: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
7e10: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
7e20: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
7e30: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
7e40: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
7e50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
7e60: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
7e70: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
7e80: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
7e90: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
7ea0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
7eb0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
7ec0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
7ed0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
7ee0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
7ef0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
7f00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
7f10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
7f20: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7f30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
7f40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7f50: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
7f60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
7f70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
7f80: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
7f90: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
7fa0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7fb0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
7fc0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
7fd0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7fe0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
7ff0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8000: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8010: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
8020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8050: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8060: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8090: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
80a0: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
80b0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
80c0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
80d0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
80e0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
80f0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8120: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8130: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8150: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8160: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8170: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8190: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
81a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
81b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
81c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
81d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
81e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
81f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8200: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8210: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8240: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8250: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8270: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8280: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8290: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
82a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
82b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
82d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
82e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
82f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8300: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8330: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8340: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8350: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8360: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8370: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8390: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
83a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
83b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
83c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
83d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
83e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
83f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8400: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8410: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8420: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8430: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8440: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8450: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8470: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
84a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
84b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
84c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
84d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
84e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
84f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8500: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
8510: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
8520: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
8530: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
8540: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8550: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
8560: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8580: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8590: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
85a0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
85b0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
85c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
85d0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
85e0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
85f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8600: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8610: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8640: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8650: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8660: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8670: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8690: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
86a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
86b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
86c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
86e0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
86f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8700: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8710: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8720: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
8730: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
8740: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
8750: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8760: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8770: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8780: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8790: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
87a0: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
87b0: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
87c0: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
87d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
87e0: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
87f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
8800: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
8810: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
8820: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
8830: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
8840: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
8850: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8860: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8870: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8880: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8890: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
88a0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
88b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
88c0: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
88d0: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
88e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
88f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
8900: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
8910: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8920: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8930: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8940: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8950: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8970: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8980: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8990: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
89a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
89b0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
89c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
89d0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
89e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
89f0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8a00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8a10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8a20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8a30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8a40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8a50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8a60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8a70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8a80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8a90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8aa0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8ab0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8ac0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8ae0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8af0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
8b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b10: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
8b20: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
8b30: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8b40: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
8b50: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8b60: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8b90: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8ba0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8bb0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8bc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8bd0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8be0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8bf0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
8c00: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
8c10: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
8c20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
8c30: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
8c40: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
8c50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8c60: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8c70: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8c80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8c90: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8ca0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8cb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8cc0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8cd0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8cf0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8d00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8d10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
8d20: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
8d30: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8d50: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8d60: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8d70: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8d80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8d90: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8da0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8dc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8dd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8de0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8df0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8e00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
8e10: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
8e20: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8e30: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
8e40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
8e50: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8e60: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8e70: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8e80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8e90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ea0: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8eb0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8ec0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8ed0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8ee0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8ef0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
8f00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8f10: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
8f20: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8f30: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
8f40: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8f50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8f60: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8f70: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8f80: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8f90: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8fa0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8fb0: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8fc0: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8fd0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8fe0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8ff0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
9000: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
9010: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
9020: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
9030: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
9040: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9050: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
9060: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
9070: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
9080: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
9090: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
90a0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
90b0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
90c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
90d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
90e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
90f0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
9100: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
9110: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
9120: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d  .  pNew->pWith =
9130: 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e   withDup(db, p->
9140: 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  pWith);.  sqlite
9150: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
9160: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
9180: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
9190: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
91a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
91b0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
91c0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
91d0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
91e0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
91f0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9200: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9210: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9220: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9230: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
9240: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
9250: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
9260: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9270: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9280: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9290: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
92a0: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
92b0: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
92c0: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
92d0: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
92e0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
92f0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
9300: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
9310: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
9320: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
9330: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
9340: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
9350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9380: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
93a0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
93b0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
93c0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
93d0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
93e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
93f0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
9400: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
9410: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9420: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9430: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9440: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9450: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9460: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
9470: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
9480: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9490: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
94a0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
94b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
94c0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
94d0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
94e0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
94f0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
9500: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
9510: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
9520: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
9530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9540: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9550: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
9560: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
9570: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
9580: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
9590: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
95a0: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
95b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
95c0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
95d0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
95f0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
9600: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
9610: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
9620: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9630: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9640: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9650: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
9660: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
9670: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
9680: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
9690: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
96a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
96b0: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
96c0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
96d0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
96e0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
9700: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
9710: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
9720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9730: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9740: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
9750: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9760: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
9770: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9780: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9790: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
97a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
97b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
97c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
97d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
97e0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
97f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
9800: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9810: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
9820: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9830: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9840: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9860: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
9870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9880: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9890: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
98a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
98b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
98c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
98d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
98e0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
98f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
9900: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
9910: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
9920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9930: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
9940: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
9950: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9960: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
9970: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9980: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
9990: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
99a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
99b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
99c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
99d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
99e0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
99f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9a00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
9a10: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
9a20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
9a30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9a40: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
9a50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9a60: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
9a70: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
9a80: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
9a90: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
9aa0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
9ab0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9ac0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
9ad0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9ae0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9af0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9b00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9b10: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
9b20: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
9b30: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
9b40: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
9b50: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
9b60: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
9b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9b80: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ba0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9bc0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
9bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9bf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9c00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9c10: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9c20: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9c30: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9c40: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
9c50: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
9c60: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
9c70: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
9c80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9c90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
9ca0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
9cb0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
9cc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
9cd0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
9cf0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
9d00: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
9d10: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9d20: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
9d30: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
9d40: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
9d50: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
9d60: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
9d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d80: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
9d90: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
9da0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9db0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
9dc0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
9e00: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
9e10: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
9e20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9e30: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
9e40: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
9e50: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
9e60: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
9e70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9e80: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
9e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ea0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
9eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
9ec0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9ed0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9ee0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
9ef0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
9f00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9f10: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
9f20: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
9f30: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9f40: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
9f50: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
9f60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
9f70: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
9f80: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
9f90: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
9fa0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9fb0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
9fc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
9fd0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
9fe0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
9ff0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
a000: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
a010: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
a020: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
a030: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
a040: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
a050: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a060: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
a070: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
a080: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
a090: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
a0a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
a0b0: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
a0c0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
a0d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
a0e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
a0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a100: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
a110: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
a120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
a140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a150: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
a160: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
a170: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
a180: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
a190: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
a1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a1b0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
a1c0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
a1d0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
a1e0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
a1f0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
a200: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
a210: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
a220: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
a230: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
a240: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
a250: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
a260: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a270: 20 20 20 20 20 6d 20 7c 3d 20 70 4c 69 73 74 2d       m |= pList-
a280: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61  >a[i].pExpr->fla
a290: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
a2a0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
a2b0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
a2c0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
a2d0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
a2e0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
a2f0: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
a300: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
a310: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
a320: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
a330: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
a340: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
a350: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
a360: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
a370: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
a380: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
a390: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
a3a0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
a3b0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
a3c0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
a3d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
a3e0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
a400: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
a410: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
a420: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
a430: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
a440: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
a450: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
a460: 78 70 72 52 65 66 4f 6e 65 54 61 62 6c 65 4f 6e  xprRefOneTableOn
a470: 6c 79 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ly()            
a480: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a490: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
a4a0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a4b0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
a4c0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a4d0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
a4e0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
a4f0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
a500: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
a510: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
a520: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
a530: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
a540: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
a550: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
a560: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a570: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
a580: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
a590: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
a5a0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
a5b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
a5c0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
a5d0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
a5e0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
a5f0: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
a600: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
a610: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
a620: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
a630: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
a640: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
a650: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
a660: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
a670: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
a680: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
a690: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
a6a0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
a6b0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
a6c0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
a6d0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
a6e0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
a6f0: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
a700: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
a710: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
a720: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
a730: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
a740: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
a750: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
a760: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
a770: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
a780: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
a790: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
a7a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
a7b0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
a7c0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
a7d0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
a7e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
a7f0: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
a800: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
a810: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
a820: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
a830: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
a840: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
a850: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
a860: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
a870: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a880: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
a890: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a8a0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
a8b0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
a8c0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
a8d0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
a8e0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a8f0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
a900: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
a910: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
a920: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
a930: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
a940: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
a950: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
a960: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
a970: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
a980: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
a990: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
a9a0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
a9b0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
a9c0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
a9d0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
a9e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a9f0: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
aa00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
aa10: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aa20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
aa40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
aa50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
aa60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
aa70: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
aa80: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
aa90: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
aaa0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
aab0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
aac0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aad0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
aae0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
aaf0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ab00: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
ab10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ab20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
ab30: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
ab40: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ab50: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ab60: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
ab70: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ab80: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
ab90: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
aba0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
abb0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
abc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
abd0: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
abe0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
abf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ac00: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
ac10: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
ac20: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
ac30: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ac40: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ac50: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
ac60: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
ac70: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
ac80: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
ac90: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
aca0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
acb0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
acc0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
acd0: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
ace0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
acf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ad00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
ad10: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
ad20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ad30: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ad40: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
ad50: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ad60: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
ad70: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
ad80: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
ad90: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
ada0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
adb0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
adc0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
add0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
ade0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
adf0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
ae00: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
ae10: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
ae20: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
ae30: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ae40: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
ae50: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
ae60: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
ae70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
ae80: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ae90: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
aea0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
aeb0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
aec0: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
aed0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aee0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
aef0: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
af00: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
af10: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
af20: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
af30: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
af40: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
af50: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
af60: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
af70: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
af80: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
af90: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
afa0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
afb0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
afc0: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
afd0: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
afe0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
aff0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
b000: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
b010: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b020: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
b030: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
b040: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
b050: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
b060: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
b070: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
b080: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b090: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b0a0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b0b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b0c0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b0d0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
b0e0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
b0f0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
b100: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b110: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b120: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b130: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b140: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b150: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b160: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b170: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b180: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b190: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b1a0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b1b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
b1c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
b1d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b1e0: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
b1f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b200: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b210: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b230: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
b240: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
b250: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
b260: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
b270: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
b280: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
b290: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
b2a0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
b2b0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
b2c0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
b2d0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
b2e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
b2f0: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
b300: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
b310: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
b320: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
b330: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b340: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b350: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b360: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
b370: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
b380: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
b390: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
b3a0: 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
b3b0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
b3c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
b3d0: 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
b3e0: 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
b3f0: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
b400: 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
b410: 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
b420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b430: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
b440: 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
b450: 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
b460: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
b470: 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iCur);.}../*.*
b480: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b490: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b4a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b4c0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
b4d0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
b4e0: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
b4f0: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
b500: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
b510: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
b520: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
b530: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
b540: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
b550: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
b560: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
b570: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
b580: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
b590: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
b5a0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
b5b0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
b5c0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
b5d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
b5e0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
b5f0: 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74  pr *p, u8 isInit
b600: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49  ){.  assert( isI
b610: 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74  nit==0 || isInit
b620: 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
b630: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34  exprIsConst(p, 4
b640: 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a  +isInit, 0);.}..
b650: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
b660: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
b670: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
b680: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
b690: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
b6a0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
b6b0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
b6c0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
b6d0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
b6e0: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
b6f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b700: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
b710: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
b720: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
b730: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
b740: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
b750: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
b760: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
b770: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
b780: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b790: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
b7a0: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
b7b0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
b7c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
b7d0: 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
b7e0: 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
b7f0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
b800: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
b810: 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
b820: 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
b830: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
b840: 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
b850: 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
b860: 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
b870: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
b880: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
b890: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
b8a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
b8b0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
b8c0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
b8d0: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
b8e0: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
b8f0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
b900: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
b910: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b920: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
b930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
b940: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
b950: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
b960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b970: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
b980: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
b990: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
b9a0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
b9b0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
b9c0: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
b9d0: 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
b9e0: 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
b9f0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
ba00: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
ba10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ba30: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
ba40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ba50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ba60: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
ba70: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
ba80: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
ba90: 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
baa0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
bab0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
bac0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
bad0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
bae0: 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
baf0: 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
bb00: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
bb10: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
bb20: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
bb30: 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
bb40: 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
bb50: 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
bb60: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
bb70: 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
bb80: 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
bb90: 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
bba0: 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
bbb0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
bbc0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
bbd0: 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
bbe0: 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
bbf0: 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
bc00: 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
bc10: 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
bc20: 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
bc30: 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
bc40: 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
bc50: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
bc60: 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
bc70: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
bc80: 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
bc90: 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
bca0: 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
bcb0: 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
bcc0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
bcd0: 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
bce0: 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
bcf0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
bd00: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
bd10: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
bd20: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
bd30: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
bd40: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
bd50: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
bd60: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
bd70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bd80: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
bd90: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
bda0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
bdb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
bdc0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
bdd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
bde0: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  LUMN:.      asse
bdf0: 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29  rt( p->pTab!=0 )
be00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  ;.      return E
be10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
be20: 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
be30: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
be40: 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  (p->iColumn>=0 &
be50: 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  & p->pTab->aCol[
be60: 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  p->iColumn].notN
be70: 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66  ull==0);.    def
be80: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
be90: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
bea0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
beb0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
bec0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73  ession is a cons
bed0: 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64  tant which would
bee0: 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   be.** unchanged
bef0: 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   by OP_Affinity 
bf00: 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74  with the affinit
bf10: 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  y given in the s
bf20: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
bf30: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
bf40: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
bf50: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
bf60: 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
bf70: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
bf80: 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e  e omitted.  When
bf90: 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e   in doubt return
bfa0: 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65   FALSE.  A false
bfb0: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20   negative.** is 
bfc0: 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c  harmless.  A fal
bfd0: 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77  se positive, how
bfe0: 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74  ever, can result
bff0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a   in the wrong.**
c000: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
c010: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
c020: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
c030: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20  (const Expr *p, 
c040: 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20  char aff){.  u8 
c050: 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53  op;.  if( aff==S
c060: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
c070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
c080: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
c090: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
c0a0: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
c0b0: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
c0c0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
c0d0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
c0e0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
c0f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
c100: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
c110: 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
c120: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
c130: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
c140: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
c150: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
c160: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
c170: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
c180: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
c190: 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  AL || aff==SQLIT
c1a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
c1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c1c0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
c1d0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
c1e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
c1f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c200: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
c210: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
c220: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
c230: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
c240: 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29  ( p->iTable>=0 )
c250: 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62  ;  /* p cannot b
c260: 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43  e part of a CHEC
c270: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  K constraint */.
c280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
c290: 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20  iColumn<0.      
c2a0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
c2b0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c2c0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
c2d0: 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20  FF_NUMERIC);.   
c2e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
c2f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
c320: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
c330: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
c340: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
c350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
c360: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
c370: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
c380: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
c390: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
c3a0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
c3b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
c3c0: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
c3d0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
c3e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
c3f0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
c400: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
c410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c420: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
c430: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
c440: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
c450: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
c460: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
c470: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
c480: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
c490: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
c4a0: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
c4b0: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
c4c0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
c4d0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
c4e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
c4f0: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
c500: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
c510: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
c520: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
c530: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
c540: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
c550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c560: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
c570: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c580: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
c590: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
c5a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c5b0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
c5c0: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
c5d0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
c5f0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
c600: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
c610: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
c620: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
c630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
c640: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
c650: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
c660: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
c670: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
c680: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
c690: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
c6a0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
c6b0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
c6c0: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
c6d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c6e0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
c6f0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
c700: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
c710: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
c720: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
c730: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
c740: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
c750: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
c760: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
c770: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
c780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
c790: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
c7a0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
c7b0: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
c7c0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
c7d0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
c7e0: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
c7f0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
c800: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
c810: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
c820: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
c830: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
c840: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c860: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
c870: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
c880: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
c890: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
c8a0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
c8b0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
c8c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
c8d0: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
c8e0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
c8f0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
c900: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
c910: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
c920: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
c930: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
c940: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
c950: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
c960: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
c970: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
c980: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
c990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
c9a0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
c9b0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
c9c0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
c9d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c9e0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
c9f0: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
ca00: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
ca10: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
ca20: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
ca30: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
ca40: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
ca50: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ca60: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
ca70: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ca80: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
ca90: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
caa0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
cab0: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
cac0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
cad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cae0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UERY */../*.** C
caf0: 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69  ode an OP_Once i
cb00: 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61  nstruction and a
cb10: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
cb20: 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75  r its flag. Retu
cb30: 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65  rn the .** addre
cb40: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
cb50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  struction..*/.in
cb60: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  t sqlite3CodeOnc
cb70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
cb80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
cb90: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cba0: 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69  rse);      /* Vi
cbb0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
cbc0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72  ing coded */.  r
cbd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
cbe0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
cbf0: 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  ce, pParse->nOnc
cc00: 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  e++);.}../*.** G
cc10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cc20: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
cc30: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
cc40: 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
cc50: 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
cc60: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
cc70: 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
cc80: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
cc90: 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
cca0: 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
ccb0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
ccc0: 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
ccd0: 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
cce0: 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
ccf0: 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
cd00: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
cd10: 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
cd20: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
cd30: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
cd40: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
cd50: 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
cd60: 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
cd70: 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
cd80: 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74 65  int j1;.  sqlite
cd90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cda0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
cdb0: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20  gHasNull);.  j1 
cdc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cdd0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
cde0: 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
cdf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
ce00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ce10: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
ce20: 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
ce30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
ce40: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
ce50: 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
ce60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ce70: 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
ce80: 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
ce90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cea0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a  ere(v, j1);.}...
ceb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cec0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
ced0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
cee0: 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
cef0: 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
cf00: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
cf10: 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
cf20: 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
cf30: 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
cf40: 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
cf50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cf60: 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
cf70: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
cf80: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
cf90: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
cfa0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
cfb0: 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
cfc0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
cfd0: 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
cfe0: 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
cff0: 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
d000: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d010: 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
d020: 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
d030: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
d040: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
d050: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
d060: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
d070: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
d080: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
d090: 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
d0a0: 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
d0b0: 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
d0c0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d0d0: 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
d0e0: 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
d0f0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d100: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
d110: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
d120: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
d130: 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
d140: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
d150: 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
d160: 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
d170: 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
d180: 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
d190: 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
d1a0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
d1b0: 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
d1c0: 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
d1d0: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
d1e0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
d1f0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
d200: 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
d210: 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
d220: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d230: 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
d240: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
d250: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
d260: 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
d270: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
d280: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
d290: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
d2a0: 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
d2b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d2c0: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
d2d0: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
d2e0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d2f0: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
d300: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
d310: 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
d320: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d330: 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
d340: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
d350: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
d360: 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
d370: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d380: 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
d390: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
d3a0: 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
d3b0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d3c0: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
d3d0: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
d3e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d3f0: 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
d400: 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
d410: 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
d420: 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
d430: 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
d440: 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
d450: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
d460: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
d480: 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
d490: 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
d4a0: 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
d4b0: 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
d4c0: 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
d4d0: 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
d4e0: 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
d4f0: 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
d500: 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
d510: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
d520: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  > FROM <table>.*
d530: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
d540: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d550: 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
d560: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
d570: 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
d580: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
d590: 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
d5a0: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
d5b0: 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
d5c0: 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
d5d0: 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
d5e0: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
d5f0: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
d600: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
d610: 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
d620: 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
d630: 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
d640: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  n exactly one of
d650: 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
d660: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
d670: 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
d680: 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  P.  If inFlags c
d690: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
d6a0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
d6b0: 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
d6c0: 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
d6d0: 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66   used for a.** f
d6e0: 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  ast membership t
d6f0: 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
d700: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
d710: 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20   is set, the.** 
d720: 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  IN index will be
d730: 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
d740: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
d750: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
d760: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ** IN operator..
d770: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
d780: 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
d790: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
d7a0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
d7b0: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
d7c0: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
d7d0: 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
d7e0: 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
d7f0: 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
d800: 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
d810: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
d820: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
d830: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
d840: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
d850: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
d860: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
d870: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
d880: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
d890: 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49   it.** has a UNI
d8a0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
d8b0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  r UNIQUE index..
d8c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
d8d0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
d8e0: 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
d8f0: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
d900: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
d910: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
d920: 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
d930: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
d940: 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
d950: 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20  unless <column> 
d960: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
d970: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20  IMARY KEY or an 
d980: 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65  index can .** be
d990: 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c   found with <col
d9a0: 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74  umn> as its left
d9b0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  -most column..**
d9c0: 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
d9d0: 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
d9e0: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
d9f0: 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
da00: 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
da10: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
da20: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
da30: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
da40: 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
da50: 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
da60: 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
da70: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
da80: 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
da90: 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
daa0: 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
dab0: 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
dac0: 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
dad0: 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
dae0: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
daf0: 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
db00: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
db10: 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
db20: 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
db30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
db40: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
db50: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
db60: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
db70: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
db80: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
db90: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
dba0: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
dbb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
dbc0: 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
dbd0: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
dbe0: 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
dbf0: 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
dc00: 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
dc10: 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
dc20: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
dc30: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
dc40: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
dc50: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
dc60: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
dc70: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
dc80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
dc90: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
dca0: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
dcb0: 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
dcc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
dcd0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
dce0: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
dcf0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
dd00: 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
dd10: 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
dd20: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
dd30: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
dd40: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
dd50: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
dd60: 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
dd70: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
dd80: 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
dd90: 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
dda0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
ddb0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
ddc0: 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
ddd0: 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
dde0: 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
ddf0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
de00: 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
de10: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
de20: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
de30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
de40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
de50: 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  InIndex(Parse *p
de60: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c  Parse, Expr *pX,
de70: 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e   u32 inFlags, in
de80: 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  t *prRhsHasNull)
de90: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
dec0: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
ded0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
dee0: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
def0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
df00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
df10: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
df20: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
df30: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
df40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
df50: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
df60: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
df70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
df80: 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dfa0: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
dfb0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
dfc0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
dfd0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
dfe0: 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
dff0: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
e000: 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
e010: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
e020: 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
e030: 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
e040: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
e050: 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  0;..  /* Check t
e060: 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
e070: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
e080: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
e090: 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
e0a0: 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
e0b0: 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
e0c0: 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
e0d0: 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
e0e0: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
e0f0: 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f   p = (ExprHasPro
e100: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
e110: 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e  Select) ? pX->x.
e120: 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20  pSelect : 0);.  
e130: 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73  if( ALWAYS(pPars
e140: 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69  e->nErr==0) && i
e150: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e160: 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c  pt(p) ){.    sql
e170: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e180: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
e190: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e1a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
e1b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
e1e0: 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
e1f0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
e220: 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  ession <column> 
e230: 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b  */.    i16 iCol;
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e260: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
e270: 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20   <column> */.   
e280: 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e2b0: 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
e2c0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
e2d0: 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20   p );           
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2f0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e300: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e310: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
e320: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e340: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e350: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e360: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
e370: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
e380: 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
e390: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e3a0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e3b0: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
e3c0: 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e3e0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e3f0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e400: 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
e410: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
e420: 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  ab;.    pExpr = 
e430: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
e440: 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20  pExpr;.    iCol 
e450: 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69 43  = (i16)pExpr->iC
e460: 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f  olumn;.   .    /
e470: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61  * Code an OP_Tra
e480: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f  nsaction and OP_
e490: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
e4a0: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
e4b0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
e4c0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
e4d0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
e4e0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
e4f0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
e500: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
e510: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
e520: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
e530: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
e540: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
e550: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
e560: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
e570: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
e580: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
e590: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
e5a0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
e5b0: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
e5c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
e5d0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
e5e0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
e5f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
e600: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
e610: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
e620: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
e630: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
e640: 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  rse);.      Vdbe
e650: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
e660: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
e670: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
e680: 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
e690: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
e6a0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
e6b0: 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
e6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e6d0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
e6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
e720: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20  r variable */.. 
e730: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
e740: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
e750: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
e760: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
e770: 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
e780: 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
e790: 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
e7a0: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
e7b0: 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
e7c0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
e7d0: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
e7e0: 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ence.  */.      
e7f0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
e800: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
e810: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
e820: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
e830: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Expr);..      /*
e840: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
e850: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
e860: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
e870: 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20  rform the .     
e880: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
e890: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
e8a0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
e8b0: 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20  e column. If.   
e8c0: 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c     ** it is not,
e8d0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
e8e0: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69  ble to use any i
e8f0: 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndex..      */. 
e900: 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
e910: 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e  y_ok = sqlite3In
e920: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
e930: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
e940: 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20  l].affinity);.. 
e950: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
e960: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e970: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
e980: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
e990: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e9a0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
e9b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
e9c0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
e9d0: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  & sqlite3FindCol
e9e0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
e9f0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
ea00: 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20  ], 0)==pReq.    
ea10: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
ea20: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
ea30: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49  >nKeyCol==1 && I
ea40: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
ea50: 78 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  x))).        ){.
ea60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
ea70: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
ea80: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
ea90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
eaa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eab0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
eac0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
ead0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
eae0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
eaf0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
eb00: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
eb10: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  dx);.          V
eb20: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
eb30: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
eb40: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
eb50: 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
eb60: 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
eb70: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
eb80: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  1 );.          e
eb90: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
eba0: 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78  INDEX_ASC + pIdx
ebb0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b  ->aSortOrder[0];
ebc0: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
ebd0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
ebe0: 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  !pTab->aCol[iCol
ebf0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 23 69 66  ].notNull ){.#if
ec00: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ec10: 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
ec20: 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  SK.            c
ec30: 6f 6e 73 74 20 69 36 34 20 73 4f 6e 65 20 3d 20  onst i64 sOne = 
ec40: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  1;.            s
ec50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ec60: 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
ec70: 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20  nsUsed, .       
ec80: 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20 30           iTab, 0
ec90: 2c 20 30 2c 20 28 75 38 2a 29 26 73 4f 6e 65 2c  , 0, (u8*)&sOne,
eca0: 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e 64   P4_INT64);.#end
ecb0: 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
ecc0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b  prRhsHasNull = +
ecd0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
ece0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ecf0: 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
ed00: 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73  (v, iTab, *prRhs
ed10: 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  HasNull);.      
ed20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ed30: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ed40: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
ed50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ed60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ed70: 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69   If no preexisti
ed80: 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61 69  ng index is avai
ed90: 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e  lable for the IN
eda0: 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64   clause.  ** and
edb0: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69   IN_INDEX_NOOP i
edc0: 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70  s an allowed rep
edd0: 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ly.  ** and the 
ede0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
edf0: 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74  erator is a list
ee00: 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79  , not a subquery
ee10: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
ee20: 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 6e 74  S is not contant
ee30: 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66   or has two or f
ee40: 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a  ewer terms,.  **
ee50: 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
ee60: 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67 20 61  worth creating a
ee70: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
ee80: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20  e to evaluate.  
ee90: 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  ** the IN operat
eea0: 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f  or so return IN_
eeb0: 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f  INDEX_NOOP..  */
eec0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a  .  if( eType==0.
eed0: 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26     && (inFlags &
eee0: 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
eef0: 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72 48 61  K).   && !ExprHa
ef00: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
ef10: 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26  _xIsSelect).   &
ef20: 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73  & (!sqlite3InRhs
ef30: 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c  IsConstant(pX) |
ef40: 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pX->x.pList->n
ef50: 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20  Expr<=2).  ){.  
ef60: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
ef70: 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20  EX_NOOP;.  }.   
ef80: 20 20 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d    ..  if( eType=
ef90: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  =0 ){.    /* Cou
efa0: 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65  ld not find an e
efb0: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
efc0: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73   index to use as
efd0: 20 74 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e   the RHS b-tree.
efe0: 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20  .    ** We will 
eff0: 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
f000: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
f010: 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f  ble to do the jo
f020: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33  b..    */.    u3
f030: 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f  2 savedNQueryLoo
f040: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65  p = pParse->nQue
f050: 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  ryLoop;.    int 
f060: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30  rMayHaveNull = 0
f070: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e  ;.    eType = IN
f080: 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20  _INDEX_EPH;.    
f090: 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e  if( inFlags & IN
f0a0: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20  _INDEX_LOOP ){. 
f0b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
f0c0: 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20  eryLoop = 0;.   
f0d0: 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74     if( pX->pLeft
f0e0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ->iColumn<0 && !
f0f0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f100: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
f110: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79  ) ){.        eTy
f120: 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  pe = IN_INDEX_RO
f130: 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  WID;.      }.   
f140: 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52 68 73   }else if( prRhs
f150: 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  HasNull ){.     
f160: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
f170: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20   rMayHaveNull = 
f180: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f190: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f1a0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70  3CodeSubselect(p
f1b0: 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48  Parse, pX, rMayH
f1c0: 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d  aveNull, eType==
f1d0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b  IN_INDEX_ROWID);
f1e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75  .    pParse->nQu
f1f0: 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e  eryLoop = savedN
f200: 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c  QueryLoop;.  }el
f210: 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62  se{.    pX->iTab
f220: 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20  le = iTab;.  }. 
f230: 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d   return eType;.}
f240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
f250: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
f260: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
f270: 65 73 20 75 73 65 64 20 61 73 20 61 20 73 75 62  es used as a sub
f280: 71 75 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  query expression
f290: 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20  , EXISTS,.** or 
f2a0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45  IN operators.  E
f2b0: 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
f2c0: 20 20 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f     (SELECT a FRO
f2d0: 4d 20 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d  M b)          --
f2e0: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20   subquery.**    
f2f0: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
f300: 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45  a FROM b)   -- E
f310: 58 49 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a  XISTS subquery.*
f320: 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c  *     x IN (4,5,
f330: 31 31 29 20 20 20 20 20 20 20 20 20 20 20 20 20  11)             
f340: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
f350: 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67  with list on rig
f360: 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20  ht-hand side.** 
f370: 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
f380: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d   a FROM b)     -
f390: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
f3a0: 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74  th subquery on t
f3b0: 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  he right.**.** T
f3c0: 68 65 20 70 45 78 70 72 20 70 61 72 61 6d 65 74  he pExpr paramet
f3d0: 65 72 20 64 65 73 63 72 69 62 65 73 20 74 68 65  er describes the
f3e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
f3f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e   contains the IN
f400: 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  .** operator or 
f410: 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
f420: 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 52  If parameter isR
f430: 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  owid is non-zero
f440: 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  , then expressio
f450: 6e 20 70 45 78 70 72 20 69 73 20 67 75 61 72 61  n pExpr is guara
f460: 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f  nteed.** to be o
f470: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77  f the form "<row
f480: 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29  id> IN (?, ?, ?)
f490: 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e  ", where <rowid>
f4a0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
f4b0: 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67  ** to some integ
f4c0: 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66  er key column of
f4d0: 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e   a table B-Tree.
f4e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75   In this case, u
f4f0: 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20  se an.** intkey 
f500: 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20  B-Tree to store 
f510: 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e  the set of IN(..
f520: 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61  .) values instea
f530: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
f540: 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61  * (slower) varia
f550: 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20  ble length keys 
f560: 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  B-Tree..**.** If
f570: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73   rMayHaveNull is
f580: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20   non-zero, that 
f590: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f  means that the o
f5a0: 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49  peration is an I
f5b0: 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45  N.** (not a SELE
f5c0: 43 54 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e  CT or EXISTS) an
f5d0: 64 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6d  d that the RHS m
f5e0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55  ight contains NU
f5f0: 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73  LLs..** All this
f600: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73   routine does is
f610: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
f620: 72 65 67 69 73 74 65 72 20 67 69 76 65 6e 20 62  register given b
f630: 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a  y rMayHaveNull.*
f640: 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c  * to NULL.  Call
f650: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  ing routines wil
f660: 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63  l take care of c
f670: 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67  hanging this reg
f680: 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74  ister.** value t
f690: 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68  o non-NULL if th
f6a0: 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72  e RHS is NULL-fr
f6b0: 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  ee..**.** For a 
f6c0: 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53  SELECT or EXISTS
f6d0: 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72   operator, retur
f6e0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 74  n the register t
f6f0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  hat holds the.**
f700: 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e   result.  For IN
f710: 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66   operators or if
f720: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f730: 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  , the return val
f740: 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e  ue is 0..*/.#ifn
f750: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f760: 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c  SUBQUERY.int sql
f770: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
f780: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
f790: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
f7a0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
f7b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
f7c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
f7d0: 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20  The IN, SELECT, 
f7e0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
f7f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73  or */.  int rHas
f800: 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20  NullFlag,       
f810: 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74  /* Register that
f820: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
f830: 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20   NULLs exist in 
f840: 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  RHS */.  int isR
f850: 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
f860: 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53   /* If true, LHS
f870: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
f880: 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  is a rowid */.){
f890: 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61  .  int jmpIfDyna
f8a0: 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  mic = -1;       
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8c0: 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20  * One-time test 
f8d0: 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74  address */.  int
f8e0: 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20   rReg = 0;      
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
f910: 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69   storing resulti
f920: 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ng */.  Vdbe *v 
f930: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f940: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
f950: 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65  NEVER(v==0) ) re
f960: 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
f970: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
f980: 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  Parse);..  /* Th
f990: 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20  is code must be 
f9a0: 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72  run in its entir
f9b0: 65 74 79 20 65 76 65 72 79 20 74 69 6d 65 20 69  ety every time i
f9c0: 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  t is encountered
f9d0: 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20  .  ** if any of 
f9e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
f9f0: 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
fa00: 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68 74      *  The right
fa10: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 20  -hand side is a 
fa20: 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
fa30: 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54  ery.  **    *  T
fa40: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
fa50: 64 65 20 69 73 20 61 6e 20 65 78 70 72 65 73 73  de is an express
fa60: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
fa70: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20  ing variables.  
fa80: 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72 65 20  **    *  We are 
fa90: 69 6e 73 69 64 65 20 61 20 74 72 69 67 67 65 72  inside a trigger
faa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c  .  **.  ** If al
fab0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
fac0: 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77  re false, then w
fad0: 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63  e can run this c
fae0: 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20  ode just once.  
faf0: 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65 73 75  ** save the resu
fb00: 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74  lts, and reuse t
fb10: 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f  he same result o
fb20: 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76  n subsequent inv
fb30: 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  ocations..  */. 
fb40: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
fb50: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
fb60: 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  VarSelect) ){.  
fb70: 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d    jmpIfDynamic =
fb80: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
fb90: 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f  (pParse); VdbeCo
fba0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
fbb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fbc0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66  MIT_EXPLAIN.  if
fbd0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
fbe0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
fbf0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
fc00: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
fc10: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58   pParse->db, "EX
fc20: 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55  ECUTE %s%s SUBQU
fc30: 45 52 59 20 25 64 22 2c 20 6a 6d 70 49 66 44 79  ERY %d", jmpIfDy
fc40: 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52  namic>=0?"":"COR
fc50: 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20  RELATED ",.     
fc60: 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b     pExpr->op==TK
fc70: 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c  _IN?"LIST":"SCAL
fc80: 41 52 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  AR", pParse->iNe
fc90: 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29  xtSelectId.    )
fca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fcb0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
fcc0: 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
fcd0: 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
fce0: 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
fcf0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
fd00: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
fd10: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
fd20: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
fd30: 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
fd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
fd50: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
fd60: 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
fd70: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
fda0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
fdb0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
fdc0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
fdd0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
fde0: 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
fdf0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
fe00: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
fe10: 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
fe20: 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
fe30: 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ation */..      
fe40: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
fe50: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
fe60: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
fe70: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
fe80: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
fe90: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
fea0: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
feb0: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
fec0: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
fed0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
fee0: 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
fef0: 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
ff00: 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
ff10: 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
ff20: 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
ff30: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
ff40: 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
ff50: 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
ff60: 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
ff70: 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
ff80: 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
ff90: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
ffa0: 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
ffb0: 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
ffc0: 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
ffd0: 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
ffe0: 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
fff0: 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
10000 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
10010 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
10020 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
10030 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
10040 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
10050 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
10060 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
10070 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
10080 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
10090 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
100a0 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
100b0 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
100c0 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
100d0 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
100e0 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
100f0 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
10100 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
10110 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
10120 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
10130 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
10140 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
10150 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
10160 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
10170 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
10180 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
10190 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
101a0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b  Rowid);.      pK
101b0 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
101c0 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
101d0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
101e0 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20  e->db, 1, 1);.. 
101f0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
10200 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
10210 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
10220 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
10230 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
10240 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
10250 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
10260 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10270 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
10280 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
10290 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
102a0 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
102b0 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
102c0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
102d0 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
102e0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
102f0 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
10300 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
10310 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
10320 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  st;.        Expr
10330 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
10340 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
10350 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
10360 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10370 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
10380 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
10390 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
103a0 20 64 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20   dest.affSdst = 
103b0 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  (u8)affinity;.  
103c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
103d0 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
103e0 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
103f0 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
10400 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
10410 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
10420 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
10430 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
10440 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
10450 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
10460 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
10470 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
10480 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
10490 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
104a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
104b0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
104c0 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
104d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
104e0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
104f0 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
10500 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
10520 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10530 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
10540 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
10550 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
10560 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
10570 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
10580 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
10590 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
105a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
105b0 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
105c0 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
105d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
105e0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
105f0 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
10600 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
10610 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
10620 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
10630 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10640 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
10690 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
106a0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
106b0 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
106c0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
106d0 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
106e0 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
106f0 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
10700 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
10710 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
10720 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
10730 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
10740 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
10750 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
10760 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
10770 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
10780 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
10790 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
107a0 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
107b0 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
107c0 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
107d0 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
107e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
107f0 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
10800 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
10810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
10820 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
10830 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
10840 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
10850 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
10860 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
10870 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
10880 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
10890 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
108a0 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
108b0 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
108c0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
108d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
108e0 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
108f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
10900 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
10910 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
10920 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
10930 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
10940 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
10950 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10960 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
10970 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
10980 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
10990 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
109a0 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
109b0 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
109c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
109d0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
109e0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
109f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10a00 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
10a10 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
10a20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10a30 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
10a40 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
10a50 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
10a60 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
10a70 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
10a80 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
10a90 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
10aa0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
10ab0 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
10ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10ad0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10ae0 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
10af0 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
10b00 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
10b10 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
10b20 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
10b30 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
10b40 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
10b50 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
10b60 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
10b70 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
10b80 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
10b90 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
10ba0 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
10bb0 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
10bc0 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
10bd0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10be0 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
10bf0 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
10c00 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
10c10 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
10c20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10c30 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
10c40 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
10c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
10c60 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
10c70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
10c80 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
10c90 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
10ca0 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
10cb0 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
10cc0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
10cd0 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
10ce0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
10cf0 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
10d00 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
10d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10d20 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10d30 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
10d40 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
10d50 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
10d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d70 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
10d80 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
10d90 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
10da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
10db0 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10de0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
10df0 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
10e20 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
10e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
10e40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10e60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10e70 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
10e80 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
10e90 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
10ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10ec0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
10ed0 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
10ee0 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
10ef0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
10f00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
10f10 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
10f20 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
10f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10f50 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
10f60 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
10f70 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
10f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
10f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10fa0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
10fb0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
10fc0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
10fd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
10fe0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
10ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11000 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
11010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11020 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
11030 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
11040 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
11050 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11060 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11070 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
11080 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
11090 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
110a0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
110b0 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
110c0 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
110d0 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
110e0 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
110f0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
11100 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
11110 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
11120 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
11130 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
11140 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
11150 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
11160 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
11170 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
11180 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
11190 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
111a0 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
111b0 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
111c0 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
111d0 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
111e0 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
111f0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
11200 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
11230 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
11240 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
11250 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11270 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
11280 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
11290 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
112a0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
112b0 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
112c0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
112d0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
112e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
112f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
11300 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
11310 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
11320 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
11330 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
11340 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
11350 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
11360 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
11370 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
11380 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
11390 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
113a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
113b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
113c0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
113d0 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
113e0 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
113f0 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74        dest.iSdst
11400 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
11410 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11420 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11430 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
11440 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
11450 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11460 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
11470 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
11480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11490 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
114a0 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
114b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
114c0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
114d0 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
114e0 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
114f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
11500 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
11510 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
11520 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11530 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11540 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
11550 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
11560 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
11570 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
11580 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
115b0 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
115c0 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
115d0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
115e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
115f0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11600 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20  , &dest) ){.    
11610 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11620 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65 67      }.      rReg
11630 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
11640 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56  .      ExprSetVV
11650 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  AProperty(pExpr,
11660 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
11670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11680 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48 61  }.  }..  if( rHa
11690 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20  sNullFlag ){.   
116a0 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
116b0 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72 2d  llFlag(v, pExpr-
116c0 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c  >iTable, rHasNul
116d0 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  lFlag);.  }..  i
116e0 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
116f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
11700 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11710 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
11720 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
11730 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
11740 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52 65  );..  return rRe
11750 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  g;.}.#endif /* S
11760 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
11770 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ERY */..#ifndef 
11780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11790 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  UERY./*.** Gener
117a0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
117b0 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  IN expression..*
117c0 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
117d0 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20  SELECT ...).**  
117e0 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65 2c      x IN (value,
117f0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a   value, ...).**.
11800 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64  ** The left-hand
11810 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20 61   side (LHS) is a
11820 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
11830 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d 68  on.  The right-h
11840 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a 2a  and side (RHS).*
11850 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
11860 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61   zero or more va
11870 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72 65  lues.  The expre
11880 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ssion is true if
11890 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63   the LHS is.** c
118a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
118b0 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76 61  the RHS.  The va
118c0 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  lue of the expre
118d0 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e  ssion is unknown
118e0 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68   (NULL).** if th
118f0 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72  e LHS is NULL or
11900 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
11910 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ot contained wit
11920 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64 20  hin the RHS and 
11930 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61  the.** RHS conta
11940 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
11950 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a  NULL values..**.
11960 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11970 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
11980 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65 73  hat jumps to des
11990 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65 20  tIfFalse if the 
119a0 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63  LHS is not .** c
119b0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
119c0 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75 65  the RHS.  If due
119d0 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e   to NULLs we can
119e0 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  not determine if
119f0 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63   the LHS.** is c
11a00 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
11a10 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f  RHS then jump to
11a20 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66   destIfNull.  If
11a30 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74   the LHS is cont
11a40 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ained.** within 
11a50 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61 6c  the RHS then fal
11a60 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74  l through..*/.st
11a70 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
11a80 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20 50  3ExprCodeIN(.  P
11a90 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11aa0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11ab0 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
11ac0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
11ad0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
11ae0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
11af0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
11b00 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
11b10 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ,      /* Jump h
11b20 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e 6f  ere if LHS is no
11b30 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
11b40 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
11b50 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20 20  destIfNull      
11b60 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
11b70 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
11b80 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f  e unknown due to
11b90 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69   NULLs */.){.  i
11ba0 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d  nt rRhsHasNull =
11bb0 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72   0;  /* Register
11bc0 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69 66   that is true if
11bd0 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55   RHS contains NU
11be0 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63  LL values */.  c
11bf0 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20  har affinity;   
11c00 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
11c10 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  on affinity to u
11c20 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  se */.  int eTyp
11c30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
11c40 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48 53   Type of the RHS
11c50 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20 20   */.  int r1;   
11c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c70 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
11c80 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65 20  ister */.  Vdbe 
11c90 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
11ca0 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 6e   /* Statement un
11cb0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
11cc0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   */..  /* Comput
11cd0 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66 74  e the RHS.   Aft
11ce0 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74 68  er this step, th
11cf0 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75 72  e table with cur
11d00 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e  sor.  ** pExpr->
11d10 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  iTable will cont
11d20 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20  ains the values 
11d30 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
11d40 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d   RHS..  */.  v =
11d50 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
11d60 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
11d70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64  ;       /* OOM d
11d80 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74 6f  etected prior to
11d90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f   this routine */
11da0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
11db0 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49 4e  nt((v, "begin IN
11dc0 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79 70   expr"));.  eTyp
11dd0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
11de0 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
11df0 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e10 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42     IN_INDEX_MEMB
11e20 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45  ERSHIP | IN_INDE
11e30 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20  X_NOOP_OK,.     
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46 61          destIfFa
11e60 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20  lse==destIfNull 
11e70 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e 75  ? 0 : &rRhsHasNu
11e80 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ll);..  /* Figur
11e90 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69  e out the affini
11ea0 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65  ty to use to cre
11eb0 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74  ate a key from t
11ec0 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
11ed0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
11ee0 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
11ef0 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
11f00 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
11f10 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50  or.  ** P4 of OP
11f20 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a  _MakeRecord..  *
11f30 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20 63  /.  affinity = c
11f40 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
11f50 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20  y(pExpr);..  /* 
11f60 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74 68  Code the LHS, th
11f70 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c  e <expr> from "<
11f80 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e  expr> IN (...)".
11f90 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
11fa0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
11fb0 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c  rse);.  r1 = sql
11fc0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11fd0 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
11fe0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11ff0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
12000 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71  r1);..  /* If sq
12010 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
12020 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  () did not find 
12030 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  or create an ind
12040 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ex that is.  ** 
12050 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76 61  suitable for eva
12060 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20 6f  luating the IN o
12070 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65 76  perator, then ev
12080 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a 20  aluate using a. 
12090 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66 20   ** sequence of 
120a0 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a  comparisons..  *
120b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49  /.  if( eType==I
120c0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a  N_INDEX_NOOP ){.
120d0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
120e0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
120f0 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65  List;.    CollSe
12100 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
12110 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
12120 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
12130 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62  ft);.    int lab
12140 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  elOk = sqlite3Vd
12150 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12160 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67 54      int r2, regT
12170 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20 72  oFree;.    int r
12180 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  egCkNull = 0;.  
12190 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61 73    int ii;.    as
121a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
121b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
121c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
121d0 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c     if( destIfNul
121e0 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
121f0 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75 6c  {.      regCkNul
12200 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  l = sqlite3GetTe
12210 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12230 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
12240 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72 65 67  And, r1, r1, reg
12250 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  CkNull);.    }. 
12260 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
12270 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69  pList->nExpr; ii
12280 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  ++){.      r2 = 
12290 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
122a0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69 73  emp(pParse, pLis
122b0 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  t->a[ii].pExpr, 
122c0 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20  &regToFree);.   
122d0 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
122e0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43   && sqlite3ExprC
122f0 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e  anBeNull(pList->
12300 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
12310 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12320 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12330 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c  BitAnd, regCkNul
12340 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c  l, r2, regCkNull
12350 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12360 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e   if( ii<pList->n
12370 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49 66  Expr-1 || destIf
12380 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73  Null!=destIfFals
12390 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
123a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
123b0 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62  , OP_Eq, r1, lab
123c0 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20  elOk, r2,.      
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c      (void*)pColl
123f0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
12400 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
12410 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69 73  ageIf(v, ii<pLis
12420 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
12430 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
12440 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74  eIf(v, ii==pList
12450 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20  ->nExpr-1);.    
12460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12470 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e  hangeP5(v, affin
12480 69 74 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ity);.      }els
12490 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
124a0 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  t( destIfNull==d
124b0 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20 20  estIfFalse );.  
124c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
124d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65  eAddOp4(v, OP_Ne
124e0 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73  , r1, destIfFals
124f0 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  e, r2,.         
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
12520 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65  4_COLLSEQ); Vdbe
12530 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12540 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12550 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69  ChangeP5(v, affi
12560 6e 69 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55  nity | SQLITE_JU
12570 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
12580 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
12590 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
125a0 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65 65  Parse, regToFree
125b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
125c0 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20   regCkNull ){.  
125d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
125e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
125f0 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64  ll, regCkNull, d
12600 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65  estIfNull); Vdbe
12610 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12630 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12640 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
12650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12660 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12670 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b  bel(v, labelOk);
12680 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
12690 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
126a0 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  e, regCkNull);. 
126b0 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f   }else{.  .    /
126c0 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20  * If the LHS is 
126d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 72  NULL, then the r
126e0 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72 20  esult is either 
126f0 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65  false or NULL de
12700 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
12710 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52 48  n whether the RH
12720 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f  S is empty or no
12730 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
12740 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12750 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65  sqlite3ExprCanBe
12760 4e 75 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66  Null(pExpr->pLef
12770 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
12780 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
12790 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
127a0 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66     /* Shortcut f
127b0 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
127c0 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61 6c  se where the fal
127d0 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63  se and NULL outc
127e0 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  omes are.       
127f0 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   ** the same. */
12800 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12810 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12820 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73  _IsNull, r1, des
12830 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f  tIfNull); VdbeCo
12840 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12860 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c 69  int addr1 = sqli
12870 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12880 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29   OP_NotNull, r1)
12890 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
128a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
128b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
128c0 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70 72  OP_Rewind, pExpr
128d0 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
128e0 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20  False);.        
128f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12910 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12920 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
12930 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  Null);.        s
12940 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
12950 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
12960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
12970 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e     if( eType==IN
12980 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a  _INDEX_ROWID ){.
12990 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
129a0 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20 69   case, the RHS i
129b0 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  s the ROWID of t
129c0 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20 20  able b-tree.    
129d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
129e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
129f0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 31  OP_MustBeInt, r1
12a00 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 20  , destIfFalse); 
12a10 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12a30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
12a40 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72 2d  otExists, pExpr-
12a50 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
12a60 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  alse, r1);.     
12a70 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12a80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12a90 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
12aa0 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 61  se, the RHS is a
12ab0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a  n index b-tree..
12ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
12ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12ae0 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c  (v, OP_Affinity,
12af0 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66 69   r1, 1, 0, &affi
12b00 6e 69 74 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20  nity, 1);.  .   
12b10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 74     /* If the set
12b20 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
12b30 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
12b40 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 0a   result of the .
12b50 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20 28        ** "x IN (
12b60 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f 6e  ...)" expression
12b70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
12b80 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68  0 or NULL. If th
12b90 65 20 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 63  e set.      ** c
12ba0 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20  ontains no NULL 
12bb0 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65  values, then the
12bc0 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49 66   result is 0. If
12bd0 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 20 20   the set .      
12be0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ** contains one 
12bf0 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
12c00 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
12c10 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20 20  sult of the.    
12c20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
12c30 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20  is also NULL..  
12c40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
12c50 65 72 74 28 20 64 65 73 74 49 66 46 61 6c 73 65  ert( destIfFalse
12c60 21 3d 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20  !=destIfNull || 
12c70 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29  rRhsHasNull==0 )
12c80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 52 68 73  ;.      if( rRhs
12c90 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  HasNull==0 ){.  
12ca0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
12cb0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74 20  anch runs if it 
12cc0 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70  is known at comp
12cd0 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74 68  ile time that th
12ce0 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a 2a  e RHS.        **
12cf0 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   cannot contain 
12d00 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68 69  NULL values. Thi
12d10 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68 65  s happens as the
12d20 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20   result.        
12d30 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c  ** of a "NOT NUL
12d40 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  L" constraint in
12d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
12d60 68 65 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a  hema..        **
12d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f  .        ** Also
12d80 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63 68   run this branch
12d90 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75 69   if NULL is equi
12da0 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a  valent to FALSE.
12db0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
12dc0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 49  his particular I
12dd0 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  N operator..    
12de0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73      */.        s
12df0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12e00 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
12e10 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
12e20 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
12e30 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  r1, 1);.        
12e40 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12e50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12e60 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
12e70 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48 53   branch, the RHS
12e80 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68 74   of the IN might
12e90 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20   contain a NULL 
12ea0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  and.        ** t
12eb0 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 61  he presence of a
12ec0 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53   NULL on the RHS
12ed0 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72 65   makes a differe
12ee0 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  nce in the.     
12ef0 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20     ** outcome.. 
12f00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12f10 20 20 69 6e 74 20 6a 31 3b 0a 20 20 0a 20 20 20    int j1;.  .   
12f20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68       /* First ch
12f30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
12f40 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
12f50 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ed in the RHS.  
12f60 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  If so,.        *
12f70 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73 77 65  * then the answe
12f80 72 20 69 73 20 54 52 55 45 20 74 68 65 20 70 72  r is TRUE the pr
12f90 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20  esence of NULLs 
12fa0 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 0a  in the RHS does.
12fb0 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d          ** not m
12fc0 61 74 74 65 72 2e 20 20 49 66 20 74 68 65 20 4c  atter.  If the L
12fd0 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
12fe0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2c 20  ned in the RHS, 
12ff0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
13000 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20 4e 55   ** answer is NU
13010 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 63 6f  LL if the RHS co
13020 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64  ntains NULLs and
13030 20 74 68 65 20 61 6e 73 77 65 72 20 69 73 0a 20   the answer is. 
13040 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53 45 20         ** FALSE 
13050 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55  if the RHS is NU
13060 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20 20 20  LL-free..       
13070 20 2a 2f 0a 20 20 20 20 20 20 20 20 6a 31 20 3d   */.        j1 =
13080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13090 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
130a0 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
130b0 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  , 0, r1, 1);.   
130c0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
130d0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
130e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
130f0 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52  v, OP_IsNull, rR
13100 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49  hsHasNull, destI
13110 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
13120 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13130 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13140 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13150 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
13160 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20  False);.        
13170 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13180 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
13190 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
131a0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
131b0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
131c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
131d0 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
131e0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
131f0 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70 72  (v, "end IN expr
13200 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  "));.}.#endif /*
13210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
13220 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65  QUERY */..#ifnde
13230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
13240 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a  OATING_POINT./*.
13250 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
13260 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
13270 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f  will put the flo
13280 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
13290 61 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62  alue described b
132a0 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  y z[0..n-1] into
132b0 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
132c0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74  **.** The z[] st
132d0 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62  ring will probab
132e0 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74  ly not be zero-t
132f0 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20  erminated.  But 
13300 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61  the .** z[n] cha
13310 72 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e  racter is guaran
13320 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74  teed to be somet
13330 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e  hing that does n
13340 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20  ot look.** like 
13350 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e  the continuation
13360 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a   of the number..
13370 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
13380 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c  odeReal(Vdbe *v,
13390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
133a0 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20  int negateFlag, 
133b0 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28  int iMem){.  if(
133c0 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b   ALWAYS(z!=0) ){
133d0 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  .    double valu
133e0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  e;.    sqlite3At
133f0 6f 46 28 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71  oF(z, &value, sq
13400 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
13410 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
13420 20 20 20 20 61 73 73 65 72 74 28 20 21 73 71 6c      assert( !sql
13430 69 74 65 33 49 73 4e 61 4e 28 76 61 6c 75 65 29  ite3IsNaN(value)
13440 20 29 3b 20 2f 2a 20 54 68 65 20 6e 65 77 20 41   ); /* The new A
13450 74 6f 46 20 6e 65 76 65 72 20 72 65 74 75 72 6e  toF never return
13460 73 20 4e 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28  s NaN */.    if(
13470 20 6e 65 67 61 74 65 46 6c 61 67 20 29 20 76 61   negateFlag ) va
13480 6c 75 65 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20  lue = -value;.  
13490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
134a0 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 52 65  Op4Dup8(v, OP_Re
134b0 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20  al, 0, iMem, 0, 
134c0 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f  (u8*)&value, P4_
134d0 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  REAL);.  }.}.#en
134e0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  dif.../*.** Gene
134f0 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
13500 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
13510 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
13520 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
13530 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
13540 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
13550 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f  **.** Expr.u.zTo
13560 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54  ken is always UT
13570 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d  F8 and zero-term
13580 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  inated..*/.stati
13590 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
135a0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
135b0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
135c0 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
135d0 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
135e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
135f0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
13600 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
13610 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
13620 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
13630 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e;.    assert( i
13640 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >=0 );.    if( n
13650 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
13660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13670 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
13680 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
13690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
136a0 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   c;.    i64 valu
136b0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
136c0 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
136d0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
136e0 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
136f0 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72  c = sqlite3DecOr
13700 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c  HexToI64(z, &val
13710 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ue);.    if( c==
13720 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65  0 || (c==2 && ne
13730 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
13740 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76  if( negFlag ){ v
13750 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d  alue = c==2 ? SM
13760 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d  ALLEST_INT64 : -
13770 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 73  value; }.      s
13780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
13790 44 75 70 38 28 76 2c 20 4f 50 5f 49 6e 74 36 34  Dup8(v, OP_Int64
137a0 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 28 75  , 0, iMem, 0, (u
137b0 38 2a 29 26 76 61 6c 75 65 2c 20 50 34 5f 49 4e  8*)&value, P4_IN
137c0 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
137d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
137e0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
137f0 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
13800 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13810 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
13820 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
13830 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
13840 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
13850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
13860 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
13870 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
13880 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
13890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
138a0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
138b0 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
138c0 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20  l too big: %s", 
138d0 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  z);.      }else.
138e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
138f0 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
13900 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
13910 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Mem);.      }.#e
13920 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
13930 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  ../*.** Clear a 
13940 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  cache entry..*/.
13950 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
13960 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
13970 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
13980 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b  t yColCache *p){
13990 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65  .  if( p->tempRe
139a0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  g ){.    if( pPa
139b0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
139c0 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
139d0 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
139e0 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
139f0 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
13a00 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65  pReg++] = p->iRe
13a10 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  g;.    }.    p->
13a20 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d  tempReg = 0;.  }
13a30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .}.../*.** Recor
13a40 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
13a50 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72  cache that a par
13a60 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66  ticular column f
13a70 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75  rom a.** particu
13a80 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f  lar table is sto
13a90 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  red in a particu
13aa0 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  lar register..*/
13ab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13ac0 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73  rCacheStore(Pars
13ad0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13ae0 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
13af0 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
13b00 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b  i;.  int minLru;
13b10 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20  .  int idxLru;. 
13b20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13b30 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  e *p;..  /* Unle
13b40 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ss an error has 
13b50 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74  occurred, regist
13b60 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
13b70 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
13b80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  */.  assert( iRe
13b90 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  g>0 || pParse->n
13ba0 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
13bb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  );.  assert( iCo
13bd0 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
13be0 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
13bf0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
13c00 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
13c10 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
13c20 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
13c30 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
13c40 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
13c50 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
13c60 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
13c70 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
13c80 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
13c90 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
13ca0 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
13cb0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
13cc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .  */.  if( Opti
13cd0 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
13ce0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
13cf0 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29  ITE_ColumnCache)
13d00 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
13d10 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
13d20 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
13d30 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
13d40 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
13d50 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
13d60 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
13d70 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
13d80 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
13d90 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
13da0 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
13db0 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
13dc0 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
13dd0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
13de0 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
13df0 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13e00 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13e10 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13e20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
13e30 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20  ( p->iReg==0 || 
13e40 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
13e50 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
13e60 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
13e70 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20  f..  /* Find an 
13e80 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72  empty slot and r
13e90 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66  eplace it */.  f
13ea0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13eb0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13ec0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13ed0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13ee0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20   if( p->iReg==0 
13ef0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  ){.      p->iLev
13f00 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
13f10 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
13f20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
13f30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ;.      p->iColu
13f40 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
13f50 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
13f60 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
13f70 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  g = 0;.      p->
13f80 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
13f90 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
13fa0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
13fb0 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65   }..  /* Replace
13fc0 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74   the last recent
13fd0 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e  ly used */.  min
13fe0 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
13ff0 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b  ;.  idxLru = -1;
14000 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
14010 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
14020 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
14030 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14040 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c  .    if( p->lru<
14050 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20  minLru ){.      
14060 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20  idxLru = i;.    
14070 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
14080 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  u;.    }.  }.  i
14090 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75  f( ALWAYS(idxLru
140a0 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  >=0) ){.    p = 
140b0 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
140c0 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20  he[idxLru];.    
140d0 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
140e0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
140f0 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
14100 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43   iTab;.    p->iC
14110 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
14120 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
14130 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
14140 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
14150 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
14160 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
14170 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
14180 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
14190 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
141a0 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
141b0 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
141c0 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
141d0 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
141e0 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
141f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
14200 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14210 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
14220 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14230 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
14240 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
14250 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20  nt iLast = iReg 
14260 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74  + nReg - 1;.  st
14270 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14280 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
14290 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
142a0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
142b0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
142c0 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
142d0 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
142e0 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c  r>=iReg && r<=iL
142f0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63  ast ){.      cac
14300 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
14310 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
14320 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
14330 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
14340 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
14350 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
14360 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
14370 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
14380 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
14390 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
143a0 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
143b0 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
143c0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
143d0 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
143e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
143f0 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
14400 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
14410 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14420 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  el++;.#ifdef SQL
14430 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
14440 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
14450 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
14460 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
14470 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f   printf("PUSH to
14480 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
14490 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
144a0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
144b0 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
144c0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
144d0 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
144e0 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
144f0 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
14500 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72  ious sqlite3Expr
14510 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74  CachePush operat
14520 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
14530 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a  ords, restore.**
14540 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
14550 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
14560 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74  n prior the most
14570 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f   recent Push..*/
14580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14590 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
145a0 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
145b0 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
145c0 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65  Cache *p;.  asse
145d0 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
145e0 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20  heLevel>=1 );.  
145f0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14600 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51  vel--;.#ifdef SQ
14610 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
14620 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
14630 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
14640 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
14650 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74    printf("POP  t
14660 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
14670 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
14680 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
14690 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
146a0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
146b0 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
146c0 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
146d0 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
146e0 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
146f0 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
14700 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
14710 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
14720 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
14730 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
14740 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
14750 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
14760 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
14770 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
14780 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
14790 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
147a0 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
147b0 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
147c0 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
147d0 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
147e0 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
147f0 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
14800 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
14810 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
14820 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
14830 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
14840 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
14850 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
14860 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
14870 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
14880 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
14890 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
148a0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
148b0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
148c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
148d0 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
148e0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
148f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
14900 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14910 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
14920 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
14930 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
14940 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
14950 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
14960 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
14970 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
14980 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
14990 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
149a0 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
149b0 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
149c0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
149d0 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
149e0 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
149f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
14a00 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
14a10 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
14a20 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
14a30 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
14a40 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
14a50 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
14a60 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
14a70 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
14a80 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
14a90 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
14aa0 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30  .){.  if( iCol<0
14ab0 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
14ac0 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
14ad0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ae0 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
14af0 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
14b00 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
14b10 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
14b20 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
14b30 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
14b40 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a    int x = iCol;.
14b50 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
14b60 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
14b70 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
14b80 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
14b90 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
14ba0 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
14bb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14bc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
14bd0 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
14be0 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
14bf0 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
14c00 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
14c10 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
14c20 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
14c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14c40 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
14c50 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
14c60 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
14c70 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
14c80 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
14c90 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
14ca0 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e   a register.  An
14cb0 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61   effort.** is ma
14cc0 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
14cd0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
14ce0 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62  register iReg, b
14cf0 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f  ut this is.** no
14d00 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54  t guaranteed.  T
14d10 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
14d20 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
14d30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
14d40 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
14d50 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
14d60 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
14d70 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
14d80 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
14d90 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
14da0 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
14db0 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
14dc0 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
14dd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
14de0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
14df0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14e00 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
14e10 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
14e20 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14e30 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
14e40 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
14e50 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
14e60 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
14e70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
14e80 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
14e90 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
14ea0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
14eb0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
14ec0 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
14ed0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
14ee0 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
14ef0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
14f00 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
14f10 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
14f20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
14f30 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  OP_Column */.){.
14f40 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
14f50 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
14f60 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
14f70 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
14f80 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
14f90 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
14fa0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
14fb0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
14fc0 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26  if( p->iReg>0 &&
14fd0 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
14fe0 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
14ff0 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
15000 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
15010 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
15020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15030 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
15040 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
15050 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
15060 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
15070 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
15080 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
15090 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
150a0 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
150b0 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
150c0 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
150d0 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
150e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
150f0 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
15100 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
15110 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
15120 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
15130 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
15140 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
15150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
15160 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
15170 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
15180 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
15190 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
151a0 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
151b0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
151c0 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c  che *p;..#if SQL
151d0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
151e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
151f0 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
15200 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
15210 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
15220 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
15230 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
15240 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
15250 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
15260 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
15270 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
15280 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
15290 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
152a0 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
152b0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
152c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
152d0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
152e0 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
152f0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
15300 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
15310 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
15320 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
15330 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
15340 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
15350 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
15360 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
15370 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
15380 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
15390 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
153a0 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
153b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
153c0 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
153d0 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
153e0 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
153f0 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
15400 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
15410 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
15420 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
15430 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
15440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
15450 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
15460 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
15470 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
15480 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
15490 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
154a0 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
154b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
154c0 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
154d0 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
154e0 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
154f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15500 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
15510 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a  iFrom, nReg);.}.
15520 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
15530 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
15540 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
15550 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
15560 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
15570 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
15580 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
15590 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
155a0 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
155b0 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
155c0 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
155d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
155e0 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
155f0 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
15600 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
15610 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
15620 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
15630 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
15640 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
15650 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
15660 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
15670 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
15680 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15690 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
156a0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
156b0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
156c0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
156d0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
156e0 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
156f0 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
15700 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
15710 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
15720 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
15730 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
15740 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
15750 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
15760 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a  RAGE_TEST */../*
15770 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65  .** Convert an e
15780 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
15790 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
157a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
157b0 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
157c0 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
157d0 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
157e0 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
157f0 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
15800 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
15810 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
15820 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
15830 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
15840 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
15850 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
15860 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
15870 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
15880 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
15890 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
158a0 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
158b0 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
158c0 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
158d0 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
158e0 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
158f0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
15900 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
15910 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
15920 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
15930 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
15940 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
15950 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
15960 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
15970 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
15980 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
15990 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
159a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
159b0 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
159c0 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
159d0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
159e0 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
159f0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
15a00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15a10 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
15a20 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
15a30 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
15a40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15a50 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
15a60 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
15a70 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
15a80 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
15a90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
15aa0 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
15ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
15ac0 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
15ad0 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
15ae0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
15af0 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
15b00 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
15b10 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
15b20 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
15b30 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
15b40 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
15b50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
15b60 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
15b70 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
15b80 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
15b90 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72  nt r1, r2, r3, r
15ba0 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  4;       /* Vari
15bb0 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
15bc0 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
15bd0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
15be0 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
15bf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
15c00 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c20 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
15c30 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20  ssion node */.. 
15c40 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
15c50 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
15c60 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
15c70 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
15c80 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
15c90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15ca0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
15cb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
15cc0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
15cd0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
15ce0 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
15cf0 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
15d00 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
15d10 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
15d20 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
15d30 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
15d40 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
15d50 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
15d60 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
15d70 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
15d80 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
15d90 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
15da0 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
15db0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15dc0 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
15dd0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
15de0 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  = pCol->iMem;.  
15df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
15e10 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
15e20 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
15e30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15e40 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
15e50 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
15e60 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
15e90 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
15ea0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
15eb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15ec0 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
15ed0 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
15ee0 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
15ef0 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
15f00 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
15f10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62  {.      int iTab
15f20 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
15f30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ;.      if( iTab
15f40 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
15f50 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  ( pParse->ckBase
15f60 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
15f70 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
15f80 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
15f90 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
15fa0 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
15fb0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52  */.          inR
15fc0 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
15fd0 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
15fe0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
15ff0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16010 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d  /* Deleting from
16020 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
16030 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
16040 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 61  ab = pParse->iPa
16050 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20 20 20  rtIdxTab;.      
16060 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16070 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
16080 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
16090 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
160a0 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
160d0 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
160e0 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b      pExpr->op2);
16110 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16120 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16130 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
16140 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
16150 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
16160 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16170 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
16180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
16190 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
161a0 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
161b0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
161c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
161d0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
161e0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
161f0 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
16200 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
16210 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16220 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
16230 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
16240 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
16250 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
16260 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
16270 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16280 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16290 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
162a0 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
162b0 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
162c0 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  en, 0);.      br
162d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
162e0 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
162f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
16310 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
16320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16330 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
16340 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
16350 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
16360 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
16370 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
16380 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
16390 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
163a0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
163b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
163c0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
163d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
163e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
163f0 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
16400 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
16410 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
16420 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
16430 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
16440 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
16450 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
16460 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
16470 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
16480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
16490 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
164a0 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
164b0 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
164c0 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
164d0 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
164e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
164f0 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
16500 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
16510 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
16520 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16530 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
16540 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
16550 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
16560 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
16570 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
16580 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
16590 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
165a0 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
165b0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
165c0 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
165d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
165e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
165f0 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
16600 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
16610 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
16620 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
16630 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16640 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
16650 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20  ken[0]=='?' .   
16660 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
16670 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
16680 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ken, pParse->azV
16690 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
166a0 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n-1])==0 );.    
166b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
166c0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
166d0 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
166e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20  pr->iColumn-1], 
166f0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
16700 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16710 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16720 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
16730 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
16740 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
16750 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16760 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
16770 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
16780 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
16790 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
167a0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
167b0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
167c0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
167d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
167e0 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
167f0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
16800 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
16810 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
16820 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
16830 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
16840 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
16850 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
16860 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
16870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
16880 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
16890 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
168a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
168b0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
168c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
168d0 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
168e0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
168f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16900 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
16910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16930 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
16940 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
16950 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16960 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
16970 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
16980 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
16990 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
169a0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
169b0 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
169c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
169d0 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
169e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
169f0 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
16a00 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
16a10 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
16a20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
16a30 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
16a40 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
16a50 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72  TK_EQ: {.      r
16a60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
16a70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16a80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
16a90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16aa0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
16ab0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16ac0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
16ad0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
16ae0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16af0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16b00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
16b10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
16b20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16b30 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
16b40 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61  TOREP2);.      a
16b50 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
16b60 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
16b70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
16b80 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16b90 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
16ba0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
16bb0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16bc0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
16bd0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16be0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
16bf0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
16c00 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16c10 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
16c20 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
16c30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16c40 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
16c50 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
16c60 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16c70 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
16c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
16c90 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
16ca0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
16cb0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
16cc0 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
16cd0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
16ce0 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
16cf0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
16d00 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16d10 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
16d20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16d30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
16d40 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16d50 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
16d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16d70 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
16d80 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
16d90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
16da0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
16db0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16dc0 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
16dd0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16de0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16df0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16e00 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16e10 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
16e20 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16e30 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16e40 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
16e50 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
16e60 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
16e70 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
16e80 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
16e90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16ea0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
16eb0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
16ec0 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
16ed0 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
16ee0 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e  OREP2 | SQLITE_N
16ef0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
16f00 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
16f10 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
16f20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16f30 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
16f40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16f50 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
16f60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16f70 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
16f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16f90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
16fa0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
16fb0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
16fc0 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
16fd0 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
16fe0 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
16ff0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
17000 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
17010 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
17020 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
17030 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
17040 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
17050 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
17060 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
17070 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17080 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
17090 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
170a0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
170b0 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
170c0 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
170d0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
170e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
170f0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
17100 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
17110 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
17120 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17130 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
17140 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
17150 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
17160 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
17170 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
17180 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17190 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
171a0 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
171b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
171c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
171d0 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
171e0 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
171f0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17200 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
17210 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
17220 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
17230 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17240 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
17250 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
17260 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
17270 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
17280 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
17290 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
172a0 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
172b0 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
172c0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
172d0 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
172e0 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
172f0 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
17300 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
17310 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
17320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17330 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
17340 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
17350 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
17360 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
17370 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17380 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
17390 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
173a0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
173b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
173c0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
173d0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
173e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
173f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17400 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
17410 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
17420 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17430 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
17440 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
17450 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
17460 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17470 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
17480 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
17490 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
174a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
174b0 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
174c0 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
174d0 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
174e0 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
174f0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
17500 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64  , target);.#ifnd
17510 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
17520 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
17530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
17540 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
17550 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
17560 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
17570 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17580 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
17590 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
175a0 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
175b0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65  , 1, target);.#e
175c0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
175d0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
175e0 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
175f0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
17600 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
17610 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
17620 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
17630 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
17640 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
17650 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
17660 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
17670 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
17680 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17690 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
176a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
176b0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
176c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
176d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
176e0 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
176f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
17700 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17710 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
17720 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
17730 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
17740 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17750 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
17760 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
17770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17780 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
17790 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
177a0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
177b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
177c0 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
177d0 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
177e0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
177f0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
17800 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17810 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17820 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
17830 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
17840 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
17850 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
17860 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
17870 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17880 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
17890 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
178a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
178b0 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
178c0 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
178d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
178e0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
178f0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
17900 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
17910 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
17920 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
17930 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
17940 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
17950 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
17960 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
17970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17980 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17990 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
179a0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
179b0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
179c0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
179d0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
179e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
179f0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
17a00 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
17a10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
17a20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
17a30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
17a40 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
17a50 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
17a60 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
17a70 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
17a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17a90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
17aa0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
17ab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17ac0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
17ad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17ae0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
17af0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
17b00 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
17b10 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
17b20 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
17b30 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
17b40 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
17b50 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17b60 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
17b70 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
17b80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17b90 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
17ba0 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
17bb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
17bc0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
17bd0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
17be0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
17bf0 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
17c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17c10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17c20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
17c30 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
17c40 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
17c50 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
17c60 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
17c70 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
17c80 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
17c90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
17ca0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
17cb0 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
17cc0 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
17cd0 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
17ce0 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
17cf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
17d00 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
17d10 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
17d20 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
17d30 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
17d40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
17d50 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
17d60 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
17d70 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
17d80 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
17d90 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
17da0 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
17db0 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
17dc0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17de0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
17df0 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
17e00 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
17e10 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
17e20 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
17e30 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
17e40 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
17e50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
17e60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
17e70 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
17e80 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
17e90 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17ea0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
17eb0 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
17ec0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17ed0 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
17ee0 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
17ef0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17f00 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
17f10 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
17f20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
17f30 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
17f40 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
17f50 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17f60 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17f70 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
17f80 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
17f90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
17fa0 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
17fb0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
17fc0 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
17fd0 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
17fe0 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64  ion(db, zId, nId
17ff0 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
18000 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
18010 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 75  ==0 || pDef->xFu
18020 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc==0 ){.       
18030 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18040 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
18050 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  n function: %.*s
18060 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
18070 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18080 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
18090 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
180a0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
180b0 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
180c0 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
180d0 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
180e0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
180f0 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
18100 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
18110 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
18120 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
18130 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
18140 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
18150 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
18160 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18170 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
18180 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
18190 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
181a0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
181b0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
181c0 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
181d0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
181e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
181f0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
18200 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
18210 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
18220 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
18230 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18250 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
18260 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
18270 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
18280 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
182a0 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
182b0 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
182c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
182d0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
182e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
182f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18300 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
18310 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
18320 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
18330 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18340 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
18350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18360 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18370 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
18380 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
18390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
183a0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
183b0 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
183c0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
183d0 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
183e0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
183f0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
18400 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
18410 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
18420 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
18430 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
18440 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
18450 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
18460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18470 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18480 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
18490 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
184a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
184b0 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
184c0 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
184d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
184e0 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
184f0 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
18500 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
18510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
18520 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
18530 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
18540 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
18550 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
18560 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
18570 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18580 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
18590 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
185a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
185b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
185c0 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
185d0 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
185e0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
185f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18600 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
18610 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
18620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
18630 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
18640 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
18650 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
18660 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
18670 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
18680 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18690 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
186a0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
186b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
186c0 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
186d0 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
186e0 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
186f0 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
18700 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
18710 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
18720 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
18730 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
18740 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
18750 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
18760 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
18770 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
18780 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
18790 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
187a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
187b0 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
187c0 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
187d0 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
187e0 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
187f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
18800 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
18810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
18820 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
18830 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
18840 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
18850 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
18860 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
18870 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
18880 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
18890 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
188a0 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
188b0 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
188c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
188d0 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
188e0 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
188f0 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
18900 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
18910 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
18920 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
18930 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
18940 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
18950 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
18960 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
18970 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
18980 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
18990 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
189a0 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
189b0 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
189c0 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
189d0 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
189e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
189f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
18a00 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18a10 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
18a20 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
18a30 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
18a40 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
18a50 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
18a60 70 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20 20  pFarg, r1,.     
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18a90 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
18aa0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
18ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18ac0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
18ad0 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
18ae0 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
18af0 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
18b00 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
18b10 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
18b20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
18b30 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
18b40 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
18b50 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
18b60 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
18b70 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
18b80 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
18b90 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
18ba0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
18bb0 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
18bc0 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
18bd0 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
18be0 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
18bf0 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
18c00 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
18c10 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
18c20 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
18c30 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
18c40 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
18c50 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
18c60 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
18c70 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
18c80 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
18c90 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
18ca0 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
18cb0 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
18cc0 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
18cd0 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
18ce0 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
18cf0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
18d00 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
18d10 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
18d20 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
18d30 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
18d40 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
18d50 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
18d60 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
18d70 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
18d80 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
18d90 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
18da0 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
18db0 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
18dc0 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
18dd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
18de0 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
18df0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
18e00 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
18e10 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
18e20 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
18e30 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
18e40 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
18e50 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
18e60 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
18e70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
18e80 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
18e90 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
18ea0 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
18eb0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
18ec0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
18ed0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
18ee0 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
18ef0 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
18f00 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
18f10 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
18f20 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
18f30 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
18f40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18f50 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
18f60 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
18f70 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
18f80 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
18f90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18fa0 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
18fb0 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
18fc0 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fe0 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
18ff0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
19000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19010 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
19020 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
19030 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
19040 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
19050 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19060 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
19070 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
19080 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
19090 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
190a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
190b0 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
190c0 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
190d0 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
190e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
190f0 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
19100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19110 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
19120 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
19130 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
19140 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
19150 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
19160 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19170 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
19180 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
19190 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
191a0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
191b0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
191c0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
191d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
191e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
191f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
19200 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
19210 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19220 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
19230 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
19240 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
19250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19260 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19270 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
19280 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19290 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
192a0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
192b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
192c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
192d0 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
192e0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
192f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19300 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
19310 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19320 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
19330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19340 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
19350 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
19360 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
19370 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
19380 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
19390 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
193a0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
193b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
193c0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
193d0 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
193e0 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
193f0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
19400 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
19410 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
19420 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
19430 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
19440 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
19450 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
19460 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
19470 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
19480 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19490 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
194a0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
194b0 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
194c0 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
194d0 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
194e0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
194f0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
19500 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
19510 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
19520 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19530 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
19540 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
19550 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
19560 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
19570 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19580 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
19590 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
195a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
195b0 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
195c0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
195d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
195e0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
195f0 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
19600 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
19610 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
19620 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
19630 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72  EP2);  VdbeCover
19640 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c  age(v);.      pL
19650 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
19660 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
19670 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
19680 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19690 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
196a0 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
196b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
196c0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
196d0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
196e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
196f0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
19700 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
19710 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
19720 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
19730 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
19740 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
19750 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
19760 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19770 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19780 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
19790 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
197a0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
197b0 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
197c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
197d0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
197e0 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
197f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19800 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
19810 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
19820 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
19830 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
19840 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
19850 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
19860 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19880 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
19890 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
198a0 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
198b0 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
198c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
198d0 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
198e0 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
198f0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
19900 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
19910 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
19920 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
19930 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
19940 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
19950 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
19960 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
19970 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
19980 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
19990 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
199a0 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
199b0 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
199c0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
199d0 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
199e0 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
199f0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
19a00 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
19a10 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
19a20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
19a30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
19a40 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
19a50 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
19a60 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
19a70 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
19a80 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
19a90 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
19aa0 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
19ab0 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
19ac0 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
19ad0 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
19ae0 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
19af0 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
19b00 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
19b10 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
19b20 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
19b30 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
19b40 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
19b50 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
19b60 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
19b70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
19b80 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
19b90 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
19ba0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
19bb0 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
19bc0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
19bd0 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
19be0 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
19bf0 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
19c00 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
19c10 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
19c20 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
19c30 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
19c40 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
19c50 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
19c60 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
19c70 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
19c80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19c90 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
19ca0 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
19cb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
19cc0 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
19cd0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
19ce0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19cf0 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
19d00 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
19d10 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
19d20 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
19d30 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
19d40 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
19d50 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
19d60 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
19d70 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
19d80 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
19d90 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
19da0 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
19db0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
19dc0 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
19dd0 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
19de0 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
19df0 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
19e00 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
19e10 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
19e20 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
19e30 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
19e40 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
19e50 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
19e60 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
19e70 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
19e80 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
19e90 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
19ea0 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
19eb0 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
19ec0 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
19ed0 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
19ee0 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
19ef0 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
19f00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19f10 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
19f20 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19f30 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19f40 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
19f50 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
19f60 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
19f70 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
19f80 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
19f90 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
19fa0 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
19fb0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
19fc0 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
19fd0 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
19fe0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
19ff0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1a000 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
1a010 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
1a020 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
1a030 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
1a040 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
1a050 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
1a060 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
1a070 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
1a080 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
1a090 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a   real..      **.
1a0a0 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
1a0b0 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37  E-OF: R-60985-57
1a0c0 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  662 SQLite will 
1a0d0 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
1a0e0 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20  e back to.      
1a0f0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
1a100 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  t when extractin
1a110 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65  g it from the re
1a120 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cord.  */.      
1a130 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1a140 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
1a150 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
1a160 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
1a170 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1a180 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
1a190 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a1a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
1a1b0 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
1a1c0 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
1a1d0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1a1e0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
1a1f0 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
1a200 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
1a210 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
1a220 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
1a230 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
1a240 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1a250 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1a260 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
1a270 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
1a280 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
1a290 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
1a2a0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
1a2b0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1a2c0 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
1a2d0 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
1a2e0 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
1a2f0 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
1a300 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
1a310 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
1a320 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
1a330 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
1a340 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
1a350 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
1a360 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
1a370 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
1a380 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
1a390 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1a3a0 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
1a3b0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
1a3c0 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
1a3d0 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1a3e0 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
1a3f0 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
1a400 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
1a410 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1a420 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
1a430 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
1a440 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
1a450 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
1a460 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
1a470 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
1a480 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
1a490 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
1a4a0 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
1a4b0 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
1a4c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1a4d0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
1a4e0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
1a4f0 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
1a500 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
1a510 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
1a520 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
1a530 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
1a540 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
1a550 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
1a560 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
1a570 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
1a580 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
1a590 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
1a5a0 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
1a5d0 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
1a5e0 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
1a5f0 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a610 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
1a620 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
1a630 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
1a640 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
1a670 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1a680 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1a6b0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
1a6c0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
1a6f0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1a700 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1a710 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
1a720 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
1a730 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
1a740 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
1a750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a760 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
1a770 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1a780 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
1a7b0 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a7c0 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
1a7d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a7e0 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
1a7f0 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
1a800 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
1a810 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
1a820 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
1a830 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a840 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
1a850 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1a860 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1a870 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
1a880 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
1a890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
1a8a0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1a8b0 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
1a8c0 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
1a8d0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1a8e0 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
1a8f0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
1a900 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
1a910 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
1a920 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
1a930 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a940 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
1a950 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
1a960 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
1a970 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
1a980 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
1a990 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
1a9a0 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
1a9b0 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c  ster(&tempX, sql
1a9c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a9d0 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
1a9e0 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
1a9f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1aa00 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1aa10 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
1aa20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
1aa30 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
1aa40 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
1aa50 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
1aa60 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
1aa70 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
1aa80 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
1aa90 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
1aaa0 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
1aab0 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
1aac0 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
1aad0 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
1aae0 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
1aaf0 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
1ab00 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
1ab10 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
1ab20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
1ab30 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
1ab40 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
1ab50 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
1ab60 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
1ab70 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
1ab80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1ab90 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
1aba0 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
1abb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1abc0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1abd0 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
1abe0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1abf0 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
1ac00 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
1ac10 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
1ac20 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
1ac30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ac40 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
1ac50 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
1ac60 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1ac70 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
1ac80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ac90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1aca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1acb0 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
1acc0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1acd0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1ace0 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
1acf0 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
1ad00 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1ad10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ad20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
1ad30 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1ad40 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
1ad50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1ad60 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
1ad70 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
1ad80 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1ad90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ada0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
1adb0 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
1adc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1add0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1ade0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1adf0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ae00 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
1ae10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1ae20 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
1ae30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ae40 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1ae50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1ae60 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1ae70 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
1ae80 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
1ae90 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1aea0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1aeb0 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1aec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1aee0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1aef0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1af00 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1af10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1af20 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
1af30 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
1af40 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
1af50 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
1af60 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
1af70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1af80 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
1af90 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1afa0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1afb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1afc0 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
1afd0 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
1afe0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
1aff0 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
1b000 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
1b010 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1b020 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
1b030 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
1b040 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
1b050 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
1b060 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b070 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
1b080 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
1b090 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
1b0a0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1b0b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b0c0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1b0e0 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
1b0f0 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
1b100 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
1b110 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1b120 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1b130 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
1b140 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1b150 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1b160 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1b170 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
1b180 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1b190 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1b1a0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1b1b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1b1c0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b1d0 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
1b1e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b1f0 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
1b200 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
1b210 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
1b220 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
1b230 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
1b240 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b250 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
1b260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b270 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1b280 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
1b290 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
1b2a0 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b2d0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1b2e0 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1b2f0 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
1b300 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1b310 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1b320 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b330 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1b340 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b350 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1b360 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
1b370 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
1b380 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
1b390 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
1b3a0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
1b3b0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1b3c0 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1b3d0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1b3e0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1b3f0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1b400 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1b410 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1b420 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1b430 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
1b440 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
1b450 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
1b460 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53  gDest,      /* S
1b470 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
1b480 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1b490 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65  */.  u8 reusable
1b4a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b4b0 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  f this expressio
1b4c0 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f  n is reusable */
1b4d0 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
1b4e0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
1b4f0 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1b500 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
1b510 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
1b520 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1b530 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
1b540 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
1b550 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
1b560 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1b570 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
1b580 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
1b590 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1b5a0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1b5b0 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
1b5c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
1b5d0 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
1b5e0 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65  gDest;.     pIte
1b5f0 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
1b600 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50  usable;.  }.  pP
1b610 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1b620 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = p;.}../*.** G
1b630 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b640 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
1b650 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
1b660 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1b670 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
1b680 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
1b690 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
1b6a0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
1b6b0 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
1b6c0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
1b6d0 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
1b6e0 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
1b6f0 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
1b700 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
1b710 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
1b720 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
1b730 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
1b740 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
1b750 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
1b760 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
1b770 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
1b780 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
1b790 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1b7a0 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
1b7b0 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
1b7c0 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
1b7d0 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
1b7e0 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
1b7f0 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
1b800 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
1b810 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
1b820 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
1b830 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
1b840 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b850 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
1b860 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1b870 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
1b880 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
1b890 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1b8a0 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
1b8b0 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
1b8c0 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
1b8d0 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
1b8e0 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
1b8f0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1b900 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
1b910 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  r).  ){.    Expr
1b920 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65  List *p = pParse
1b930 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1b940 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52    int i;.    *pR
1b950 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eg  = 0;.    if(
1b960 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75   p ){.      stru
1b970 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b980 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1b990 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
1b9a0 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
1b9b0 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
1b9c0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1b9d0 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
1b9e0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1b9f0 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  (pItem->pExpr,pE
1ba00 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
1ba10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1ba20 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1ba30 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  prReg;.        }
1ba40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ba50 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65     r2 = ++pParse
1ba60 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1ba70 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1ba80 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1ba90 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65   r2, 1);.  }else
1baa0 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
1bab0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1bac0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
1bad0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bae0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1baf0 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1bb00 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
1bb10 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
1bb20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bb30 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bb40 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bb50 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
1bb60 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1bb70 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
1bb80 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1bb90 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1bba0 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
1bbb0 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
1bbc0 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
1bbd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1bbe0 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1bbf0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1bc00 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
1bc10 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1bc20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bc30 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
1bc40 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1bc50 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1bc60 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
1bc70 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1bc80 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1bc90 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1bca0 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
1bcb0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
1bcc0 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
1bcd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1bce0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1bcf0 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
1bd00 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
1bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
1bd20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bd30 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1bd40 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1bd50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bd60 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
1bd70 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1bd80 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
1bd90 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1bda0 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
1bdb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bdc0 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1bdd0 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1bde0 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1bdf0 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
1be00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1be10 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1be20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
1be30 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
1be40 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1be50 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
1be60 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1be70 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
1be80 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
1be90 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1bea0 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
1beb0 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
1bec0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1bed0 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
1bee0 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
1bef0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
1bf00 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1bf10 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1bf20 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1bf30 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
1bf40 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1bf50 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1bf60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
1bf70 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
1bf80 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1bf90 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1bfa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1bfb0 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1bfc0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1bfd0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1bfe0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bff0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c000 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
1c010 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c020 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
1c030 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
1c040 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
1c050 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
1c060 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c070 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
1c080 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
1c090 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
1c0a0 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
1c0b0 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
1c0c0 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
1c0d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
1c0e0 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
1c0f0 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
1c100 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
1c110 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
1c120 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
1c130 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
1c140 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c150 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
1c160 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
1c170 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
1c180 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
1c190 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
1c1a0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
1c1b0 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
1c1c0 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
1c1d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c1e0 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
1c1f0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c200 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1c210 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1c220 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c230 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
1c240 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1c250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1c260 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
1c270 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
1c280 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1c290 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1c2a0 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
1c2b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1c2c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c2d0 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
1c2e0 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
1c2f0 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
1c300 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 64 65   iMem);.}..#ifde
1c310 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1c320 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1c330 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
1c340 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  xplanation of an
1c350 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1c360 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c370 33 54 72 65 65 56 69 65 77 45 78 70 72 28 54 72  3TreeViewExpr(Tr
1c380 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63  eeView *pView, c
1c390 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
1c3a0 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f  , u8 moreToFollo
1c3b0 77 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  w){.  const char
1c3c0 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
1c3d0 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
1c3e0 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
1c3f0 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
1c400 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
1c410 74 6f 72 20 2a 2f 0a 20 20 70 56 69 65 77 20 3d  tor */.  pView =
1c420 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c430 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65  Push(pView, more
1c440 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28  ToFollow);.  if(
1c450 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1c460 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c470 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c  Line(pView, "nil
1c480 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ");.    sqlite3T
1c490 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1c4a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c4b0 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
1c4c0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1c4d0 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1c4e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c4f0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c500 69 65 77 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d  iew, "AGG{%d:%d}
1c510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
1c520 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
1c530 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1c540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c550 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
1c560 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
1c570 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
1c580 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1c590 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1c5a0 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
1c5b0 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
1c5c0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1c5d0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c5e0 56 69 65 77 2c 20 22 43 4f 4c 55 4d 4e 28 25 64  View, "COLUMN(%d
1c5f0 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  )", pExpr->iColu
1c600 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
1c610 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c620 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c630 69 65 77 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a  iew, "{%d:%d}",.
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1c660 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
1c670 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1c680 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1c690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c6a0 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
1c6b0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1c6c0 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1c6d0 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1c6e0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1c6f0 6e 65 28 70 56 69 65 77 2c 20 22 25 64 22 2c 20  ne(pView, "%d", 
1c700 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
1c710 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1c730 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c740 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75  , "%s", pExpr->u
1c750 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1c760 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1c770 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c780 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1c790 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1c7a0 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1c7b0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1c7c0 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 73  ewLine(pView,"%s
1c7d0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1c7e0 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1c7f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c800 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1c810 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
1c820 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c830 56 69 65 77 2c 22 25 51 22 2c 20 70 45 78 70 72  View,"%Q", pExpr
1c840 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1c850 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c860 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1c870 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c880 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c890 69 65 77 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  iew,"NULL");.   
1c8a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c8b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c8c0 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1c8d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1c8e0 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
1c8f0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c900 56 69 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72  View,"%s", pExpr
1c910 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1c920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c930 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1c940 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1c950 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1c960 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
1c970 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22  VARIABLE(%s,%d)"
1c980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c990 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1c9a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78  r->u.zToken, pEx
1c9b0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1c9c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c9d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1c9e0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
1c9f0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1ca00 6e 65 28 70 56 69 65 77 2c 22 52 45 47 49 53 54  ne(pView,"REGIST
1ca10 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  ER(%d)", pExpr->
1ca20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
1ca30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ca40 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
1ca50 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1ca60 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 41  iewLine(pView,"A
1ca70 53 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  S %Q", pExpr->u.
1ca80 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
1ca90 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1caa0 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1cab0 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
1cac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cad0 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
1cae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1caf0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1cb00 2c 22 49 44 20 25 51 22 2c 20 70 45 78 70 72 2d  ,"ID %Q", pExpr-
1cb10 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1cb20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1cb30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cb40 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1cb50 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1cb60 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1cb70 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1cb80 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1cb90 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  ken) */.      sq
1cba0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1cbb0 65 28 70 56 69 65 77 2c 22 43 41 53 54 20 25 51  e(pView,"CAST %Q
1cbc0 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1cbd0 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
1cbe0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1cbf0 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
1cc00 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ft, 0);.      br
1cc10 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1cc20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1cc30 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1cc40 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42  e TK_LT:      zB
1cc50 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20  inOp = "LT";    
1cc60 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cc70 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69   TK_LE:      zBi
1cc80 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  nOp = "LE";     
1cc90 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cca0 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
1ccb0 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62  Op = "GT";     b
1ccc0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1ccd0 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GE:      zBinO
1cce0 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72  p = "GE";     br
1ccf0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1cd00 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _NE:      zBinOp
1cd10 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65   = "NE";     bre
1cd20 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1cd30 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  EQ:      zBinOp 
1cd40 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61  = "EQ";     brea
1cd50 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1cd60 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
1cd70 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b   "IS";     break
1cd80 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1cd90 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NOT:   zBinOp = 
1cda0 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  "ISNOT";  break;
1cdb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1cdc0 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1cdd0 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  AND";    break;.
1cde0 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1cdf0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f       zBinOp = "O
1ce00 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  R";     break;. 
1ce10 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1ce20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44      zBinOp = "AD
1ce30 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1ce40 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
1ce50 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c     zBinOp = "MUL
1ce60 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1ce70 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
1ce80 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22    zBinOp = "SUB"
1ce90 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1cea0 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
1ceb0 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b   zBinOp = "REM";
1cec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1ced0 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
1cee0 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44  zBinOp = "BITAND
1cef0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1cf00 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
1cf10 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b  BinOp = "BITOR";
1cf20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cf30 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42  e TK_SLASH:   zB
1cf40 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20  inOp = "DIV";   
1cf50 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cf60 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69   TK_LSHIFT:  zBi
1cf70 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  nOp = "LSHIFT"; 
1cf80 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cf90 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
1cfa0 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62  Op = "RSHIFT"; b
1cfb0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1cfc0 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f  K_CONCAT:  zBinO
1cfd0 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72  p = "CONCAT"; br
1cfe0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1cff0 5f 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _DOT:     zBinOp
1d000 20 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72 65   = "DOT";    bre
1d010 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1d020 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70  _UMINUS:  zUniOp
1d030 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65   = "UMINUS"; bre
1d040 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d050 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20  UPLUS:   zUniOp 
1d060 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61  = "UPLUS";  brea
1d070 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1d080 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d  ITNOT:  zUniOp =
1d090 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b   "BITNOT"; break
1d0a0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1d0b0 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20  T:     zUniOp = 
1d0c0 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b  "NOT";    break;
1d0d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1d0e0 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  ULL:  zUniOp = "
1d0f0 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  ISNULL"; break;.
1d100 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1d110 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e  ULL: zUniOp = "N
1d120 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
1d130 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d140 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  LATE: {.      sq
1d150 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d160 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 4c 41 54  e(pView, "COLLAT
1d170 45 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  E %Q", pExpr->u.
1d180 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
1d190 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d1a0 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1d1b0 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
1d1c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d1d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1d1e0 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
1d1f0 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1d200 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1d210 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1d220 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1d230 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1d240 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1d250 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d260 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
1d270 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d280 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1d290 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d2a0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d2b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d2c0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1d2d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1d2e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d2f0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d300 69 65 77 2c 20 22 41 47 47 5f 46 55 4e 43 54 49  iew, "AGG_FUNCTI
1d310 4f 4e 25 64 20 25 51 22 2c 0a 20 20 20 20 20 20  ON%d %Q",.      
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1d340 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  2, pExpr->u.zTok
1d350 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
1d360 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d370 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d380 69 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e 20 25  iew, "FUNCTION %
1d390 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1d3a0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1d3b0 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1d3c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d3d0 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1d3e0 28 70 56 69 65 77 2c 20 70 46 61 72 67 2c 20 30  (pView, pFarg, 0
1d3f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d400 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d420 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1d430 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
1d440 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d450 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d460 69 65 77 2c 20 22 45 58 49 53 54 53 2d 65 78 70  iew, "EXISTS-exp
1d470 72 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r");.      sqlit
1d480 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d490 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d4a0 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d4b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d4c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
1d4d0 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
1d4e0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1d4f0 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54 2d  (pView, "SELECT-
1d500 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 73 71  expr");.      sq
1d510 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
1d520 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70 72  ect(pView, pExpr
1d530 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ->x.pSelect, 0);
1d540 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d550 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d560 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
1d570 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1d580 70 56 69 65 77 2c 20 22 49 4e 22 29 3b 0a 20 20  pView, "IN");.  
1d590 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d5a0 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
1d5b0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b  Expr->pLeft, 1);
1d5c0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1d5d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d5e0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d5f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d600 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d610 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d620 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d640 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d650 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
1d660 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1d670 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
1d680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d690 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d6a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d6b0 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1d6c0 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1d6d0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1d6e0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1d6f0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1d700 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1d710 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1d720 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1d730 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1d740 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1d750 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1d760 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1d770 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1d780 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1d790 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1d7a0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1d7b0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1d7c0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1d7d0 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1d7e0 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1d7f0 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1d800 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1d810 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1d820 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d830 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1d840 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d850 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1d860 22 42 45 54 57 45 45 4e 22 29 3b 0a 20 20 20 20  "BETWEEN");.    
1d870 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d880 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 58 2c  wExpr(pView, pX,
1d890 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1d8a0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1d8b0 56 69 65 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20  View, pY, 1);.  
1d8c0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d8d0 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
1d8e0 5a 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  Z, 0);.      bre
1d8f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d900 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1d910 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1d920 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1d930 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1d940 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1d950 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1d960 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1d970 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1d980 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1d990 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1d9a0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1d9b0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1d9c0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1d9d0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1d9e0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1d9f0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1da00 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1da10 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1da20 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1da30 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1da40 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1da50 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1da60 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1da70 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1da80 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1da90 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1daa0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
1dab0 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1dac0 77 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20  w, "%s(%d)", .  
1dad0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1dae0 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20  Table ? "NEW" : 
1daf0 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43  "OLD", pExpr->iC
1db00 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
1db10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1db20 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
1db30 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1db40 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1db50 22 43 41 53 45 22 29 3b 0a 20 20 20 20 20 20 73  "CASE");.      s
1db60 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1db70 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1db80 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20  >pLeft, 1);.    
1db90 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1dba0 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
1dbb0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1dbc0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
1dbd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1dbe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1dbf0 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1dc00 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1dc10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1dc20 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  ype = "unk";.   
1dc30 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
1dc40 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ->affinity ){.  
1dc50 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
1dc60 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20  llback:   zType 
1dc70 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62  = "rollback";  b
1dc80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1dc90 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20  se OE_Abort:    
1dca0 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74    zType = "abort
1dcb0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1dcc0 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61        case OE_Fa
1dcd0 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20  il:       zType 
1dce0 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62  = "fail";      b
1dcf0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1dd00 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20  se OE_Ignore:   
1dd10 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72    zType = "ignor
1dd20 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
1dd30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1dd40 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1dd50 70 56 69 65 77 2c 20 22 52 41 49 53 45 20 25 73  pView, "RAISE %s
1dd60 28 25 51 29 22 2c 20 7a 54 79 70 65 2c 20 70 45  (%Q)", zType, pE
1dd70 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1dd80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
1dda0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
1ddb0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1ddc0 6e 65 28 70 56 69 65 77 2c 20 22 6f 70 3d 25 64  ne(pView, "op=%d
1ddd0 22 2c 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20  ", pExpr->op);. 
1dde0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ddf0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e  }.  }.  if( zBin
1de00 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1de10 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1de20 69 65 77 2c 20 22 25 73 22 2c 20 7a 42 69 6e 4f  iew, "%s", zBinO
1de30 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  p);.    sqlite3T
1de40 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1de50 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
1de60 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1de70 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
1de80 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ew, pExpr->pRigh
1de90 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  t, 0);.  }else i
1dea0 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20  f( zUniOp ){.   
1deb0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1dec0 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22  Line(pView, "%s"
1ded0 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73  , zUniOp);.    s
1dee0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1def0 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1df00 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 7d 0a  >pLeft, 0);.  }.
1df10 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1df20 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23  wPop(pView);.}.#
1df30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1df40 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
1df50 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1df60 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1df70 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1df80 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1df90 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1dfa0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1dfb0 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1dfc0 28 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70 56  (.  TreeView *pV
1dfd0 69 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70  iew,.  const Exp
1dfe0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20  rList *pList,.  
1dff0 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c  u8 moreToFollow,
1e000 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e010 4c 61 62 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 69  Label.){.  int i
1e020 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69  ;.  pView = sqli
1e030 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
1e040 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c  pView, moreToFol
1e050 6c 6f 77 29 3b 0a 20 20 69 66 28 20 7a 4c 61 62  low);.  if( zLab
1e060 65 6c 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b  el==0 || zLabel[
1e070 30 5d 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20 3d  0]==0 ) zLabel =
1e080 20 22 4c 49 53 54 22 3b 0a 20 20 69 66 28 20 70   "LIST";.  if( p
1e090 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  List==0 ){.    s
1e0a0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1e0b0 6e 65 28 70 56 69 65 77 2c 20 22 25 73 20 28 65  ne(pView, "%s (e
1e0c0 6d 70 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29 3b  mpty)", zLabel);
1e0d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1e0e0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1e0f0 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 7a  e(pView, "%s", z
1e100 4c 61 62 65 6c 29 3b 0a 20 20 20 20 66 6f 72 28  Label);.    for(
1e110 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1e120 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1e130 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1e140 45 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69 73  Expr(pView, pLis
1e150 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1e160 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
1e170 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 69 66 28  ;.#if 0.     if(
1e180 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1e190 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1e1a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1e1b0 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25 73  tf(pOut, " AS %s
1e1c0 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
1e1d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1e1e0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1e1f0 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62 20  a[i].bSpanIsTab 
1e200 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e210 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1e220 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20 70  pOut, " (%s)", p
1e230 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1e240 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1e250 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  f.    }.  }.  sq
1e260 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1e270 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69  (pView);.}.#endi
1e280 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1e290 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  G */../*.** Gene
1e2a0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
1e2b0 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
1e2c0 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1e2d0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
1e2e0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1e2f0 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
1e300 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
1e310 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
1e320 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
1e330 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1e340 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
1e350 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1e360 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
1e370 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
1e380 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
1e390 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
1e3a0 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
1e3b0 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
1e3c0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
1e3d0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1e3e0 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
1e3f0 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
1e400 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
1e410 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
1e420 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
1e430 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69  ation code..*/.i
1e440 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1e450 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1e460 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1e470 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1e480 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1e490 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1e4a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1e4b0 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1e4c0 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1e4d0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1e4e0 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1e4f0 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
1e500 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1e510 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
1e520 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
1e530 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1e540 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
1e550 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
1e560 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1e570 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
1e580 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
1e590 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1e5a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1e5b0 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1e5c0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1e5d0 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1e5e0 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1e5f0 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1e600 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1e610 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
1e620 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1e630 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1e640 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
1e650 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1e660 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
1e670 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1e680 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1e690 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
1e6a0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1e6b0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1e6c0 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
1e6d0 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1e6e0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
1e6f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1e700 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1e710 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
1e720 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e730 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
1e740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1e750 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1e760 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
1e770 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1e780 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1e790 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
1e7a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
1e7b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1e7c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1e7d0 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
1e7e0 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
1e7f0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1e800 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
1e810 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1e820 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
1e830 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
1e840 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1e850 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
1e860 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
1e870 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1e880 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
1e890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1e8a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e8b0 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
1e8c0 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1e8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e8e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e8f0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1e900 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1e910 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1e920 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1e930 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1e940 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1e950 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1e960 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1e970 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1e980 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1e990 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1e9a0 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1e9b0 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1e9c0 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
1e9d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1e9e0 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
1e9f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ea00 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1ea10 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1ea20 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1ea30 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1ea40 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
1ea50 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1ea60 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
1ea70 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1ea80 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  if the jump is t
1ea90 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  aken */.  int ju
1eaa0 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54  mpIfTrue,   /* T
1eab0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1eac0 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74  the BETWEEN is t
1ead0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  rue */.  int jum
1eae0 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
1eaf0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1eb00 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
1eb10 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  LL */.){.  Expr 
1eb20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20  exprAnd;     /* 
1eb30 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
1eb40 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c   in  x>=y AND x<
1eb50 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  =z  */.  Expr co
1eb60 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68  mpLeft;    /* Th
1eb70 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f  e  x>=y  term */
1eb80 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68  .  Expr compRigh
1eb90 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d  t;   /* The  x<=
1eba0 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  z  term */.  Exp
1ebb0 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f  r exprX;       /
1ebc0 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70  * The  x  subexp
1ebd0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1ebe0 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f   regFree1 = 0; /
1ebf0 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
1ec00 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61  register */..  a
1ec10 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1ec20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ec30 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1ec40 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
1ec50 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
1ec60 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
1ec70 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
1ec80 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
1ec90 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
1eca0 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
1ecb0 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
1ecc0 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
1ecd0 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1ece0 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
1ecf0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1ed00 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1ed10 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
1ed20 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
1ed30 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1ed40 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
1ed50 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1ed60 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1ed70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
1ed80 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69  ter(&exprX, sqli
1ed90 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1eda0 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1edb0 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
1edc0 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1edd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ede0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1edf0 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1ee00 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1ee10 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1ee20 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1ee30 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1ee40 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1ee50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1ee60 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1ee70 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1ee80 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1ee90 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1eea0 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1eeb0 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1eec0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1eed0 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1eee0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1eef0 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1ef00 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1ef10 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b  & regFree1!=0 );
1ef20 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1ef30 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1ef40 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1ef50 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ef60 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1ef70 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1ef80 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1ef90 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73  ree1!=0 );.  tes
1efa0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1efb0 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1efc0 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1efd0 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1efe0 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1eff0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1f000 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1f010 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1f020 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1f030 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1f040 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1f050 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1f060 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1f070 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1f080 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1f090 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1f0a0 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1f0b0 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1f0c0 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1f0d0 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1f0e0 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1f0f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1f100 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1f110 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1f120 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1f130 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1f140 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1f150 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1f160 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1f170 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1f180 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1f190 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1f1a0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1f1b0 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1f1c0 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1f1d0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1f1e0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1f1f0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1f200 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1f210 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1f220 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1f230 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1f240 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1f250 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1f260 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1f270 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1f280 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1f290 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1f2a0 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1f2b0 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1f2c0 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1f2d0 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1f2e0 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1f2f0 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1f300 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1f310 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1f320 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1f330 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1f340 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1f350 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f360 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1f370 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1f380 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1f390 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1f3a0 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1f3b0 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1f3c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1f3d0 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1f3e0 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1f3f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1f400 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1f410 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1f420 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1f430 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1f440 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
1f450 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1f460 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1f470 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1f480 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1f490 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1f4a0 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1f4b0 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1f4c0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1f4d0 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1f4e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1f4f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f500 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f510 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f520 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f530 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f540 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1f550 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
1f560 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1f570 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f580 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f590 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f5a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f5b0 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1f5c0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1f5d0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f5e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f5f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f600 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1f610 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f620 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f630 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f640 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1f650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f660 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f680 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1f690 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1f6a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f6b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f6c0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f6d0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1f6e0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1f6f0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f700 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1f710 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f720 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f730 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f740 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f750 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1f760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f770 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f790 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f7a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f7b0 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f7c0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f7d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f7e0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1f7f0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1f800 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1f810 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1f820 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1f830 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1f840 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f850 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f860 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f870 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f880 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f890 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f8a0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f8b0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f8c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f8d0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f8e0 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f8f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f900 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f910 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f920 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f930 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f940 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
1f950 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f960 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f970 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1f980 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1f990 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f9a0 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1f9b0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1f9c0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1f9d0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1f9e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1f9f0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1fa00 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1fa10 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1fa20 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1fa30 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1fa40 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1fa50 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1fa60 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fa70 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1fa80 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1fa90 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1faa0 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1fab0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1fac0 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1fad0 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1fae0 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1faf0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1fb00 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1fb10 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ne);.      t
1fb20 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fb30 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fb40 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fb50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fb60 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fb70 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1fb80 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1fb90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fba0 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1fbb0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fbc0 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1fbd0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fbe0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fbf0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fc00 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fc10 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1fc20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fc30 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1fc40 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1fc50 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1fc60 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1fc70 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
1fc80 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1fc90 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1fca0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1fcb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fcc0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1fcd0 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
1fce0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fcf0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1fd00 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
1fd10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1fd20 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
1fd30 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fd40 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1fd50 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fd60 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1fd70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fd80 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1fd90 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1fda0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
1fdb0 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1fdc0 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1fdd0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1fde0 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1fdf0 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1fe00 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1fe10 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fe20 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1fe30 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fe40 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fe50 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fe60 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fe70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1fe80 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1fe90 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
1fea0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1feb0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1fec0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1fed0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1fee0 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
1fef0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ff00 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1ff10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ff20 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1ff30 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1ff40 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ff50 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1ff60 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1ff70 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c   pExpr, dest, 1,
1ff80 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ff90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ffa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ffb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1ffc0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
1ffd0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1ffe0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
1fff0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20000 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
20010 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
20020 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
20030 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
20040 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
20050 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
20060 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
20070 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
20080 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20090 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
200a0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
200b0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
200c0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
200d0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
200e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
200f0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
20100 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
20110 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
20120 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
20140 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
20150 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
20160 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
20170 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
20180 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f       /* No-op */
20190 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
201a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
201b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
201c0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
201d0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
201e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
201f0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
20200 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20210 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
20220 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20230 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20240 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
20250 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20260 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20270 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
20280 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20290 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
202a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
202b0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
202c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
202d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
202e0 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
202f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20300 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
20310 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
20320 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
20330 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
20340 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
20350 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
20360 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
20370 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
20380 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
20390 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
203a0 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
203b0 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
203c0 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
203d0 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
203e0 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
203f0 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
20400 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
20410 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
20420 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
20430 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
20440 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
20450 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20460 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
20470 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
20480 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
20490 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
204a0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
204b0 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
204c0 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
204d0 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
204e0 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
204f0 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
20500 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
20510 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
20520 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
20530 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
20540 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
20550 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
20560 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
20570 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
20580 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
20590 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
205a0 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
205b0 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
205c0 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
205d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
205e0 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
205f0 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
20600 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
20610 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
20620 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
20630 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
20640 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
20650 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
20660 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
20670 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
20680 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
20690 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
206a0 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
206b0 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
206c0 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
206d0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
206e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
20700 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
20710 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
20720 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
20730 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
20740 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
20750 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
20760 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
20770 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
20780 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
20790 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
207a0 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
207b0 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
207c0 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
207d0 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
207e0 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
207f0 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
20800 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
20810 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
20820 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
20830 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
20840 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
20850 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
20860 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
20870 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
20880 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
20890 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
208a0 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
208b0 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
208c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
208d0 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
208e0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
208f0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
20900 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
20910 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
20920 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
20930 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
20940 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
20950 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
20960 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
20970 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
20980 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20990 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
209a0 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
209b0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
209c0 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
209d0 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
209e0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
209f0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
20a00 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20a10 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
20a20 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
20a30 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
20a40 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
20a50 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
20a60 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20a70 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
20a80 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
20a90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20aa0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
20ab0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20ac0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20ad0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
20ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
20af0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
20b00 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
20b10 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
20b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20b30 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20b40 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
20b50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20b60 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
20b70 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
20b80 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20ba0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20bb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20bc0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
20bd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20be0 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
20bf0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
20c00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20c10 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
20c20 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
20c30 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20c40 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20c50 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
20c60 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20c70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
20c80 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
20c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20ca0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20cb0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20cc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20cd0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
20ce0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
20cf0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
20d00 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
20d10 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
20d20 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
20d30 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20d50 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
20d60 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
20d70 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
20d80 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
20d90 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
20da0 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
20db0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20dc0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
20dd0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20de0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20df0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20e00 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20e10 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
20e20 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20e30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20e40 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
20e50 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
20e60 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
20e70 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
20e80 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
20eb0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
20ec0 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
20ed0 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
20ee0 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
20ef0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
20f00 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
20f10 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
20f20 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
20f30 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
20f40 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
20f50 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
20f60 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
20f70 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
20f80 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
20f90 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
20fa0 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
20fb0 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
20fc0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
20fd0 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
20fe0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
20ff0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
21000 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
21010 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
21020 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
21030 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
21040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
21050 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
21060 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
21070 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
21080 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
21090 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
210a0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
210b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
210c0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
210d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
210e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
210f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
21100 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
21110 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
21120 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
21130 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
21140 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
21150 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
21160 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
21170 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21180 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
21190 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
211a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
211b0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
211c0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
211d0 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
211e0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
211f0 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
21200 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  Q;.      codeCom
21210 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
21220 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
21230 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21250 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
21260 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
21270 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21280 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
21290 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
212a0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
212b0 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
212c0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
212d0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
212e0 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
212f0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21300 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21310 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
21320 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
21330 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
21340 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
21350 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21360 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
21370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
21390 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
213a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
213b0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20  =TK_ISNULL );   
213c0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
213d0 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
213e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
213f0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
21400 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
21410 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
21420 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
21430 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
21440 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
21450 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21460 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
21470 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21480 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
21490 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
214a0 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
214b0 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20  pExpr, dest, 0, 
214c0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
214d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
214e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
214f0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
21500 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
21510 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
21520 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
21530 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
21540 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
21550 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
21560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21570 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
21580 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21590 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
215a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
215b0 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
215c0 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
215d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
215e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
215f0 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
21600 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
21610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21620 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
21630 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
21640 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
21650 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
21660 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21670 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
21680 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
21690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
216a0 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
216b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
216c0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
216d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
216e0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
216f0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
21700 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
21710 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21720 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21730 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
21740 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
21750 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
21760 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
21770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
21780 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
21790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
217a0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
217b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
217c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
217d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
217e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
217f0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
21800 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21810 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
21820 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
21830 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
21840 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
21850 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
21860 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
21870 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
21880 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
21890 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
218a0 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
218b0 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
218c0 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
218d0 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
218e0 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
218f0 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
21900 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
21910 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
21920 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
21930 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
21940 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
21950 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
21960 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
21970 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
21980 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
21990 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
219a0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
219b0 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
219c0 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
219d0 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
219e0 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
219f0 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
21a00 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
21a10 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
21a20 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
21a30 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
21a40 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
21a50 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
21a60 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
21a70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
21a80 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
21a90 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
21aa0 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
21ab0 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
21ac0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
21ad0 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
21ae0 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
21af0 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
21b00 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
21b10 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
21b20 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
21b30 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
21b40 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
21b50 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
21b60 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
21b70 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
21b80 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
21b90 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
21ba0 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
21bb0 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
21bc0 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
21bd0 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
21be0 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
21bf0 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
21c00 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
21c10 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
21c20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
21c30 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
21c40 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
21c50 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
21c60 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
21c70 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
21c80 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
21c90 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
21ca0 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
21cb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
21cc0 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
21cd0 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
21ce0 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
21cf0 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
21d00 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
21d10 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21d20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
21d30 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
21d40 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
21d50 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
21d60 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
21d70 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
21d80 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
21d90 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
21da0 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
21db0 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
21dc0 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
21dd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21de0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
21df0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
21e00 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
21e10 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
21e20 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
21e30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
21e40 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20  (pA->pLeft, pB, 
21e50 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
21e60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
21e70 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
21e80 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
21e90 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21ea0 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  e(pA, pB->pLeft,
21eb0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
21ec0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21ed0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
21ee0 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
21ef0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  !=TK_COLUMN && A
21f00 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b  LWAYS(pA->op!=TK
21f10 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
21f20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
21f30 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
21f40 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
21f50 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
21f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
21f70 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
21f80 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
21f90 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
21fa0 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
21fb0 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
21fc0 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
21fd0 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
21fe0 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
21ff0 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
22000 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
22010 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
22020 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
22030 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
22040 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22050 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
22060 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
22070 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
22080 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
22090 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
220a0 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
220b0 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
220c0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
220d0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
220e0 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
220f0 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
22100 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
22110 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
22120 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
22130 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29   EP_Reduced)==0)
22140 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
22150 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
22160 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
22170 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
22180 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
22190 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
221a0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
221b0 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
221c0 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
221d0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
221e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
221f0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
22200 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
22210 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
22220 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
22230 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
22240 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
22250 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
22260 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
22270 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
22280 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
22290 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
222a0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
222b0 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
222c0 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
222d0 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
222e0 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
222f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
22300 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
22310 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
22320 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
22330 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
22340 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
22350 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
22360 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
22370 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
22380 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
22390 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
223a0 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
223b0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
223c0 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
223d0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
223e0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
223f0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
22400 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
22410 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
22420 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
22430 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
22440 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
22450 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
22460 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
22470 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
22480 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
22490 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
224a0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
224b0 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
224c0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
224d0 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
224e0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
224f0 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
22500 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
22510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
22520 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
22530 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
22540 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
22550 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
22560 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
22570 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
22580 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
22590 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
225a0 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
225b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
225c0 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
225d0 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29   pExprB, iTab) )
225e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
225f0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22600 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
22610 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
22620 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
22630 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
22640 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
22650 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
22660 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
22670 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
22680 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
22690 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
226a0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
226b0 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
226c0 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
226d0 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
226e0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
226f0 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
22700 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
22710 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
22720 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
22730 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
22740 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
22750 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
22760 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
22770 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
22780 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
22790 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
227a0 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
227b0 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
227c0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
227d0 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
227e0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
227f0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
22800 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
22810 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
22820 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
22830 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
22840 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
22850 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
22860 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
22870 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
22880 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
22890 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
228a0 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
228b0 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
228c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
228d0 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
228e0 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
228f0 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
22900 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
22910 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
22920 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
22930 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
22940 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
22950 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
22960 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
22970 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
22980 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
22990 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
229a0 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
229b0 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
229c0 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
229d0 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
229e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
229f0 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
22a00 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
22a10 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
22a20 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
22a30 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
22a40 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
22a50 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
22a60 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
22a70 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
22a80 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
22a90 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
22aa0 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
22ab0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
22ac0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
22ad0 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c  OTNULL.   && sql
22ae0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
22af0 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d  pE1->pLeft, pE2-
22b00 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
22b10 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21  .   && (pE1->op!
22b20 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
22b30 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20  1->op!=TK_IS).  
22b40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
22b50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
22b70 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
22b80 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
22b90 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
22ba0 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
22bb0 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
22bc0 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
22bd0 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
22be0 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
22bf0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22c00 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
22c10 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
22c20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
22c30 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
22c40 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
22c50 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
22c60 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
22c70 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
22c80 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
22c90 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
22ca0 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
22cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
22cc0 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
22cd0 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
22ce0 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
22cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22d00 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
22d10 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
22d20 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
22d30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
22d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
22d50 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
22d60 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
22d70 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
22d80 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22d90 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
22da0 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
22db0 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
22dc0 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
22dd0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
22de0 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
22df0 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
22e00 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
22e10 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22e20 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
22e30 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
22e40 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
22e50 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
22e60 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
22e70 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
22e80 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
22e90 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
22ea0 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
22eb0 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
22ec0 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
22ed0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
22ee0 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
22ef0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
22f00 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
22f10 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
22f20 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
22f30 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
22f40 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
22f50 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
22f60 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
22f70 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
22f80 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
22f90 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
22fa0 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
22fb0 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
22fc0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
22fd0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
22fe0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
22ff0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23000 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
23010 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
23020 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23030 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
23040 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23050 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23060 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
23070 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
23080 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
23090 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
230a0 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
230b0 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
230c0 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
230d0 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
230e0 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
230f0 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
23100 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
23110 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
23120 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
23130 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
23140 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
23150 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
23160 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
23170 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
23180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23190 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
231a0 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
231b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
231c0 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
231d0 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
231e0 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
231f0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
23200 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
23210 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
23220 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
23230 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
23240 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
23250 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
23260 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
23270 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
23280 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
23290 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
232a0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
232b0 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
232c0 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
232d0 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
232e0 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
232f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
23300 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
23310 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
23320 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
23330 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
23340 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
23350 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
23360 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
23370 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
23380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
23390 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
233a0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
233b0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
233c0 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
233d0 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
233e0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
233f0 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
23400 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
23410 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
23420 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
23430 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
23440 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
23450 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
23460 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
23470 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
23480 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
23490 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
234a0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
234b0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
234c0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
234d0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
234e0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
234f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
23500 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
23510 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
23520 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
23530 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
23540 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
23550 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
23560 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
23570 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
23580 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
23590 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
235a0 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
235b0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
235c0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
235d0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
235e0 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
235f0 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
23600 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
23610 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
23620 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
23630 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
23640 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
23650 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23660 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
23670 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
23680 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
23690 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
236a0 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
236b0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
236c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
236d0 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
236e0 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
236f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
23700 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
23710 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
23720 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
23730 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
23740 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
23750 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
23760 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
23770 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
23780 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
23790 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
237a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
237b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
237c0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
237d0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
237e0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
237f0 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
23800 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
23810 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
23820 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
23830 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
23840 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
23850 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
23860 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
23870 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
23880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
23890 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
238a0 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
238b0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
238c0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
238d0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
238e0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
238f0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
23900 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
23910 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23920 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23930 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
23940 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
23950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23960 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
23970 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
23980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
23990 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
239a0 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
239b0 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
239c0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
239d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
239e0 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
239f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23a00 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
23a10 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
23a20 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
23a30 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
23a40 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
23a50 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
23a60 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
23a70 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
23a80 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
23a90 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
23aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23ab0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
23ac0 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
23ad0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
23ae0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
23af0 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
23b00 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
23b10 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
23b20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
23b30 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
23b40 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
23b50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
23b60 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
23b70 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
23b80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23bb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23bc0 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
23bd0 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
23be0 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
23bf0 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
23c00 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
23c10 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
23c20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
23c30 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
23c40 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
23c60 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
23c70 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
23c80 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
23c90 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
23ca0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
23cb0 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
23cc0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
23cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23ce0 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
23cf0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
23d00 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23d10 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
23d20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
23d30 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
23d40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
23d50 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
23d60 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
23d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23d80 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
23d90 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
23da0 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
23db0 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
23dd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23de0 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
23df0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
23e00 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
23e10 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
23e20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
23e30 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
23e60 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23e80 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
23e90 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
23ea0 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
23eb0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
23ec0 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
23ed0 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
23ee0 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
23f00 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
23f10 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
23f20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23f50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23f60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23f70 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
23f80 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23fa0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
23fb0 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
23fc0 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
23fd0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
23fe0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
23ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
24000 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
24010 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
24020 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
24030 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
24040 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
24050 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
24060 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
24070 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
24080 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
24090 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
240a0 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
240b0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
240c0 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
240d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
240e0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
240f0 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
24100 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
24110 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
24120 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
24130 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
24140 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
24150 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
24160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
24170 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
24180 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
24190 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
241a0 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
241b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
241c0 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
241d0 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
241e0 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
241f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
24200 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
24210 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
24220 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24230 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
24240 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
24250 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
24260 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
24270 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
24280 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
24290 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
242a0 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
242b0 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
242c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
242d0 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
242e0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
242f0 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
24300 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
24310 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
24320 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
24330 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
24340 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24350 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
24360 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
24370 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
24380 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
24390 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
243a0 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
243b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
243c0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
243d0 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
243e0 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
243f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
24410 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24420 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
24430 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
24440 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
24450 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
24460 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
24470 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
24480 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
24490 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
244a0 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
244b0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
244c0 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
244d0 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
244e0 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
244f0 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
24500 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
24510 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
24520 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24530 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
24540 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
24550 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
24560 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
24570 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
24580 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
24590 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
245a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
245b0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
245c0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
245d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
245e0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
245f0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
24600 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
24610 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
24620 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
24640 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71  pr->u.zToken, sq
24650 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
24660 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a  xpr->u.zToken),.
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
24690 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
246a0 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
246b0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
246c0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
246d0 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
246e0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
246f0 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
24700 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
24710 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
24720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24730 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
24740 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
24750 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24770 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
24780 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
24790 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
247a0 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
247b0 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
247c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
247d0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
247e0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
247f0 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
24800 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
24810 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
24820 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
24830 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
24840 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
24850 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
24860 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
24870 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
24880 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
24890 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
248a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
248b0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
248c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
248d0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
248e0 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
248f0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
24900 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
24910 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
24920 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
24930 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24940 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
24950 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
24960 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
24970 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
24980 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
24990 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
249a0 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
249b0 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
249c0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
249d0 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
249e0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
249f0 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
24a00 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
24a10 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
24a20 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
24a30 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
24a40 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
24a50 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
24a60 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
24a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
24a80 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
24a90 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
24aa0 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
24ab0 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
24ac0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
24ad0 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
24ae0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
24af0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
24b00 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
24b10 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
24b20 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
24b30 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
24b40 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
24b50 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
24b60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
24b70 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
24b80 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
24b90 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
24ba0 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
24bb0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
24bc0 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
24bd0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
24be0 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
24bf0 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
24c00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
24c10 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
24c20 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
24c30 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
24c40 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
24c50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
24c60 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
24c70 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
24c80 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
24c90 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
24ca0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24cb0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
24cc0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
24cd0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
24ce0 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
24cf0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24d00 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
24d10 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
24d20 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
24d30 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
24d40 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
24d50 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
24d60 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
24d70 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
24d80 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
24d90 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
24da0 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
24db0 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
24dc0 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
24dd0 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
24de0 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
24df0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
24e00 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
24e10 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
24e20 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
24e30 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
24e40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
24e50 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
24e60 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
24e70 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
24e80 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
24e90 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
24ea0 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
24eb0 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
24ec0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
24ed0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
24ee0 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
24ef0 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
24f00 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
24f10 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
24f20 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
24f30 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
24f40 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
24f50 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
24f60 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
24f70 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
24f80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
24f90 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
24fa0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
24fb0 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
24fc0 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
24fd0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
24fe0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
24ff0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
25000 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
25010 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
25020 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
25030 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
25040 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
25050 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
25060 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
25070 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
25080 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
25090 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
250a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
250b0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
250c0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
250d0 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
250e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
250f0 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
25100 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
25110 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
25120 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
25130 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
25140 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
25150 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
25160 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
25170 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
25180 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
25190 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
251a0 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
251b0 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
251c0 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
251d0 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
251e0 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
251f0 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
25200 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
25210 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
25220 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
25230 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
25240 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
25250 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
25260 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
25270 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25280 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
25290 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
252a0 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c  int nReg){.  sql
252b0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
252c0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
252d0 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
252e0 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
252f0 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
25300 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
25310 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
25320 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
25330 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
25340 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
25350 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
25360 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
25370 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
25380 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
25390 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
253a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
253b0 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
253c0 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
253d0 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
253e0 0a 7d 0a                                         .}.