/ Hex Artifact Content
Login

Artifact eb4d795abca1e876726aecc7aeb95ceb29e73fe7:


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 65 78 70 72 53 65 74 48 65 69 67 68  {.  exprSetHeigh
31a0: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t(p);.  sqlite3E
31b0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
31c0: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
31d0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
31e0: 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
31f0: 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 65 78  height of any ex
3200: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
3210: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74  ferenced.** by t
3220: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
3230: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ent passed as an
3240: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
3250: 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  t sqlite3SelectE
3260: 78 70 72 48 65 69 67 68 74 28 53 65 6c 65 63 74  xprHeight(Select
3270: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69   *p){.  int nHei
3280: 67 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68  ght = 0;.  heigh
3290: 74 4f 66 53 65 6c 65 63 74 28 70 2c 20 26 6e 48  tOfSelect(p, &nH
32a0: 65 69 67 68 74 29 3b 0a 20 20 72 65 74 75 72 6e  eight);.  return
32b0: 20 6e 48 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73   nHeight;.}.#els
32c0: 65 20 2f 2a 20 41 42 4f 56 45 3a 20 20 48 65 69  e /* ABOVE:  Hei
32d0: 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20  ght enforcement 
32e0: 65 6e 61 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a  enabled.  BELOW:
32f0: 20 48 65 69 67 68 74 20 65 6e 66 6f 72 63 65 6d   Height enforcem
3300: 65 6e 74 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a  ent off */./*.**
3310: 20 50 72 6f 70 61 67 61 74 65 20 61 6c 6c 20 45   Propagate all E
3320: 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61 67  P_Propagate flag
3330: 73 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  s from the Expr.
3340: 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20  x.pList into.** 
3350: 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a  Expr.flags. .*/.
3360: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3370: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
3380: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
3390: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
33a0: 20 70 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74   p && p->x.pList
33b0: 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
33c0: 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65  erty(p, EP_xIsSe
33d0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  lect) ){.    p->
33e0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
33f0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
3400: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3410: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  x.pList);.  }.}.
3420: 23 64 65 66 69 6e 65 20 65 78 70 72 53 65 74 48  #define exprSetH
3430: 65 69 67 68 74 28 79 29 0a 23 65 6e 64 69 66 20  eight(y).#endif 
3440: 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  /* SQLITE_MAX_EX
3450: 50 52 5f 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f  PR_DEPTH>0 */../
3460: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3470: 65 20 69 73 20 74 68 65 20 63 6f 72 65 20 61 6c  e is the core al
3480: 6c 6f 63 61 74 6f 72 20 66 6f 72 20 45 78 70 72  locator for Expr
3490: 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f   nodes..**.** Co
34a0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
34b0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e  pression node an
34c0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
34d0: 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72  er to it.  Memor
34e0: 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f  y.** for this no
34f0: 64 65 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  de and for the p
3500: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20 69  Token argument i
3510: 73 20 61 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63  s a single alloc
3520: 61 74 69 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65  ation.** obtaine
3530: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
3540: 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63  Malloc().  The c
3550: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
3560: 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
3570: 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
3580: 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74  e the node event
3590: 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64  ually gets freed
35a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f  ..**.** If dequo
35b0: 74 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  te is true, then
35c0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 69 66 20 69   the token (if i
35d0: 74 20 65 78 69 73 74 73 29 20 69 73 20 64 65 71  t exists) is deq
35e0: 75 6f 74 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71  uoted..** If deq
35f0: 75 6f 74 65 20 69 73 20 66 61 6c 73 65 2c 20 6e  uote is false, n
3600: 6f 20 64 65 71 75 6f 74 69 6e 67 20 69 73 20 70  o dequoting is p
3610: 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65  erformance.  The
3620: 20 64 65 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61   deQuote.** para
3630: 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
3640: 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55   if pToken is NU
3650: 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 74 6f 6b  LL or if the tok
3660: 65 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61  en does not.** a
3670: 70 70 65 61 72 20 74 6f 20 62 65 20 71 75 6f 74  ppear to be quot
3680: 65 64 2e 20 20 49 66 20 74 68 65 20 71 75 6f 74  ed.  If the quot
3690: 65 73 20 77 65 72 65 20 6f 66 20 74 68 65 20 66  es were of the f
36a0: 6f 72 6d 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c  orm "..." (doubl
36b0: 65 2d 71 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65  e-quotes).** the
36c0: 6e 20 74 68 65 20 45 50 5f 44 62 6c 51 75 6f 74  n the EP_DblQuot
36d0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  ed flag is set o
36e0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
36f0: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65   node..**.** Spe
3700: 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 6f  cial case:  If o
3710: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e  p==TK_INTEGER an
3720: 64 20 70 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20  d pToken points 
3730: 74 6f 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  to a string that
3740: 0a 2a 2a 20 63 61 6e 20 62 65 20 74 72 61 6e 73  .** can be trans
3750: 6c 61 74 65 64 20 69 6e 74 6f 20 61 20 33 32 2d  lated into a 32-
3760: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 74 68 65  bit integer, the
3770: 6e 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e  n the token is n
3780: 6f 74 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20  ot.** stored in 
3790: 75 2e 7a 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65  u.zToken.  Inste
37a0: 61 64 2c 20 74 68 65 20 69 6e 74 65 67 65 72 20  ad, the integer 
37b0: 76 61 6c 75 65 73 20 69 73 20 77 72 69 74 74 65  values is writte
37c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c  n.** into u.iVal
37d0: 75 65 20 61 6e 64 20 74 68 65 20 45 50 5f 49 6e  ue and the EP_In
37e0: 74 56 61 6c 75 65 20 66 6c 61 67 20 69 73 20 73  tValue flag is s
37f0: 65 74 2e 20 20 4e 6f 20 65 78 74 72 61 20 73 74  et.  No extra st
3800: 6f 72 61 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f  orage.** is allo
3810: 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
3820: 65 20 69 6e 74 65 67 65 72 20 74 65 78 74 20 61  e integer text a
3830: 6e 64 20 74 68 65 20 64 65 71 75 6f 74 65 20 66  nd the dequote f
3840: 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  lag is ignored..
3850: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
3860: 45 78 70 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c  ExprAlloc(.  sql
3870: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3880: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3890: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
38a0: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
38b0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
38c0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
38d0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
38e0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
38f0: 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nst Token *pToke
3900: 6e 2c 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61  n,    /* Token a
3910: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
3920: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
3930: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
3940: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3950: 64 65 71 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20  dequote */.){.  
3960: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
3970: 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20  t nExtra = 0;.  
3980: 69 6e 74 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a  int iValue = 0;.
3990: 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b  .  if( pToken ){
39a0: 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  .    if( op!=TK_
39b0: 49 4e 54 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65  INTEGER || pToke
39c0: 6e 2d 3e 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20  n->z==0.        
39d0: 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49    || sqlite3GetI
39e0: 6e 74 33 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  nt32(pToken->z, 
39f0: 26 69 56 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20  &iValue)==0 ){. 
3a00: 20 20 20 20 20 6e 45 78 74 72 61 20 3d 20 70 54       nExtra = pT
3a10: 6f 6b 65 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20  oken->n+1;.     
3a20: 20 61 73 73 65 72 74 28 20 69 56 61 6c 75 65 3e   assert( iValue>
3a30: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
3a40: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
3a50: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
3a60: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45   sizeof(Expr)+nE
3a70: 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 4e 65  xtra);.  if( pNe
3a80: 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f  w ){.    pNew->o
3a90: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
3aa0: 70 4e 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b  pNew->iAgg = -1;
3ab0: 0a 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  .    if( pToken 
3ac0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78  ){.      if( nEx
3ad0: 74 72 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tra==0 ){.      
3ae0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
3af0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
3b00: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
3b10: 61 6c 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20  alue = iValue;. 
3b20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3b30: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
3b40: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3b50: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  n = (char*)&pNew
3b60: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73  [1];.        ass
3b70: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d  ert( pToken->z!=
3b80: 30 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d  0 || pToken->n==
3b90: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
3ba0: 20 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d   pToken->n ) mem
3bb0: 63 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b  cpy(pNew->u.zTok
3bc0: 65 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  en, pToken->z, p
3bd0: 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20  Token->n);.     
3be0: 20 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65     pNew->u.zToke
3bf0: 6e 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30  n[pToken->n] = 0
3c00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
3c10: 71 75 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e  quote && nExtra>
3c20: 3d 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  =3 .            
3c30: 20 26 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e   && ((c = pToken
3c40: 2d 3e 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c  ->z[0])=='\'' ||
3c50: 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b   c=='"' || c=='[
3c60: 27 20 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a  ' || c=='`') ){.
3c70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3c80: 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75  3Dequote(pNew->u
3c90: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
3ca0: 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29      if( c=='"' )
3cb0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
3cc0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20  EP_DblQuoted;.  
3cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3ce0: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
3cf0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
3d00: 30 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69  0.    pNew->nHei
3d10: 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20  ght = 1;.#endif 
3d20: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70   .  }.  return p
3d30: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
3d40: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 78 70  locate a new exp
3d50: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f  ression node fro
3d60: 6d 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  m a zero-termina
3d70: 74 65 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68  ted token that h
3d80: 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  as.** already be
3d90: 65 6e 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a  en dequoted..*/.
3da0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3db0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
3dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3dd0: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3de0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3df0: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3e00: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3e20: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3e30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
3e40: 20 2a 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a   *zToken      /*
3e50: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
3e60: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
3e70: 2a 2f 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b  */.){.  Token x;
3e80: 0a 20 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b  .  x.z = zToken;
3e90: 0a 20 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20  .  x.n = zToken 
3ea0: 3f 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ? sqlite3Strlen3
3eb0: 30 28 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20  0(zToken) : 0;. 
3ec0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
3ed0: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c  xprAlloc(db, op,
3ee0: 20 26 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &x, 0);.}../*.*
3ef0: 2a 20 41 74 74 61 63 68 20 73 75 62 74 72 65 65  * Attach subtree
3f00: 73 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67  s pLeft and pRig
3f10: 68 74 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e  ht to the Expr n
3f20: 6f 64 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a  ode pRoot..**.**
3f30: 20 49 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20   If pRoot==NULL 
3f40: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
3f50: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
3f60: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
3f70: 63 75 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68  curred..** In th
3f80: 61 74 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20  at case, delete 
3f90: 74 68 65 20 73 75 62 74 72 65 65 73 20 70 4c 65  the subtrees pLe
3fa0: 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a  ft and pRight..*
3fb0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
3fc0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
3fd0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3fe0: 0a 20 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a  .  Expr *pRoot,.
3ff0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20    Expr *pLeft,. 
4000: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
4010: 0a 20 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20  .  if( pRoot==0 
4020: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
4030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4050: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65  prDelete(db, pLe
4060: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
4070: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4080: 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  Right);.  }else{
4090: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 20  .    if( pRight 
40a0: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
40b0: 70 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b  pRight = pRight;
40c0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c  .      pRoot->fl
40d0: 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67  ags |= EP_Propag
40e0: 61 74 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c  ate & pRight->fl
40f0: 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ags;.    }.    i
4100: 66 28 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  f( pLeft ){.    
4110: 20 20 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d    pRoot->pLeft =
4120: 20 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52   pLeft;.      pR
4130: 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  oot->flags |= EP
4140: 5f 50 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65  _Propagate & pLe
4150: 66 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ft->flags;.    }
4160: 0a 20 20 20 20 65 78 70 72 53 65 74 48 65 69 67  .    exprSetHeig
4170: 68 74 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d  ht(pRoot);.  }.}
4180: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
4190: 20 61 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68   an Expr node wh
41a0: 69 63 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e  ich joins as man
41b0: 79 20 61 73 20 74 77 6f 20 73 75 62 74 72 65 65  y as two subtree
41c0: 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20  s..**.** One or 
41d0: 62 6f 74 68 20 6f 66 20 74 68 65 20 73 75 62 74  both of the subt
41e0: 72 65 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c  rees can be NULL
41f0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
4200: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ter to the new.*
4210: 2a 20 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72  * Expr node.  Or
4220: 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  , if an OOM erro
4230: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50  r occurs, set pP
4240: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
4250: 46 61 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20  Failed,.** free 
4260: 74 68 65 20 73 75 62 74 72 65 65 73 20 61 6e 64  the subtrees and
4270: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f   return NULL..*/
4280: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45  .Expr *sqlite3PE
4290: 78 70 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  xpr(.  Parse *pP
42a0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
42b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
42c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42e0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63  * Expression opc
42f0: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ode */.  Expr *p
4300: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
4310: 20 2f 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64   /* Left operand
4320: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67   */.  Expr *pRig
4330: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
4340: 20 52 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   Right operand *
4350: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
4360: 2a 70 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41  *pToken     /* A
4370: 72 67 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  rgument token */
4380: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  .){.  Expr *p;. 
4390: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20   if( op==TK_AND 
43a0: 26 26 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  && pLeft && pRig
43b0: 68 74 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45  ht && pParse->nE
43c0: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rr==0 ){.    /* 
43d0: 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  Take advantage o
43e0: 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 20  f short-circuit 
43f0: 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74 69  false optimizati
4400: 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20  on for AND */.  
4410: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
4420: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
4430: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
4440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
4450: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4460: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f  oc(pParse->db, o
4470: 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20  p, pToken, 1);. 
4480: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74     sqlite3ExprAt
4490: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
44a0: 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66  rse->db, p, pLef
44b0: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a  t, pRight);.  }.
44c0: 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20 20    if( p ) {.    
44d0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
44e0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
44f0: 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a  ->nHeight);.  }.
4500: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4510: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
4520: 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ession is always
4530: 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72 20   either TRUE or 
4540: 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69 76  FALSE (respectiv
4550: 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  ely),.** then re
4560: 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20  turn 1.  If one 
4570: 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65  cannot determine
4580: 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75 65   the truth value
4590: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
45a0: 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ssion at compile
45b0: 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a  -time return 0..
45c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
45d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
45e0: 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75  If is OK to retu
45f0: 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20 69  rn 0 here even i
4600: 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73  f.** the express
4610: 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c  ion really is al
4620: 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61  ways false or fa
4630: 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67  lse (a false neg
4640: 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69  ative)..** But i
4650: 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72 65  t is a bug to re
4660: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
4670: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68  pression might h
4680: 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ave different.**
4690: 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20   boolean values 
46a0: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69 72  in different cir
46b0: 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61  cumstances (a fa
46c0: 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a  lse positive.).*
46d0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
46e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
46f0: 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64   is part of cond
4700: 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a  itional for a.**
4710: 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e   LEFT JOIN, then
4720: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72   we cannot deter
4730: 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  mine at compile-
4740: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
4750: 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75  not.** is it tru
4760: 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61  e or false, so a
4770: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a  lways return 0..
4780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
4790: 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78 70  prAlwaysTrue(Exp
47a0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d  r *p){.  int v =
47b0: 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
47c0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
47d0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
47e0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
47f0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
4800: 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75 72  r(p, &v) ) retur
4810: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21  n 0;.  return v!
4820: 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  =0;.}.static int
4830: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
4840: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
4850: 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78   v = 0;.  if( Ex
4860: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
4870: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20   EP_FromJoin) ) 
4880: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
4890: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e  !sqlite3ExprIsIn
48a0: 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20 72  teger(p, &v) ) r
48b0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
48c0: 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n v==0;.}../*.**
48d0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
48e0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
48f0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
4900: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
4910: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
4920: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
4930: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
4940: 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  sion..**.** If o
4950: 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f  ne side or the o
4960: 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20  ther of the AND 
4970: 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66  is known to be f
4980: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65  alse, then inste
4990: 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69  ad.** of returni
49a0: 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73  ng an AND expres
49b0: 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72  sion, just retur
49c0: 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  n a constant exp
49d0: 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20  ression with.** 
49e0: 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65  a value of false
49f0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
4a00: 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65  e3ExprAnd(sqlite
4a10: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65  3 *db, Expr *pLe
4a20: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
4a30: 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d  ){.  if( pLeft==
4a40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4a50: 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20  pRight;.  }else 
4a60: 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b  if( pRight==0 ){
4a70: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66  .    return pLef
4a80: 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  t;.  }else if( e
4a90: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
4aa0: 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77  Left) || exprAlw
4ab0: 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74 29  aysFalse(pRight)
4ac0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ad0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  xprDelete(db, pL
4ae0: 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
4af0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4b00: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74  pRight);.    ret
4b10: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41  urn sqlite3ExprA
4b20: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45  lloc(db, TK_INTE
4b30: 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74  GER, &sqlite3Int
4b40: 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20  Tokens[0], 0);. 
4b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72   }else{.    Expr
4b60: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
4b70: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
4b80: 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _AND, 0, 0);.   
4b90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
4ba0: 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20 70  chSubtrees(db, p
4bb0: 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  New, pLeft, pRig
4bc0: 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ht);.    return 
4bd0: 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  pNew;.  }.}../*.
4be0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
4bf0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
4c00: 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f  de for a functio
4c10: 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a  n with multiple.
4c20: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  ** arguments..*/
4c30: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
4c40: 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65  prFunction(Parse
4c50: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
4c60: 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
4c70: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
4c80: 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74  r *pNew;.  sqlit
4c90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4ca0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
4cb0: 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20  Token );.  pNew 
4cc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
4cd0: 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49  oc(db, TK_FUNCTI
4ce0: 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  ON, pToken, 1);.
4cf0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
4d00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4d10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4d20: 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20  List); /* Avoid 
4d30: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e  memory leak when
4d40: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
4d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4d60: 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69   }.  pNew->x.pLi
4d70: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73  st = pList;.  as
4d80: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4d90: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
4da0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
4db0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
4dc0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
4dd0: 72 73 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65  rse, pNew);.  re
4de0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
4df0: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
4e00: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
4e10: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
4e20: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
4e30: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
4e40: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
4e50: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
4e60: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
4e70: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
4e80: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
4e90: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
4ea0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
4eb0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
4ec0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
4ed0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
4ee0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
4ef0: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
4f00: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
4f10: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
4f20: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
4f30: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
4f40: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
4f50: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
4f60: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
4f70: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
4f80: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
4f90: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
4fa0: 2c 20 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61  , "@aaa", or "$a
4fb0: 61 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  aa" are assigned
4fc0: 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
4fd0: 0a 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69  .** as the previ
4fe0: 6f 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ous instance of 
4ff0: 74 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72  the same wildcar
5000: 64 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69  d.  Or if this i
5010: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  s the first.** i
5020: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77  nstance of the w
5030: 69 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78  ildcard, the nex
5040: 74 20 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72  t sequential var
5050: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a  iable number is.
5060: 2a 2a 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a  ** assigned..*/.
5070: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5080: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
5090: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
50a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73  xpr *pExpr){.  s
50b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
50c0: 72 73 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74  rse->db;.  const
50d0: 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
50e0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
50f0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  rn;.  assert( !E
5100: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5110: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
5120: 65 7c 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  e|EP_Reduced|EP_
5130: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20  TokenOnly) );.  
5140: 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
5150: 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  ken;.  assert( z
5160: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
5170: 20 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66   z[0]!=0 );.  if
5180: 28 20 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( z[1]==0 ){.   
5190: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
51a0: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
51b0: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
51c0: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
51d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b  /.    assert( z[
51e0: 30 5d 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70  0]=='?' );.    p
51f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
5200: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
5210: 2d 3e 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65  ->nVar);.  }else
5220: 7b 0a 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20  {.    ynVar x = 
5230: 30 3b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73  0;.    u32 n = s
5240: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
5250: 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  );.    if( z[0]=
5260: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='?' ){.      /*
5270: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
5280: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43   form "?nnn".  C
5290: 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20  onvert "nnn" to 
52a0: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20  an integer and. 
52b0: 20 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61       ** use it a
52c0: 73 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e  s the variable n
52d0: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69  umber */.      i
52e0: 36 34 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  64 i;.      int 
52f0: 62 4f 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33  bOk = 0==sqlite3
5300: 41 74 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69  Atoi64(&z[1], &i
5310: 2c 20 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  , n-1, SQLITE_UT
5320: 46 38 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  F8);.      pExpr
5330: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
5340: 28 79 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20  (ynVar)i;.      
5350: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29  testcase( i==0 )
5360: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5370: 28 20 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i==1 );.      
5380: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d  testcase( i==db-
5390: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
53a0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
53b0: 4d 42 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20  MBER]-1 );.     
53c0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62   testcase( i==db
53d0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
53e0: 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
53f0: 55 4d 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20  UMBER] );.      
5400: 69 66 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c  if( bOk==0 || i<
5410: 31 20 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69  1 || i>db->aLimi
5420: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
5430: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
5440: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
5450: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5460: 65 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d  e, "variable num
5470: 62 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77  ber must be betw
5480: 65 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c  een ?1 and ?%d",
5490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
54a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
54b0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
54c0: 4d 42 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20  MBER]);.        
54d0: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  x = 0;.      }. 
54e0: 20 20 20 20 20 69 66 28 20 69 3e 70 50 61 72 73       if( i>pPars
54f0: 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20  e->nVar ){.     
5500: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20     pParse->nVar 
5510: 3d 20 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20  = (int)i;.      
5520: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5530: 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20     /* Wildcards 
5540: 6c 69 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61  like ":aaa", "$a
5550: 61 61 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20  aa" or "@aaa".  
5560: 52 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76  Reuse the same v
5570: 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
5580: 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 70   number as the p
5590: 72 69 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20  rior appearance 
55a0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
55b0: 2c 20 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65  , or if the name
55c0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65  .      ** has ne
55d0: 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65 66  ver appeared bef
55e0: 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20 73  ore, reuse the s
55f0: 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  ame variable num
5600: 62 65 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ber.      */.   
5610: 20 20 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20     ynVar i;.    
5620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
5630: 72 73 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29  rse->nzVar; i++)
5640: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
5650: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26  arse->azVar[i] &
5660: 26 20 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d  & strcmp(pParse-
5670: 3e 61 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20  >azVar[i],z)==0 
5680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
5690: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20  pr->iColumn = x 
56a0: 3d 20 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20  = (ynVar)i+1;.  
56b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
56c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
56d0: 0a 20 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20  .      if( x==0 
56e0: 29 20 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  ) x = pExpr->iCo
56f0: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b  lumn = (ynVar)(+
5700: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a  +pParse->nVar);.
5710: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e      }.    if( x>
5720: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78  0 ){.      if( x
5730: 3e 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29  >pParse->nzVar )
5740: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
5750: 2a 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20  *a;.        a = 
5760: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
5770: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
5780: 61 72 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30  ar, x*sizeof(a[0
5790: 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ]));.        if(
57a0: 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   a==0 ) return; 
57b0: 20 2f 2a 20 45 72 72 6f 72 20 72 65 70 6f 72 74   /* Error report
57c0: 65 64 20 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d  ed through db->m
57d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20  allocFailed */. 
57e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
57f0: 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20  zVar = a;.      
5800: 20 20 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72    memset(&a[pPar
5810: 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28  se->nzVar], 0, (
5820: 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29  x-pParse->nzVar)
5830: 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a  *sizeof(a[0]));.
5840: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5850: 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20  nzVar = x;.     
5860: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30   }.      if( z[0
5870: 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65  ]!='?' || pParse
5880: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20  ->azVar[x-1]==0 
5890: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
58a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 50 61  e3DbFree(db, pPa
58b0: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29  rse->azVar[x-1])
58c0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73  ->azVar[x-1] = s
58e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
58f0: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  db, z, n);.     
5900: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20   }.    }.  } .  
5910: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72  if( !pParse->nEr
5920: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61  r && pParse->nVa
5930: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
5940: 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
5950: 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20  LE_NUMBER] ){.  
5960: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5970: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
5980: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
5990: 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s");.  }.}../*.*
59a0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
59b0: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
59c0: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
59d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
59e0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
59f0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5a00: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
5a10: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
5a20: 3a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  : Assert that th
5a30: 65 20 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f  e IntValue is no
5a40: 6e 2d 6e 65 67 61 74 69 76 65 20 69 66 20 69 74  n-negative if it
5a50: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73   exists */.  ass
5a60: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5a70: 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56  perty(p, EP_IntV
5a80: 61 6c 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56  alue) || p->u.iV
5a90: 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  alue>=0 );.  if(
5aa0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5ab0: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
5ac0: 79 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  y) ){.    /* The
5ad0: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
5ae0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
5af0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
5b00: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
5b10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
5b20: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
5b30: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
5b40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5b50: 65 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b  e(db, p->pLeft);
5b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
5b70: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52  Delete(db, p->pR
5b80: 69 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45  ight);.    if( E
5b90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ba0: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
5bb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5bc0: 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  b, p->u.zToken);
5bd0: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
5be0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
5bf0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
5c00: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
5c10: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e  Delete(db, p->x.
5c20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
5c30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
5c40: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
5c50: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29  (db, p->x.pList)
5c60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5c70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5c80: 74 79 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29  ty(p, EP_Static)
5c90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5ca0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
5cb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
5cc0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5cd0: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5ce0: 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69  for the expressi
5cf0: 6f 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  on structure .**
5d00: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
5d10: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
5d20: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  his is always on
5d30: 65 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49  e of EXPR_FULLSI
5d40: 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55  ZE,.** EXPR_REDU
5d50: 43 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f  CEDSIZE or EXPR_
5d60: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a  TOKENONLYSIZE..*
5d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
5d80: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
5d90: 20 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72   *p){.  if( Expr
5da0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5db0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72  P_TokenOnly) ) r
5dc0: 65 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e  eturn EXPR_TOKEN
5dd0: 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20  ONLYSIZE;.  if( 
5de0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5df0: 70 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29  p, EP_Reduced) )
5e00: 20 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44   return EXPR_RED
5e10: 55 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75  UCEDSIZE;.  retu
5e20: 72 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  rn EXPR_FULLSIZE
5e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
5e40: 75 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20  upedExpr*Size() 
5e50: 72 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65  routines each re
5e60: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5e70: 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
5e80: 64 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20  d.** to store a 
5e90: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
5ea0: 73 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73  ssion or express
5eb0: 69 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20  ion tree.  They 
5ec0: 64 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77  differ in.** how
5ed0: 20 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65   much of the tre
5ee0: 65 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a  e is measured..*
5ef0: 2a 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  *.**     dupedEx
5f00: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20  prStructSize()  
5f10: 20 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20     Size of only 
5f20: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
5f30: 72 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  re .**     duped
5f40: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20  ExprNodeSize()  
5f50: 20 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70       Size of Exp
5f60: 72 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f  r + space for to
5f70: 6b 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64  ken.**     duped
5f80: 45 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20  ExprSize()      
5f90: 20 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65       Expr + toke
5fa0: 6e 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70  n + subtree comp
5fb0: 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  onents.**.******
5fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
6010: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
6020: 69 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72  ize() function r
6030: 65 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65  eturns two value
6040: 73 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72  s OR-ed together
6050: 3a 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73  :  .** (1) the s
6060: 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
6070: 72 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  r a copy of the 
6080: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f  Expr structure o
6090: 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20  nly and .** (2) 
60a0: 74 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73  the EP_xxx flags
60b0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77   that indicate w
60c0: 68 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72  hat the structur
60d0: 65 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  e size should be
60e0: 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
60f0: 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73  values is always
6100: 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
6110: 20 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a      EXPR_FULLSIZ
6120: 45 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52  E.**      EXPR_R
6130: 45 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45  EDUCEDSIZE   | E
6140: 50 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20  P_Reduced.**    
6150: 20 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59    EXPR_TOKENONLY
6160: 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f  SIZE | EP_TokenO
6170: 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  nly.**.** The si
6180: 7a 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  ze of the struct
6190: 75 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ure can be found
61a0: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20   by masking the 
61b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
61c0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
61d0: 77 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65  with 0xfff.  The
61e0: 20 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f   flags can be fo
61f0: 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74  und by masking t
6200: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
6210: 75 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63  ue with EP_Reduc
6220: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e  ed|EP_TokenOnly.
6230: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
6240: 20 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50   with flags==EXP
6250: 52 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69  RDUP_REDUCE, thi
6260: 73 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73  s routines works
6270: 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a   on full-size.**
6280: 20 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70   (unreduced) Exp
6290: 72 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65  r objects as the
62a0: 79 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20  y or originally 
62b0: 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74  constructed by t
62c0: 68 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75  he parser..** Du
62d0: 72 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20  ring expression 
62e0: 61 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20  analysis, extra 
62f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63  information is c
6300: 6f 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65  omputed and move
6310: 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20  d into.** later 
6320: 70 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70  parts of teh Exp
6330: 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61  r object and tha
6340: 74 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  t extra informat
6350: 69 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68  ion might get ch
6360: 6f 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20  opped.** off if 
6370: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
6380: 73 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65  s reduced.  Note
6390: 20 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f   also that it do
63a0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a  es not work to.*
63b0: 2a 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55  * make an EXPRDU
63c0: 50 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66  P_REDUCE copy of
63d0: 20 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65   a reduced expre
63e0: 73 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e  ssion.  It is on
63f0: 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72  ly legal.** to r
6400: 65 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65  educe a pristine
6410: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6420: 20 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72   from the parser
6430: 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  .  The implement
6440: 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65  ation.** of dupe
6450: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
6460: 29 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70  ) contain multip
6470: 6c 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  le assert() stat
6480: 65 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65  ements that atte
6490: 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63  mpt.** to enforc
64a0: 65 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  e this constrain
64b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
64c0: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
64d0: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
64e0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
64f0: 6e 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  nSize;.  assert(
6500: 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f   flags==EXPRDUP_
6510: 52 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d  REDUCE || flags=
6520: 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  =0 ); /* Only on
6530: 65 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c  e flag value all
6540: 6f 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  owed */.  assert
6550: 28 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c  ( EXPR_FULLSIZE<
6560: 3d 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65  =0xfff );.  asse
6570: 72 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50  rt( (0xfff & (EP
6580: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6590: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
65a0: 69 66 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58  if( 0==(flags&EX
65b0: 50 52 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b  PRDUP_REDUCE) ){
65c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50  .    nSize = EXP
65d0: 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65  R_FULLSIZE;.  }e
65e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
65f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6600: 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  y(p, EP_TokenOnl
6610: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
6620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
6630: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
6640: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b   EP_FromJoin) );
6650: 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45   .    assert( !E
6660: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6670: 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29  , EP_MemToken) )
6680: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
6690: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
66a0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29  , EP_NoReduce) )
66b0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65  ;.    if( p->pLe
66c0: 66 74 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74  ft || p->x.pList
66d0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
66e0: 3d 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49  = EXPR_REDUCEDSI
66f0: 5a 45 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b  ZE | EP_Reduced;
6700: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6710: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
6720: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
6730: 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b  nSize = EXPR_TOK
6740: 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f  ENONLYSIZE | EP_
6750: 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d  TokenOnly;.    }
6760: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53  .  }.  return nS
6770: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
6780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
6790: 72 6e 73 20 74 68 65 20 73 70 61 63 65 20 69 6e  rns the space in
67a0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
67b0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
67c0: 79 20 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70  y .** of the Exp
67d0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
67e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
67f0: 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  pr.u.zToken stri
6800: 6e 67 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73  ng (if that.** s
6810: 74 72 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64  tring is defined
6820: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
6830: 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69   dupedExprNodeSi
6840: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6850: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6860: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 53  yte = dupedExprS
6870: 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61  tructSize(p, fla
6880: 67 73 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69  gs) & 0xfff;.  i
6890: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
68a0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
68b0: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
68c0: 65 6e 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  en ){.    nByte 
68d0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
68e0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b  30(p->u.zToken)+
68f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6900: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d  ROUND8(nByte);.}
6910: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6920: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6930: 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  es required to c
6940: 72 65 61 74 65 20 61 20 64 75 70 6c 69 63 61 74  reate a duplicat
6950: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70  e of the .** exp
6960: 72 65 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61  ression passed a
6970: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
6980: 6d 65 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64  ment. The second
6990: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
69a0: 2a 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e  * mask containin
69b0: 67 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c  g EXPRDUP_XXX fl
69c0: 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ags..**.** The v
69d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e  alue returned in
69e0: 63 6c 75 64 65 73 20 73 70 61 63 65 20 74 6f 20  cludes space to 
69f0: 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
6a00: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
6a10: 0a 2a 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74  .** itself and t
6a20: 68 65 20 62 75 66 66 65 72 20 72 65 66 65 72 72  he buffer referr
6a30: 65 64 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e  ed to by Expr.u.
6a40: 7a 54 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a  zToken, if any..
6a50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50  **.** If the EXP
6a60: 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67  RDUP_REDUCE flag
6a70: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
6a80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
6a90: 6e 63 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63  ncludes .** spac
6aa0: 65 20 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61  e to duplicate a
6ab0: 6c 6c 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e  ll Expr nodes in
6ac0: 20 74 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64   the tree formed
6ad0: 20 62 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a   by Expr.pLeft .
6ae0: 2a 2a 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67  ** and Expr.pRig
6af0: 68 74 20 76 61 72 69 61 62 6c 65 73 20 28 62 75  ht variables (bu
6b00: 74 20 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74  t not for any st
6b10: 72 75 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64  ructures pointed
6b20: 20 74 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65   to or .** desce
6b30: 6e 64 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78  nded from the Ex
6b40: 70 72 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78  pr.x.pList or Ex
6b50: 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72  pr.x.pSelect var
6b60: 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74  iables)..*/.stat
6b70: 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70 72  ic int dupedExpr
6b80: 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e  Size(Expr *p, in
6b90: 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
6ba0: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28  nByte = 0;.  if(
6bb0: 20 70 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20   p ){.    nByte 
6bc0: 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53  = dupedExprNodeS
6bd0: 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20  ize(p, flags);. 
6be0: 20 20 20 69 66 28 20 66 6c 61 67 73 26 45 58 50     if( flags&EXP
6bf0: 52 44 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20  RDUP_REDUCE ){. 
6c00: 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75       nByte += du
6c10: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70  pedExprSize(p->p
6c20: 4c 65 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64  Left, flags) + d
6c30: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e  upedExprSize(p->
6c40: 70 52 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a  pRight, flags);.
6c50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6c60: 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a  rn nByte;.}../*.
6c70: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6c80: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
6c90: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 2c  qlite3ExprDup(),
6ca0: 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 20   except that if 
6cb0: 70 7a 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20  pzBuffer .** is 
6cc0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70  not NULL then *p
6cd0: 7a 42 75 66 66 65 72 20 69 73 20 61 73 73 75 6d  zBuffer is assum
6ce0: 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ed to point to a
6cf0: 20 62 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e   buffer large en
6d00: 6f 75 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72  ough .** to stor
6d10: 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78  e the copy of ex
6d20: 70 72 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20  pression p, the 
6d30: 63 6f 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a  copies of p->u.z
6d40: 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70  Token.** (if app
6d50: 6c 69 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68  licable), and th
6d60: 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
6d70: 70 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e  p->pLeft and p->
6d80: 70 52 69 67 68 74 20 65 78 70 72 65 73 73 69 6f  pRight expressio
6d90: 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42  ns,.** if any. B
6da0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
6db0: 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 73 65   *pzBuffer is se
6dc0: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  t to the first b
6dd0: 79 74 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20  yte past the.** 
6de0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  portion of the b
6df0: 75 66 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74  uffer copied int
6e00: 6f 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  o by this functi
6e10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78  on..*/.static Ex
6e20: 70 72 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69  pr *exprDup(sqli
6e30: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
6e40: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20  , int flags, u8 
6e50: 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45  **pzBuffer){.  E
6e60: 78 70 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20  xpr *pNew = 0;  
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
6e90: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20  return */.  if( 
6ea0: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6eb0: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6ec0: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6ed0: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6ee0: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6ef0: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6f00: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6f10: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6f20: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
6f30: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
6f40: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
6f50: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
6f60: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
6f70: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
6f80: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
6f90: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
6fa0: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
6fb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6fc0: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
6fd0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
6fe0: 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  , dupedExprSize(
6ff0: 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20 20 20  p, flags));.    
7000: 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 45 78  }.    pNew = (Ex
7010: 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20  pr *)zAlloc;..  
7020: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
7030: 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53      /* Set nNewS
7040: 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
7050: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
7060: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
7070: 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ted to.      ** 
7080: 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20 69 73  by pNew. This is
7090: 20 65 69 74 68 65 72 20 45 58 50 52 5f 46 55 4c   either EXPR_FUL
70a0: 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45 44 55  LSIZE, EXPR_REDU
70b0: 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20 20 20  CEDSIZE or.     
70c0: 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   ** EXPR_TOKENON
70d0: 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69  LYSIZE. nToken i
70e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
70f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 63 6f 6e  ber of bytes con
7100: 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  sumed.      ** b
7110: 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20 74 68  y the copy of th
7120: 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74  e p->u.zToken st
7130: 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e 0a 20  ring (if any).. 
7140: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
7150: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53 74  nst unsigned nSt
7160: 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65 64  ructSize = duped
7170: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  ExprStructSize(p
7180: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  , flags);.      
7190: 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77 53 69  const int nNewSi
71a0: 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69 7a 65  ze = nStructSize
71b0: 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20 20 20   & 0xfff;.      
71c0: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
71d0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
71e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74  operty(p, EP_Int
71f0: 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a  Value) && p->u.z
7200: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  Token ){.       
7210: 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65   nToken = sqlite
7220: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
7230: 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20  Token) + 1;.    
7240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7250: 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20   nToken = 0;.   
7260: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
7270: 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20 20 20  sReduced ){.    
7280: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
7290: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
72a0: 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29 3b  P_Reduced)==0 );
72b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
72c0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53  zAlloc, p, nNewS
72d0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
72e0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
72f0: 53 69 7a 65 20 3d 20 65 78 70 72 53 74 72 75 63  Size = exprStruc
7300: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
7310: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
7320: 20 70 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20   p, nSize);.    
7330: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
7340: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
7350: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
7360: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
7370: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 45 50     /* Set the EP
7380: 5f 52 65 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b  _Reduced, EP_Tok
7390: 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53  enOnly, and EP_S
73a0: 74 61 74 69 63 20 66 6c 61 67 73 20 61 70 70 72  tatic flags appr
73b0: 6f 70 72 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20  opriately. */.  
73c0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
73d0: 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65 64 7c  &= ~(EP_Reduced|
73e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
73f0: 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b  Static|EP_MemTok
7400: 65 6e 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  en);.      pNew-
7410: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
7420: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
7430: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
7440: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  );.      pNew->f
7450: 6c 61 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c  lags |= staticFl
7460: 61 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  ag;..      /* Co
7470: 70 79 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  py the p->u.zTok
7480: 65 6e 20 73 74 72 69 6e 67 2c 20 69 66 20 61 6e  en string, if an
7490: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
74a0: 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20  nToken ){.      
74b0: 20 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d    char *zToken =
74c0: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
74d0: 3d 20 28 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63  = (char*)&zAlloc
74e0: 5b 6e 4e 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20  [nNewSize];.    
74f0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65      memcpy(zToke
7500: 6e 2c 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  n, p->u.zToken, 
7510: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  nToken);.      }
7520: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
7530: 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e  (p->flags|pNew->
7540: 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f 6b 65  flags) & EP_Toke
7550: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7560: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
7570: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
7580: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
7590: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
75a0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
75b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78  Property(p, EP_x
75c0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
75d0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70         pNew->x.p
75e0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
75f0: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
7600: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 73 52 65  >x.pSelect, isRe
7610: 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20  duced);.        
7620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7630: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d   pNew->x.pList =
7640: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7650: 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69  Dup(db, p->x.pLi
7660: 73 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a  st, isReduced);.
7670: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7680: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  }..      /* Fill
7690: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
76a0: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
76b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45  . */.      if( E
76c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
76d0: 4e 65 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c  New, EP_Reduced|
76e0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
76f0: 0a 20 20 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20  .        zAlloc 
7700: 2b 3d 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65  += dupedExprNode
7710: 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a  Size(p, flags);.
7720: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
7730: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7740: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 7b  , EP_Reduced) ){
7750: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7760: 3e 70 4c 65 66 74 20 3d 20 65 78 70 72 44 75 70  >pLeft = exprDup
7770: 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45  (db, p->pLeft, E
7780: 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20 26  XPRDUP_REDUCE, &
7790: 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  zAlloc);.       
77a0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
77b0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
77c0: 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55 50  >pRight, EXPRDUP
77d0: 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63  _REDUCE, &zAlloc
77e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
77f0: 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66 65       if( pzBuffe
7800: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  r ){.          *
7810: 70 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f  pzBuffer = zAllo
7820: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
7830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7840: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
7850: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
7860: 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
7870: 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74       pNew->pLeft
7880: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
7890: 70 28 64 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20  p(db, p->pLeft, 
78a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  0);.          pN
78b0: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c  ew->pRight = sql
78c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
78d0: 70 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  p->pRight, 0);. 
78e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
78f0: 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ..    }.  }.  re
7900: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
7910: 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 72  .** Create and r
7920: 65 74 75 72 6e 20 61 20 64 65 65 70 20 63 6f 70  eturn a deep cop
7930: 79 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20  y of the object 
7940: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
7950: 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
7960: 74 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e  t. If an OOM con
7970: 64 69 74 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e  dition is encoun
7980: 74 65 72 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  tered, NULL is r
7990: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74  eturned.** and t
79a0: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
79b0: 6c 65 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f  led flag set..*/
79c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
79d0: 4f 4d 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20  OMIT_CTE.static 
79e0: 57 69 74 68 20 2a 77 69 74 68 44 75 70 28 73 71  With *withDup(sq
79f0: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
7a00: 2a 70 29 7b 0a 20 20 57 69 74 68 20 2a 70 52 65  *p){.  With *pRe
7a10: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29  t = 0;.  if( p )
7a20: 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
7a30: 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73  = sizeof(*p) + s
7a40: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
7a50: 20 28 70 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20   (p->nCte-1);.  
7a60: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
7a70: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
7a80: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
7a90: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 69   pRet ){.      i
7aa0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 70 52 65 74  nt i;.      pRet
7ab0: 2d 3e 6e 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65  ->nCte = p->nCte
7ac0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7ad0: 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
7ae0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
7af0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73  a[i].pSelect = s
7b00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
7b10: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c  db, p->a[i].pSel
7b20: 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ect, 0);.       
7b30: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c   pRet->a[i].pCol
7b40: 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  s = sqlite3ExprL
7b50: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  istDup(db, p->a[
7b60: 69 5d 2e 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20  i].pCols, 0);.  
7b70: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d        pRet->a[i]
7b80: 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
7b90: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
7ba0: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
7bb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
7bc0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
7bd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
7be0: 69 74 68 44 75 70 28 78 2c 79 29 20 30 0a 23 65  ithDup(x,y) 0.#e
7bf0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
7c00: 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20  following group 
7c10: 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65  of routines make
7c20: 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f 66 20   deep copies of 
7c30: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
7c40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 73  expression lists
7c50: 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e 64 20  , ID lists, and 
7c60: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
7c70: 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73 20 63  s.  The copies c
7c80: 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74 65 64  an.** be deleted
7c90: 20 28 62 79 20 62 65 69 6e 67 20 70 61 73 73 65   (by being passe
7ca0: 64 20 74 6f 20 74 68 65 69 72 20 72 65 73 70 65  d to their respe
7cb0: 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28  ctive ...Delete(
7cc0: 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77  ) routines).** w
7cd0: 69 74 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67  ithout effecting
7ce0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a   the originals..
7cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  **.** The expres
7d00: 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61  sion list, ID, a
7d10: 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74 73 20  nd source lists 
7d20: 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69 74 65  return by sqlite
7d30: 33 45 78 70 72 4c 69 73 74 44 75 70 28 29 2c 0a  3ExprListDup(),.
7d40: 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  ** sqlite3IdList
7d50: 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c 69 74  Dup(), and sqlit
7d60: 65 33 53 72 63 4c 69 73 74 44 75 70 28 29 20 63  e3SrcListDup() c
7d70: 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74 68 65  an not be furthe
7d80: 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62  r expanded .** b
7d90: 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
7da0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73  ls to sqlite*Lis
7db0: 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74 69 6e  tAppend() routin
7dc0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61  es..**.** Any ta
7dd0: 62 6c 65 73 20 74 68 61 74 20 74 68 65 20 53 72  bles that the Sr
7de0: 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f 69 6e  cList might poin
7df0: 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64 75 70  t to are not dup
7e00: 6c 69 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  licated..**.** T
7e10: 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
7e20: 65 72 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f  er contains a co
7e30: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
7e40: 20 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61   EXPRDUP_XXX fla
7e50: 67 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 45 58  gs..** If the EX
7e60: 50 52 44 55 50 5f 52 45 44 55 43 45 20 66 6c 61  PRDUP_REDUCE fla
7e70: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
7e80: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  he structure ret
7e90: 75 72 6e 65 64 20 69 73 20 61 0a 2a 2a 20 74 72  urned is a.** tr
7ea0: 75 6e 63 61 74 65 64 20 76 65 72 73 69 6f 6e 20  uncated version 
7eb0: 6f 66 20 74 68 65 20 75 73 75 61 6c 20 45 78 70  of the usual Exp
7ec0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
7ed0: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
7ee0: 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  as.** part of th
7ef0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
7f00: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7f10: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
7f20: 61 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  a..*/.Expr *sqli
7f30: 74 65 33 45 78 70 72 44 75 70 28 73 71 6c 69 74  te3ExprDup(sqlit
7f40: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c  e3 *db, Expr *p,
7f50: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72   int flags){.  r
7f60: 65 74 75 72 6e 20 65 78 70 72 44 75 70 28 64 62  eturn exprDup(db
7f70: 2c 20 70 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  , p, flags, 0);.
7f80: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
7f90: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 73  te3ExprListDup(s
7fa0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
7fb0: 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61  List *p, int fla
7fc0: 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  gs){.  ExprList 
7fd0: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
7fe0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
7ff0: 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b  Item, *pOldItem;
8000: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8010: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8020: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8030: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8040: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8050: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8060: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8070: 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20  ew->nExpr = i = 
8080: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20  p->nExpr;.  if( 
8090: 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55 50  (flags & EXPRDUP
80a0: 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66 6f  _REDUCE)==0 ) fo
80b0: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=1; i<p->nExp
80c0: 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65  r; i+=i){}.  pNe
80d0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
80e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
80f0: 77 28 64 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28  w(db,  i*sizeof(
8100: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
8110: 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20  ( pItem==0 ){.  
8120: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8130: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
8140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20  eturn 0;.  } .  
8150: 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b  pOldItem = p->a;
8160: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
8170: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
8180: 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b  em++, pOldItem++
8190: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 6c  ){.    Expr *pOl
81a0: 64 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d  dExpr = pOldItem
81b0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  ->pExpr;.    pIt
81c0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  em->pExpr = sqli
81d0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
81e0: 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67 73 29 3b  OldExpr, flags);
81f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
8200: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8210: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8220: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
8230: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
8240: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
8250: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e   pOldItem->zSpan
8260: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f  );.    pItem->so
8270: 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74  rtOrder = pOldIt
8280: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
8290: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
82a0: 20 30 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62   0;.    pItem->b
82b0: 53 70 61 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64  SpanIsTab = pOld
82c0: 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62  Item->bSpanIsTab
82d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d  ;.    pItem->u =
82e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20   pOldItem->u;.  
82f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
8310: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
8320: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
8330: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
8340: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
8350: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
8360: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
8370: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
8380: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
8390: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
83a0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
83b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
83c0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
83d0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
83e0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
83f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
8400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
8410: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8420: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
8430: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
8440: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
8450: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
8460: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
8470: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
8480: 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66  rcList *p, int f
8490: 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c 69 73 74  lags){.  SrcList
84a0: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
84b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
84c0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
84d0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
84e0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
84f0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
8500: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
8510: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
8520: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8530: 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 6e 42 79  allocRaw(db, nBy
8540: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
8550: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8560: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
8570: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
8580: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
8590: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
85a0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
85b0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
85c0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
85d0: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
85e0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
85f0: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
8600: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
8610: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
8620: 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49  >pSchema = pOldI
8630: 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  tem->pSchema;.  
8640: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74    pNewItem->zDat
8650: 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 44  abase = sqlite3D
8660: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
8670: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
8680: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8690: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
86a0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  bStrDup(db, pOld
86b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
86c0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
86d0: 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  as = sqlite3DbSt
86e0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86f0: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
8700: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
8710: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
8720: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
8730: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
8740: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
8750: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
8760: 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
8770: 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46 69  pOldItem->addrFi
8780: 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77 49  llSub;.    pNewI
8790: 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
87a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65   pOldItem->regRe
87b0: 74 75 72 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74  turn;.    pNewIt
87c0: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
87d0: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43   = pOldItem->isC
87e0: 6f 72 72 65 6c 61 74 65 64 3b 0a 20 20 20 20 70  orrelated;.    p
87f0: 4e 65 77 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f  NewItem->viaCoro
8800: 75 74 69 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d  utine = pOldItem
8810: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a  ->viaCoroutine;.
8820: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73      pNewItem->is
8830: 52 65 63 75 72 73 69 76 65 20 3d 20 70 4f 6c 64  Recursive = pOld
8840: 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  Item->isRecursiv
8850: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
8860: 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65  >zIndex = sqlite
8870: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8880: 6c 64 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b  ldItem->zIndex);
8890: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e  .    pNewItem->n
88a0: 6f 74 49 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64  otIndexed = pOld
88b0: 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
88c0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
88d0: 70 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65  pIndex = pOldIte
88e0: 6d 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 70  m->pIndex;.    p
88f0: 54 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e  Tab = pNewItem->
8900: 70 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  pTab = pOldItem-
8910: 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
8920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Tab ){.      pTa
8930: 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  b->nRef++;.    }
8940: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
8950: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
8960: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 4f  SelectDup(db, pO
8970: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  ldItem->pSelect,
8980: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65   flags);.    pNe
8990: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
89a0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
89b0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66  pOldItem->pOn, f
89c0: 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49  lags);.    pNewI
89d0: 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71  tem->pUsing = sq
89e0: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 64  lite3IdListDup(d
89f0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  b, pOldItem->pUs
8a00: 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ing);.    pNewIt
8a10: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f  em->colUsed = pO
8a20: 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b  ldItem->colUsed;
8a30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
8a40: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
8a50: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 73  lite3IdListDup(s
8a60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
8a70: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
8a80: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
8a90: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8aa0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
8ab0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8ac0: 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  Raw(db, sizeof(*
8ad0: 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
8ae0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8af0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d  0;.  pNew->nId =
8b00: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
8b10: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
8b20: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e  llocRaw(db, p->n
8b30: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
8b40: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
8b50: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ->a==0 ){.    sq
8b60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8b70: 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  pNew);.    retur
8b80: 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f  n 0;.  }.  /* No
8b90: 74 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20  te that because 
8ba0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
8bb0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70  allocation for p
8bc0: 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a  ->a[] is not.  *
8bd0: 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20  * necessarily a 
8be0: 70 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71  power of two, sq
8bf0: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
8c00: 64 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63  d() may not be c
8c10: 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  alled.  ** on th
8c20: 65 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61  e duplicate crea
8c30: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
8c40: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
8c50: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
8c60: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
8c70: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
8c80: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
8c90: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
8ca0: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
8cb0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
8cc0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
8cd0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
8ce0: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8cf0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
8d00: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
8d10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
8d20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
8d30: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
8d40: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71  ite3SelectDup(sq
8d50: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
8d60: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
8d70: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
8d80: 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 66 28  , *pPrior;.  if(
8d90: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
8da0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
8db0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
8dc0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
8dd0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
8de0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8df0: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
8e00: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
8e10: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61  , p->pEList, fla
8e20: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  gs);.  pNew->pSr
8e30: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
8e40: 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72  stDup(db, p->pSr
8e50: 63 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  c, flags);.  pNe
8e60: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
8e70: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8e80: 2d 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29  ->pWhere, flags)
8e90: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
8ea0: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
8eb0: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
8ec0: 47 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b  GroupBy, flags);
8ed0: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
8ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8ef0: 70 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67  p(db, p->pHaving
8f00: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8f10: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
8f20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
8f30: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
8f40: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
8f50: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
8f60: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50  New->pPrior = pP
8f70: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
8f80: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  lectDup(db, p->p
8f90: 50 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20  Prior, flags);. 
8fa0: 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
8fb0: 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
8fc0: 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78  ew;.  pNew->pNex
8fd0: 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
8fe0: 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45  Limit = sqlite3E
8ff0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c  xprDup(db, p->pL
9000: 69 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  imit, flags);.  
9010: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
9020: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
9030: 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66  b, p->pOffset, f
9040: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69  lags);.  pNew->i
9050: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65  Limit = 0;.  pNe
9060: 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  w->iOffset = 0;.
9070: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
9080: 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26   = p->selFlags &
9090: 20 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72   ~SF_UsesEphemer
90a0: 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  al;.  pNew->addr
90b0: 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31  OpenEphm[0] = -1
90c0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
90d0: 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a  enEphm[1] = -1;.
90e0: 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52    pNew->nSelectR
90f0: 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow = p->nSelectR
9100: 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74  ow;.  pNew->pWit
9110: 68 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20  h = withDup(db, 
9120: 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c  p->pWith);.  sql
9130: 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d  ite3SelectSetNam
9140: 65 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e  e(pNew, p->zSelN
9150: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
9160: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
9170: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
9180: 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  ctDup(sqlite3 *d
9190: 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  b, Select *p, in
91a0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
91b0: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
91c0: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
91d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
91e0: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
91f0: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
9200: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
9210: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
9220: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
9230: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
9240: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9250: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
9260: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
9270: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65  or occurs, the e
9280: 6e 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72  ntire list is fr
9290: 65 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20  eed and.** NULL 
92a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
92b0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74   non-NULL is ret
92c0: 75 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69  urned, then it i
92d0: 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20  s guaranteed.** 
92e0: 74 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74  that the new ent
92f0: 72 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ry was successfu
9300: 6c 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  lly appended..*/
9310: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
9320: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9330: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9340: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
9350: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9360: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9370: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
9380: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
9390: 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65  append. Might be
93a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
93b0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
93c0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
93d0: 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e   to be appended.
93e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
93f0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
9400: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9410: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
9420: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
9430: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
9440: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78  ro(db, sizeof(Ex
9450: 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  prList) );.    i
9460: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
9470: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
9480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
9490: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  t->a = sqlite3Db
94a0: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
94b0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
94c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
94d0: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
94e0: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
94f0: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
9500: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
9510: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
9520: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
9530: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
9540: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
9550: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
9560: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
9570: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
9580: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
9590: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
95a0: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
95b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
95c0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
95d0: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
95e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
95f0: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
9600: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
9610: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9620: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
9630: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
9640: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
9650: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
9660: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
9670: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
9680: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9690: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
96a0: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
96b0: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
96c0: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
96d0: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
96e0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
96f0: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
9700: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
9710: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
9720: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
9730: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
9740: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
9750: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
9760: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
9770: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
9780: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
9790: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
97a0: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
97b0: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
97c0: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
97d0: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
97e0: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
97f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
9800: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
9810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9820: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
9830: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9840: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
9850: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9870: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9880: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9890: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
98a0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
98b0: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
98c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
98d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
98e0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
98f0: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
9900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9910: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
9920: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
9930: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
9940: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
9950: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9960: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
9970: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
9980: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9990: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
99a0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
99b0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
99c0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
99d0: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
99e0: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
99f0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
9a00: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
9a10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
9a20: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
9a30: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
9a40: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
9a50: 65 71 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d  equote && pItem-
9a60: 3e 7a 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33  >zName ) sqlite3
9a70: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
9a80: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
9a90: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
9aa0: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
9ab0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
9ac0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9ad0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
9ae0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
9af0: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
9b00: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
9b10: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
9b20: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
9b30: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
9b40: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
9b50: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
9b60: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
9b70: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9b80: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
9b90: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
9ba0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
9bb0: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
9bc0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
9bd0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9be0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9bf0: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
9c00: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
9c10: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
9c20: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
9c30: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
9c40: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
9c50: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
9c60: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9c70: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
9c80: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
9c90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
9ca0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
9cb0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9cc0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9cd0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
9ce0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9cf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
9d00: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
9d10: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
9d20: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
9d30: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
9d40: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
9d50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9d60: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
9d70: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
9d80: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
9d90: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
9da0: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
9de0: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
9df0: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
9e00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9e10: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
9e20: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
9e30: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
9e40: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
9e50: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9e60: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
9e70: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9e80: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
9e90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9ea0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9eb0: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
9ec0: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
9ed0: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
9ee0: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
9ef0: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
9f00: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
9f10: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
9f20: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
9f30: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
9f40: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9f50: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
9f60: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
9f70: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
9f80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
9f90: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
9fa0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
9fb0: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
9fc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
9fd0: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
9fe0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
9ff0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
a000: 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
a010: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
a020: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
a030: 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  i;.  struct Expr
a040: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
a050: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
a060: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
a070: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
a080: 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72   || pList->nExpr
a090: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74  ==0 );.  for(pIt
a0a0: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
a0b0: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
a0c0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
a0d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
a0e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
a0f0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
a100: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a110: 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
a120: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a130: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61  (db, pItem->zSpa
a140: 6e 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  n);.  }.  sqlite
a150: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
a160: 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
a170: 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
a180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
a190: 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f  rn the bitwise-O
a1a0: 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c  R of all Expr.fl
a1b0: 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68  ags fields in th
a1c0: 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c  e given.** ExprL
a1d0: 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ist..*/.u32 sqli
a1e0: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
a1f0: 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20  (const ExprList 
a200: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
a210: 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20  ;.  u32 m = 0;. 
a220: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
a230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
a240: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
a250: 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20 70 4c 69  .       m |= pLi
a260: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e  st->a[i].pExpr->
a270: 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
a280: 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a  .  return m;.}..
a290: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  /*.** These rout
a2a0: 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20  ines are Walker 
a2b0: 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64 20 74  callbacks used t
a2c0: 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  o check expressi
a2d0: 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66  ons to.** see if
a2e0: 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e 73 74   they are "const
a2f0: 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20 64 65  ant" for some de
a300: 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73  finition of cons
a310: 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61  tant.  The.** Wa
a320: 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65  lker.eCode value
a330: 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   determines the 
a340: 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e  type of "constan
a350: 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  t" we are lookin
a360: 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20  g.** for..**.** 
a370: 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b 20 72  These callback r
a380: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
a390: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
a3a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
a3b0: 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  **     sqlite3Ex
a3c0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 20  prIsConstant()  
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3e0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
a3f0: 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  1.**     sqlite3
a400: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
a410: 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20 20 20  tJoin()         
a420: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
a430: 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==2.**     sqlit
a440: 65 33 45 78 70 72 52 65 66 4f 6e 65 54 61 62 6c  e3ExprRefOneTabl
a450: 65 4f 6e 6c 79 28 29 20 20 20 20 20 20 20 20 20  eOnly()         
a460: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
a470: 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c  de==3.**     sql
a480: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
a490: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 20  ntOrFunction()  
a4a0: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
a4b0: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a  Code==4 or 5.**.
a4c0: 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  ** In all cases,
a4d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73 20 73   the callbacks s
a4e0: 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d  et Walker.eCode=
a4f0: 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66 20 74  0 and abort if t
a500: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
a510: 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74   is found to not
a520: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a   be a constant..
a530: 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  **.** The sqlite
a540: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a550: 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 75  rFunction() is u
a560: 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61 74 69  sed for evaluati
a570: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  ng expressions.*
a580: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
a590: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
a5a0: 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65  The Walker.eCode
a5b0: 20 76 61 6c 75 65 20 69 73 20 35 20 77 68 65 6e   value is 5 when
a5c0: 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65   parsing.** an e
a5d0: 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 20 61  xisting schema a
a5e0: 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63 65 73  nd 4 when proces
a5f0: 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61 74 65  sing a new state
a600: 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a  ment.  A bound.*
a610: 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61 69 73  * parameter rais
a620: 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  es an error for 
a630: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  new statements, 
a640: 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c 79 20  but is silently 
a650: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
a660: 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74 69 6e  NULL for existin
a670: 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68 69 73  g schemas.  This
a680: 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d   allows sqlite_m
a690: 61 73 74 65 72 20 74 61 62 6c 65 73 20 74 68 61  aster tables tha
a6a0: 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20  t .** contain a 
a6b0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
a6c0: 62 65 63 61 75 73 65 20 74 68 65 79 20 77 65 72  because they wer
a6d0: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 6f  e generated by o
a6e0: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  lder versions.**
a6f0: 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20 62 65   of SQLite to be
a700: 20 70 61 72 73 65 64 20 62 79 20 6e 65 77 65 72   parsed by newer
a710: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
a720: 69 74 65 20 77 69 74 68 6f 75 74 20 72 61 69 73  ite without rais
a730: 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d  ing a.** malform
a740: 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f 72 2e  ed schema error.
a750: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
a760: 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  xprNodeIsConstan
a770: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
a780: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
a790: 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65  ..  /* If pWalke
a7a0: 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20 74 68  r->eCode is 2 th
a7b0: 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20 74  en any term of t
a7c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
a7d0: 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20  at comes from.  
a7e0: 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  ** the ON or USI
a7f0: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
a800: 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71 75 61  left join disqua
a810: 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65  lifies the expre
a820: 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20  ssion.  ** from 
a830: 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64  being considered
a840: 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20   constant. */.  
a850: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
a860: 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48 61 73  de==2 && ExprHas
a870: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
a880: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
a890: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
a8a0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  de = 0;.    retu
a8b0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
a8c0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  }..  switch( pEx
a8d0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  pr->op ){.    /*
a8e0: 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63 74 69   Consider functi
a8f0: 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73 74 61  ons to be consta
a900: 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69 72 20  nt if all their 
a910: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 63 6f  arguments are co
a920: 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e  nstant.    ** an
a930: 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b 65 72  d either pWalker
a940: 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20  ->eCode==4 or 5 
a950: 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  or the function 
a960: 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 53  has the.    ** S
a970: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
a980: 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61   flag. */.    ca
a990: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
a9a0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
a9b0: 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45  r->eCode>=4 || E
a9c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a9d0: 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e  Expr,EP_ConstFun
a9e0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  c) ){.        re
a9f0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
aa00: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
aa10: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
aa20: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  >eCode = 0;.    
aa30: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
aa40: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
aa50: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
aa60: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
aa70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
aa80: 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
aa90: 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
aaa0: 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61  MN:.      testca
aab0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
aac0: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 74 65  K_ID );.      te
aad0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
aae0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
aaf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ab00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
ab10: 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
ab20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
ab30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
ab40: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
ab50: 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  if( pWalker->eCo
ab60: 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72 2d 3e  de==3 && pExpr->
ab70: 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d  iTable==pWalker-
ab80: 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20 20 20  >u.iCur ){.     
ab90: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
aba0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
abb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
abc0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
abd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
abe0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
abf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56   }.    case TK_V
ac00: 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 69  ARIABLE:.      i
ac10: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
ac20: 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20  e==5 ){.        
ac30: 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76  /* Silently conv
ac40: 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  ert bound parame
ac50: 74 65 72 73 20 74 68 61 74 20 61 70 70 65 61 72  ters that appear
ac60: 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45 41 54   inside of CREAT
ac70: 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61  E.        ** sta
ac80: 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e  tements into a N
ac90: 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ULL when parsing
aca0: 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74   the CREATE stat
acb0: 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74 0a 20  ement text out. 
acc0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
acd0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
ace0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
acf0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
ad00: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULL;.      }else
ad10: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
ad20: 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  ode==4 ){.      
ad30: 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70 61 72    /* A bound par
ad40: 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52 45 41  ameter in a CREA
ad50: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  TE statement tha
ad60: 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
ad70: 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c  m.        ** sql
ad80: 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 20 63  ite3_prepare() c
ad90: 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72 20 2a  auses an error *
ada0: 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  /.        pWalke
adb0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
adc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
add0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
ade0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
adf0: 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64 65 66  rough */.    def
ae00: 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65 73 74  ault:.      test
ae10: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
ae20: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a  =TK_SELECT ); /*
ae30: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
ae40: 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c  stant will disal
ae50: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  low */.      tes
ae60: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
ae70: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f  ==TK_EXISTS ); /
ae80: 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f  * selectNodeIsCo
ae90: 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73 61  nstant will disa
aea0: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  llow */.      re
aeb0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
aec0: 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  e;.  }.}.static 
aed0: 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65 49 73  int selectNodeIs
aee0: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
aef0: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
af00: 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
af10: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
af20: 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b  otUsed);.  pWalk
af30: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
af40: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
af50: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  t;.}.static int 
af60: 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78 70 72  exprIsConst(Expr
af70: 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61   *p, int initFla
af80: 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20  g, int iCur){.  
af90: 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
afa0: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
afb0: 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20  (w));.  w.eCode 
afc0: 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e  = initFlag;.  w.
afd0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
afe0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
aff0: 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  nt;.  w.xSelectC
b000: 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
b010: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a  NodeIsConstant;.
b020: 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69 43 75    w.u.iCur = iCu
b030: 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  r;.  sqlite3Walk
b040: 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72  Expr(&w, p);.  r
b050: 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d  eturn w.eCode;.}
b060: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
b070: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
b080: 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
b090: 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  o if the express
b0a0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
b0b0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
b0c0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
b0d0: 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  s or function ca
b0e0: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  lls..**.** For t
b0f0: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
b100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
b110: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
b120: 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29  ring (ex: "abc")
b130: 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65  .** is considere
b140: 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74  d a variable but
b150: 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64   a single-quoted
b160: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62   string (ex: 'ab
b170: 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73  c') is.** a cons
b180: 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tant..*/.int sql
b190: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b1a0: 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72  nt(Expr *p){.  r
b1b0: 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73  eturn exprIsCons
b1c0: 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f  t(p, 1, 0);.}../
b1d0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b1e0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b1f0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b200: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b210: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b220: 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69  that does no ori
b230: 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20  ginate from the 
b240: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
b250: 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a  ses of a join..*
b260: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74  * Return 0 if it
b270: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
b280: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
b290: 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66  calls or terms f
b2a0: 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20  rom.** an ON or 
b2b0: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f  USING clause..*/
b2c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b2d0: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
b2e0: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
b2f0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
b300: 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  (p, 2, 0);.}../*
b310: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
b320: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
b330: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
b340: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b350: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20  constant.** for 
b360: 61 6e 79 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  any single row o
b370: 66 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  f the table with
b380: 20 63 75 72 73 6f 72 20 69 43 75 72 2e 20 20 49   cursor iCur.  I
b390: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
b3a0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
b3b0: 20 6d 75 73 74 20 6e 6f 74 20 72 65 66 65 72 20   must not refer 
b3c0: 74 6f 20 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72  to any non-deter
b3d0: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
b3e0: 6e 20 6e 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62  n nor any.** tab
b3f0: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 69 43  le other than iC
b400: 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
b410: 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e  e3ExprIsTableCon
b420: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 2c 20 69  stant(Expr *p, i
b430: 6e 74 20 69 43 75 72 29 7b 0a 20 20 72 65 74 75  nt iCur){.  retu
b440: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b450: 2c 20 33 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f  , 3, iCur);.}../
b460: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b470: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b480: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b490: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b4a0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b4b0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  or a function ca
b4c0: 6c 6c 20 77 69 74 68 20 63 6f 6e 73 74 61 6e 74  ll with constant
b4d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74   arguments.  Ret
b4e0: 75 72 6e 20 61 6e 64 20 30 20 69 66 20 74 68 65  urn and 0 if the
b4f0: 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 76 61  re.** are any va
b500: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
b510: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
b520: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
b530: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
b540: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
b550: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
b560: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
b570: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
b580: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
b590: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
b5a0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
b5b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
b5c0: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
b5d0: 28 45 78 70 72 20 2a 70 2c 20 75 38 20 69 73 49  (Expr *p, u8 isI
b5e0: 6e 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nit){.  assert( 
b5f0: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49  isInit==0 || isI
b600: 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  nit==1 );.  retu
b610: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b620: 2c 20 34 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a  , 4+isInit, 0);.
b630: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
b640: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64  expression p cod
b650: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
b660: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
b670: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
b680: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
b690: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
b6a0: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
b6b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
b6c0: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
b6d0: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
b6e0: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
b6f0: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
b700: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
b710: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
b720: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
b730: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
b740: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
b750: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
b760: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
b770: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
b780: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74   *pValue){.  int
b790: 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49   rc = 0;..  /* I
b7a0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
b7b0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69  is an integer li
b7c0: 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20  teral that fits 
b7d0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
b7e0: 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  it.  ** integer,
b7f0: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74   then the EP_Int
b800: 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20  Value flag will 
b810: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
b820: 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72  n set */.  asser
b830: 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54  t( p->op!=TK_INT
b840: 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67  EGER || (p->flag
b850: 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  s & EP_IntValue)
b860: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  !=0.           |
b870: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
b880: 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  2(p->u.zToken, &
b890: 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  rc)==0 );..  if(
b8a0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49   p->flags & EP_I
b8b0: 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a  ntValue ){.    *
b8c0: 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56  pValue = p->u.iV
b8d0: 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  alue;.    return
b8e0: 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68   1;.  }.  switch
b8f0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
b900: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
b910: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
b920: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
b930: 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65  p->pLeft, pValue
b940: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b950: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b960: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
b970: 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69    int v;.      i
b980: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
b990: 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74  Integer(p->pLeft
b9a0: 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
b9b0: 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31   assert( v!=(-21
b9c0: 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20  47483647-1) );. 
b9d0: 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d         *pValue =
b9e0: 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20   -v;.        rc 
b9f0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
ba00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba10: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
ba20: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
ba30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
ba40: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
ba50: 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
ba60: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
ba70: 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c  sion can be NULL
ba80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
ba90: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
baa0: 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  be NULL or if th
bab0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
bac0: 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74  too complex.** t
bad0: 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52  o tell return TR
bae0: 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  UE.  .**.** This
baf0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
bb00: 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   as an optimizat
bb10: 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f  ion, to skip OP_
bb20: 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  IsNull opcodes.*
bb30: 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74  * when we know t
bb40: 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e  hat a value cann
bb50: 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e  ot be NULL.  Hen
bb60: 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69  ce, a false posi
bb70: 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69  tive.** (returni
bb80: 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20  ng TRUE when in 
bb90: 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73  fact the express
bba0: 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65  ion can never be
bbb0: 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20   NULL) might.** 
bbc0: 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f  be a small perfo
bbd0: 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69  rmance hit but i
bbe0: 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d  s otherwise harm
bbf0: 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74  less.  On the ot
bc00: 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66  her.** hand, a f
bc10: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72  alse negative (r
bc20: 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77  eturning FALSE w
bc30: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
bc40: 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a  ould be NULL).**
bc50: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
bc60: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72  ult in an incorr
bc70: 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20  ect answer.  So 
bc80: 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  when in doubt, r
bc90: 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a  eturn.** TRUE..*
bca0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
bcb0: 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74  rCanBeNull(const
bcc0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20   Expr *p){.  u8 
bcd0: 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  op;.  while( p->
bce0: 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20  op==TK_UPLUS || 
bcf0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53  p->op==TK_UMINUS
bd00: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74   ){ p = p->pLeft
bd10: 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70  ; }.  op = p->op
bd20: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52  ;.  if( op==TK_R
bd30: 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70  EGISTER ) op = p
bd40: 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28  ->op2;.  switch(
bd50: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
bd60: 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20  TK_INTEGER:.    
bd70: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
bd80: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41      case TK_FLOA
bd90: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  T:.    case TK_B
bda0: 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72  LOB:.      retur
bdb0: 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  n 0;.    case TK
bdc0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61  _COLUMN:.      a
bdd0: 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d  ssert( p->pTab!=
bde0: 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
bdf0: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
be00: 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c  y(p, EP_CanBeNul
be10: 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  l) ||.          
be20: 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d     (p->iColumn>=
be30: 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43  0 && p->pTab->aC
be40: 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e  ol[p->iColumn].n
be50: 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20  otNull==0);.    
be60: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
be70: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
be80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
be90: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  E if the given e
bea0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
beb0: 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f  onstant which wo
bec0: 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e  uld be.** unchan
bed0: 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69  ged by OP_Affini
bee0: 74 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69  ty with the affi
bef0: 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68  nity given in th
bf00: 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
bf10: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ment..**.** This
bf20: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
bf30: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
bf40: 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79   the OP_Affinity
bf50: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61   operation.** ca
bf60: 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57  n be omitted.  W
bf70: 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74  hen in doubt ret
bf80: 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61  urn FALSE.  A fa
bf90: 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  lse negative.** 
bfa0: 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20  is harmless.  A 
bfb0: 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20  false positive, 
bfc0: 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73  however, can res
bfd0: 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  ult in the wrong
bfe0: 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69  .** answer..*/.i
bff0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65  nt sqlite3ExprNe
c000: 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61  edsNoAffinityCha
c010: 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  nge(const Expr *
c020: 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20  p, char aff){.  
c030: 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66  u8 op;.  if( aff
c040: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
c050: 45 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  E ) return 1;.  
c060: 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  while( p->op==TK
c070: 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d  _UPLUS || p->op=
c080: 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20  =TK_UMINUS ){ p 
c090: 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20  = p->pLeft; }.  
c0a0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66  op = p->op;.  if
c0b0: 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ( op==TK_REGISTE
c0c0: 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b  R ) op = p->op2;
c0d0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
c0e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
c0f0: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65  EGER: {.      re
c100: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
c110: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
c120: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c130: 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20  NUMERIC;.    }. 
c140: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
c150: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c160: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
c170: 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51  _REAL || aff==SQ
c180: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c1a0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
c1b0: 20 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d      return aff==
c1c0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
c1d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c1e0: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
c1f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
c200: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
c210: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  UMN: {.      ass
c220: 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d  ert( p->iTable>=
c230: 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f  0 );  /* p canno
c240: 74 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43  t be part of a C
c250: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
c260: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
c270: 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20  p->iColumn<0.   
c280: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
c290: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c2a0: 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ER || aff==SQLIT
c2b0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a  E_AFF_NUMERIC);.
c2c0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c2d0: 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t: {.      retur
c2e0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  n 0;.    }.  }.}
c2f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
c300: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
c310: 20 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77   string is a row
c320: 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  -id column name.
c330: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
c340: 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61  sRowid(const cha
c350: 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c  r *z){.  if( sql
c360: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
c370: 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72  _ROWID_")==0 ) r
c380: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
c390: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
c3a0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
c3b0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
c3c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
c3d0: 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74   "OID")==0 ) ret
c3e0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
c3f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
c400: 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 61 72  rn true if we ar
c410: 65 20 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e  e able to the IN
c420: 20 6f 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69   operator optimi
c430: 7a 61 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71  zation on a.** q
c440: 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
c450: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49  .**.**       x I
c460: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a  N (SELECT ...).*
c470: 2a 0a 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53  *.** Where the S
c480: 45 4c 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20  ELECT... clause 
c490: 69 73 20 61 73 20 73 70 65 63 69 66 69 65 64 20  is as specified 
c4a0: 62 79 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  by the parameter
c4b0: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   to this.** rout
c4c0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ine..**.** The S
c4d0: 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73  elect object pas
c4e0: 73 65 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61  sed in has alrea
c4f0: 64 79 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65  dy been preproce
c500: 73 73 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65  ssed and no.** e
c510: 72 72 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20  rrors have been 
c520: 66 6f 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  found..*/.#ifnde
c530: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c540: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e  BQUERY.static in
c550: 74 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  t isCandidateFor
c560: 49 6e 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29  InOpt(Select *p)
c570: 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  {.  SrcList *pSr
c580: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
c590: 45 4c 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a  EList;.  Table *
c5a0: 70 54 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pTab;.  if( p==0
c5b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c5d0: 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  * right-hand sid
c5e0: 65 20 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43  e of IN is SELEC
c5f0: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  T */.  if( p->pP
c600: 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c620: 20 4e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20   Not a compound 
c630: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20  SELECT */.  if( 
c640: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
c650: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
c660: 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
c670: 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65  testcase( (p->se
c680: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
c690: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
c6a0: 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
c6b0: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
c6c0: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
c6d0: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
c6e0: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
c6f0: 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
c700: 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
c710: 4e 6f 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  No DISTINCT keyw
c720: 6f 72 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65  ord and no aggre
c730: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
c740: 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  /.  }.  assert( 
c750: 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  p->pGroupBy==0 )
c760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c770: 2a 20 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  * Has no GROUP B
c780: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66  Y clause */.  if
c790: 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65  ( p->pLimit ) re
c7a0: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
c7b0: 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c       /* Has no L
c7c0: 49 4d 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20  IMIT clause */. 
c7d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
c7e0: 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  set==0 );       
c7f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49          /* No LI
c800: 4d 49 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46  MIT means no OFF
c810: 53 45 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  SET */.  if( p->
c820: 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
c830: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c840: 2f 2a 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20  /* Has no WHERE 
c850: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63  clause */.  pSrc
c860: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
c870: 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
c880: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
c890: 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
c8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
c8b0: 67 6c 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d  gle term in FROM
c8c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28   clause */.  if(
c8d0: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c   pSrc->a[0].pSel
c8e0: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ect ) return 0; 
c8f0: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e      /* FROM is n
c900: 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  ot a subquery or
c910: 20 76 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20   view */.  pTab 
c920: 3d 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  = pSrc->a[0].pTa
c930: 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  b;.  if( NEVER(p
c940: 54 61 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  Tab==0) ) return
c950: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   0;.  assert( pT
c960: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
c970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c980: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e  FROM clause is n
c990: 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69  ot a view */.  i
c9a0: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
c9b0: 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  b) ) return 0;  
c9c0: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
c9d0: 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75  ause not a virtu
c9e0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45  al table */.  pE
c9f0: 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
ca00: 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ;.  if( pEList->
ca10: 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
ca20: 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  n 0;       /* On
ca30: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
ca40: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
ca50: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  if( pEList->a[0]
ca60: 2e 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  .pExpr->op!=TK_C
ca70: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
ca80: 3b 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61  ; /* Result is a
ca90: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74   column */.  ret
caa0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
cab0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
cac0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
cad0: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63  * Code an OP_Onc
cae0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  e instruction an
caf0: 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  d allocate space
cb00: 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52   for its flag. R
cb10: 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64  eturn the .** ad
cb20: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
cb30: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
cb40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
cb50: 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72  Once(Parse *pPar
cb60: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
cb70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
cb80: 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
cb90: 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
cba0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
cbb0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
cbc0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
cbd0: 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e  _Once, pParse->n
cbe0: 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Once++);.}../*.*
cbf0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
cc00: 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
cc10: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
cc20: 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
cc30: 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
cc40: 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
cc50: 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
cc60: 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
cc70: 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
cc80: 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
cc90: 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
cca0: 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
ccb0: 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
ccc0: 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
ccd0: 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
cce0: 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
ccf0: 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
cd00: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
cd10: 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
cd20: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
cd30: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
cd40: 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
cd50: 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
cd60: 0a 20 20 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c  .  int j1;.  sql
cd70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cd80: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
cd90: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
cda0: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
cdb0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
cdc0: 69 6e 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65  ind, iCur); Vdbe
cdd0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
cde0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
cdf0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
ce00: 43 75 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75  Cur, 0, regHasNu
ce10: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ll);.  sqlite3Vd
ce20: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
ce30: 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
ce40: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
ce50: 76 2c 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f  v, "first_entry_
ce60: 69 6e 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b  in(%d)", iCur));
ce70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
ce80: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d  mpHere(v, j1);.}
ce90: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
cea0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
ceb0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
cec0: 6e 74 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  nt is an IN oper
ced0: 61 74 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74  ator with a list
cee0: 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79   (not a subquery
cef0: 29 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67  ) on the .** rig
cf00: 68 74 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52  ht-hand side.  R
cf10: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
cf20: 61 74 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74  at list is const
cf30: 61 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ant..*/.static i
cf40: 6e 74 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49  nt sqlite3InRhsI
cf50: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
cf60: 70 49 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c  pIn){.  Expr *pL
cf70: 48 53 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  HS;.  int res;. 
cf80: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
cf90: 73 50 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45  sProperty(pIn, E
cfa0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
cfb0: 20 20 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c    pLHS = pIn->pL
cfc0: 65 66 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66  eft;.  pIn->pLef
cfd0: 74 20 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73  t = 0;.  res = s
cfe0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
cff0: 74 61 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e  tant(pIn);.  pIn
d000: 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a  ->pLeft = pLHS;.
d010: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
d020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
d030: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
d040: 73 65 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65  sed by the imple
d050: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
d060: 20 49 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74   IN (...) operat
d070: 6f 72 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61  or..** The pX pa
d080: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
d090: 78 70 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65  xpression on the
d0a0: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
d0b0: 70 65 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a  perator, which.*
d0c0: 2a 20 6d 69 67 68 74 20 62 65 20 65 69 74 68 65  * might be eithe
d0d0: 72 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  r a list of expr
d0e0: 65 73 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62  essions or a sub
d0f0: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
d100: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
d110: 74 69 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20  tine is to find 
d120: 6f 72 20 63 72 65 61 74 65 20 61 20 62 2d 74 72  or create a b-tr
d130: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ee object that c
d140: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69  an.** be used ei
d150: 74 68 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72  ther to test for
d160: 20 6d 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74   membership in t
d170: 68 65 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f  he RHS set or to
d180: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
d190: 0a 2a 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  .** all members 
d1a0: 6f 66 20 74 68 65 20 52 48 53 20 73 65 74 2c 20  of the RHS set, 
d1b0: 73 6b 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61  skipping duplica
d1c0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72  tes..**.** A cur
d1d0: 73 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  sor is opened on
d1e0: 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
d1f0: 63 74 20 74 68 61 74 20 69 73 20 74 68 65 20 52  ct that is the R
d200: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d210: 72 61 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d  rator.** and pX-
d220: 3e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  >iTable is set t
d230: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
d240: 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  hat cursor..**.*
d250: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
d260: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
d270: 63 74 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20  ction indicates 
d280: 74 68 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c  the b-tree type,
d290: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d2a0: 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f  **   IN_INDEX_RO
d2b0: 57 49 44 20 20 20 20 20 20 2d 20 54 68 65 20 63  WID      - The c
d2c0: 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  ursor was opened
d2d0: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
d2e0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
d2f0: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d  DEX_INDEX_ASC  -
d300: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
d310: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63  opened on an asc
d320: 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a  ending index..**
d330: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45     IN_INDEX_INDE
d340: 58 5f 44 45 53 43 20 2d 20 54 68 65 20 63 75 72  X_DESC - The cur
d350: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
d360: 6e 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69  n a descending i
d370: 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  ndex..**   IN_IN
d380: 44 45 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d  DEX_EPH        -
d390: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
d3a0: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63  opened on a spec
d3b0: 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e  ially created an
d3c0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 70               pop
d3e0: 75 6c 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c  ulated epheremal
d3f0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f   table..**   IN_
d400: 49 4e 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20  INDEX_NOOP      
d410: 20 2d 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73   - No cursor was
d420: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65   allocated.  The
d430: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
d440: 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
d470: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
d480: 70 61 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  parisons..**.** 
d490: 41 6e 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72  An existing b-tr
d4a0: 65 65 20 6d 69 67 68 74 20 62 65 20 75 73 65 64  ee might be used
d4b0: 20 69 66 20 74 68 65 20 52 48 53 20 65 78 70 72   if the RHS expr
d4c0: 65 73 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73  ession pX is a s
d4d0: 69 6d 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72  imple.** subquer
d4e0: 79 20 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a  y such as:.**.**
d4f0: 20 20 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c       SELECT <col
d500: 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65  umn> FROM <table
d510: 3e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52  >.**.** If the R
d520: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
d530: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
d540: 6f 72 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  or a more comple
d550: 78 20 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e  x subquery, then
d560: 0a 2a 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  .** an ephemeral
d570: 20 74 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65   table might nee
d580: 64 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  d to be generate
d590: 64 20 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61  d from the RHS a
d5a0: 6e 64 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69  nd then.** pX->i
d5b0: 54 61 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f  Table made to po
d5c0: 69 6e 74 20 74 6f 20 74 68 65 20 65 70 68 65 6d  int to the ephem
d5d0: 65 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65  eral table inste
d5e0: 61 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73  ad of an.** exis
d5f0: 74 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  ting table..**.*
d600: 2a 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61  * The inFlags pa
d610: 72 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e  rameter must con
d620: 74 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  tain exactly one
d630: 20 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20   of the bits.** 
d640: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
d650: 48 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f  HIP or IN_INDEX_
d660: 4c 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67  LOOP.  If inFlag
d670: 73 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e  s contains.** IN
d680: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
d690: 50 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65  P, then the gene
d6a0: 72 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c  rated table will
d6b0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a   be used for a.*
d6c0: 2a 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69  * fast membershi
d6d0: 70 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68  p test.  When th
d6e0: 65 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20  e IN_INDEX_LOOP 
d6f0: 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a  bit is set, the.
d700: 2a 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c  ** IN index will
d710: 20 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70   be used to loop
d720: 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73   over all values
d730: 20 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   of the RHS of t
d740: 68 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f  he.** IN operato
d750: 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  r..**.** When IN
d760: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75  _INDEX_LOOP is u
d770: 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74  sed (and the b-t
d780: 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ree will be used
d790: 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
d7a0: 68 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d  hrough the set m
d7b0: 65 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65  embers) then the
d7c0: 20 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74   b-tree must not
d7d0: 20 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61   contain duplica
d7e0: 74 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72  tes..** An epher
d7f0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
d800: 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74  be used unless t
d810: 68 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c  he selected <col
d820: 75 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65  umn> is guarante
d830: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71  ed.** to be uniq
d840: 75 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61  ue - either beca
d850: 75 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54  use it is an INT
d860: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
d870: 20 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20   or it.** has a 
d880: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
d890: 74 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65  t or UNIQUE inde
d8a0: 78 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e  x..**.** When IN
d8b0: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
d8c0: 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
d8d0: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
d8e0: 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66  e used .** for f
d8f0: 61 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68  ast set membersh
d900: 69 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61  ip tests) then a
d910: 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  n epheremal tabl
d920: 65 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73  e must .** be us
d930: 65 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d  ed unless <colum
d940: 6e 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  n> is an INTEGER
d950: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
d960: 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a  an index can .**
d970: 20 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c   be found with <
d980: 63 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c  column> as its l
d990: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e  eft-most column.
d9a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e  .**.** If the IN
d9b0: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61  _INDEX_NOOP_OK a
d9c0: 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42  nd IN_INDEX_MEMB
d9d0: 45 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20  ERSHIP are both 
d9e0: 73 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  set and.** if th
d9f0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
da00: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
da10: 73 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65  st (not a subque
da20: 72 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a  ry) then this.**
da30: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64   routine might d
da40: 65 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74  ecide that creat
da50: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
da60: 20 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62   b-tree for memb
da70: 65 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e  ership.** testin
da80: 67 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69  g is too expensi
da90: 76 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e  ve and return IN
daa0: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e  _INDEX_NOOP.  In
dab0: 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a   that case, the.
dac0: 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
dad0: 6e 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d  ne should implem
dae0: 65 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61  ent the IN opera
daf0: 74 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75  tor using a sequ
db00: 65 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72  ence.** of Eq or
db10: 20 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f   Ne comparison o
db20: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
db30: 20 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   When the b-tree
db40: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66   is being used f
db50: 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  or membership te
db60: 73 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  sts, the calling
db70: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67   function.** mig
db80: 68 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ht need to know 
db90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
dba0: 68 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74  he RHS side of t
dbb0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
dbc0: 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c  * contains a NUL
dbd0: 4c 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e  L.  If prRhsHasN
dbe0: 75 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c  ull is not a NUL
dbf0: 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a  L pointer and .*
dc00: 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  * if there is an
dc10: 79 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  y chance that th
dc20: 65 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f  e (...) might co
dc30: 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c  ntain a NULL val
dc40: 75 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65  ue at.** runtime
dc50: 2c 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65  , then a registe
dc60: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  r is allocated a
dc70: 6e 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20  nd the register 
dc80: 6e 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a  number written.*
dc90: 2a 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75  * to *prRhsHasNu
dca0: 6c 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ll. If there is 
dcb0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
dcc0: 68 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e  he (...) contain
dcd0: 73 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  s a.** NULL valu
dce0: 65 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61  e, then *prRhsHa
dcf0: 73 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e  sNull is left un
dd00: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
dd10: 66 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  f a register is 
dd20: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74  allocated and it
dd30: 73 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65  s location store
dd40: 64 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  d in *prRhsHasNu
dd50: 6c 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ll, then.** the 
dd60: 76 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65  value in that re
dd70: 67 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e  gister will be N
dd80: 55 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65  ULL if the b-tre
dd90: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  e contains one o
dda0: 72 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76  r more.** NULL v
ddb0: 61 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69  alues, and it wi
ddc0: 6c 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e  ll be some non-N
ddd0: 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65  ULL value if the
dde0: 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
ddf0: 20 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75   no.** NULL valu
de00: 65 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  es..*/.#ifndef S
de10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
de20: 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ERY.int sqlite3F
de30: 69 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65  indInIndex(Parse
de40: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
de50: 70 58 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c  pX, u32 inFlags,
de60: 20 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75   int *prRhsHasNu
de70: 6c 6c 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ll){.  Select *p
de80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dea0: 53 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69  SELECT to the ri
deb0: 67 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ght of IN operat
dec0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  or */.  int eTyp
ded0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
def0: 20 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62   Type of RHS tab
df00: 6c 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a  le. IN_INDEX_* *
df10: 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
df20: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
df30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
df40: 73 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74  sor of the RHS t
df50: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75  able */.  int mu
df60: 73 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20  stBeUnique;     
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 2f 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d  /* True if RHS m
df90: 75 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f  ust be unique */
dfa0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
dfb0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
dfc0: 73 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74  se);     /* Virt
dfd0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e  ual machine bein
dfe0: 67 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73  g coded */..  as
dff0: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
e000: 5f 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55  _IN );.  mustBeU
e010: 6e 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73  nique = (inFlags
e020: 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50   & IN_INDEX_LOOP
e030: 29 21 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  )!=0;..  /* Chec
e040: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65  k to see if an e
e050: 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72  xisting table or
e060: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
e070: 65 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73  ed to.  ** satis
e080: 66 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54  fy the query.  T
e090: 68 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c  his is preferabl
e0a0: 65 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20  e to generating 
e0b0: 61 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65  a new .  ** ephe
e0c0: 6d 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a  meral table..  *
e0d0: 2f 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73  /.  p = (ExprHas
e0e0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
e0f0: 78 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d  xIsSelect) ? pX-
e100: 3e 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b  >x.pSelect : 0);
e110: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
e120: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
e130: 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72  & isCandidateFor
e140: 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20  InOpt(p) ){.    
e150: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
e160: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
e170: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
e180: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
e190: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
e1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e1c0: 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f  able <table>. */
e1d0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
e1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e200: 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d  xpression <colum
e210: 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43  n> */.    i16 iC
e220: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
e250: 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a  umn <column> */.
e260: 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20      i16 iDb;    
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
e290: 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70  tabase idx for p
e2a0: 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  Tab */..    asse
e2b0: 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20  rt( p );        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
e2e0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
e2f0: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
e300: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
e310: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
e320: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
e330: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
e340: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
e350: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  rt( p->pEList->a
e360: 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20  [0].pExpr!=0 ); 
e370: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
e380: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
e390: 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65  t(p) */.    asse
e3a0: 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
e3b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e3c0: 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73  /* Because of is
e3d0: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
e3e0: 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62  t(p) */.    pTab
e3f0: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
e400: 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72  .pTab;.    pExpr
e410: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
e420: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43  0].pExpr;.    iC
e430: 6f 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d  ol = (i16)pExpr-
e440: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20  >iColumn;.   .  
e450: 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f    /* Code an OP_
e460: 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  Transaction and 
e470: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72  OP_TableLock for
e480: 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
e490: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e4a0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
e4b0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
e4c0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
e4d0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
e4e0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
e4f0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
e500: 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
e510: 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
e520: 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a  >zName);..    /*
e530: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e540: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
e550: 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49  om two places. I
e560: 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65  n both cases the
e570: 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73   vdbe.    ** has
e580: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
e590: 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75  located. So assu
e5a0: 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62  me sqlite3GetVdb
e5b0: 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20  e() is always.  
e5c0: 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
e5d0: 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
e5e0: 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20   assert(v);.    
e5f0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e600: 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20      int iAddr = 
e610: 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28  sqlite3CodeOnce(
e620: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56  pParse);.      V
e630: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e640: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
e650: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
e660: 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c  iTab, iDb, pTab,
e670: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20   OP_OpenRead);. 
e680: 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f       eType = IN_
e690: 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20  INDEX_ROWID;..  
e6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
e6b0: 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72  umpHere(v, iAddr
e6c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e6d0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
e700: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
e710: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ..      /* The c
e720: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e730: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  e used by the co
e740: 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20  mparison. If an 
e750: 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20  index is to.    
e760: 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20    ** be used in 
e770: 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d  place of a temp-
e780: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
e790: 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64  e ordered accord
e7a0: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ing.      ** to 
e7b0: 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  this collation s
e7c0: 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  equence.  */.   
e7d0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71     CollSeq *pReq
e7e0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
e7f0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
e800: 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74  Parse, pX->pLeft
e810: 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20  , pExpr);..     
e820: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
e830: 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  he affinity that
e840: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
e850: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20   perform the .  
e860: 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
e870: 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  n is the same as
e880: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66   the affinity of
e890: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a   the column. If.
e8a0: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
e8b0: 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ot, it is not po
e8c0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e  ssible to use an
e8d0: 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a  y index..      *
e8e0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69  /.      int affi
e8f0: 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65  nity_ok = sqlite
e900: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
e910: 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  (pX, pTab->aCol[
e920: 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b  iCol].affinity);
e930: 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78  ..      for(pIdx
e940: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
e950: 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20  Idx && eType==0 
e960: 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20  && affinity_ok; 
e970: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
e980: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
e990: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
e9a0: 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20  ]==iCol).       
e9b0: 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64    && sqlite3Find
e9c0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
e9d0: 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  db), pIdx->azCol
e9e0: 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20  l[0], 0)==pReq. 
e9f0: 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73          && (!mus
ea00: 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49  tBeUnique || (pI
ea10: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26  dx->nKeyCol==1 &
ea20: 26 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  & IsUniqueIndex(
ea30: 70 49 64 78 29 29 29 0a 20 20 20 20 20 20 20 20  pIdx))).        
ea40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
ea50: 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
ea60: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
ea70: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
ea80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ea90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
eaa0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
eab0: 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  Tab, pIdx->tnum,
eac0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20   iDb);.         
ead0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50   sqlite3VdbeSetP
eae0: 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  4KeyInfo(pParse,
eaf0: 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
eb00: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
eb10: 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e  , "%s", pIdx->zN
eb20: 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ame));.         
eb30: 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45   assert( IN_INDE
eb40: 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20  X_INDEX_DESC == 
eb50: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41  IN_INDEX_INDEX_A
eb60: 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  SC+1 );.        
eb70: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
eb80: 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70  EX_INDEX_ASC + p
eb90: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
eba0: 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69  0];..          i
ebb0: 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  f( prRhsHasNull 
ebc0: 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  && !pTab->aCol[i
ebd0: 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a  Col].notNull ){.
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52              *prR
ebf0: 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50  hsHasNull = ++pP
ec00: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
ec10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
ec20: 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c  etHasNullFlag(v,
ec30: 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73   iTab, *prRhsHas
ec40: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  Null);.         
ec50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
ec60: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
ec70: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
ec80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ec90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
eca0: 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20   no preexisting 
ecb0: 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62  index is availab
ecc0: 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c  le for the IN cl
ecd0: 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  ause.  ** and IN
ece0: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61  _INDEX_NOOP is a
ecf0: 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a  n allowed reply.
ed00: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53    ** and the RHS
ed10: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
ed20: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e  tor is a list, n
ed30: 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20  ot a subquery.  
ed40: 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69  ** and the RHS i
ed50: 73 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72  s not contant or
ed60: 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65   has two or fewe
ed70: 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68  r terms,.  ** th
ed80: 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72  en it is not wor
ed90: 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65  th creating an e
eda0: 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  phemeral table t
edb0: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
edc0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
edd0: 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
ede0: 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
edf0: 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
ee00: 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
ee10: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
ee20: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
ee30: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
ee40: 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
ee50: 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
ee60: 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
ee70: 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
ee80: 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
ee90: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
eea0: 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a  NOOP;.  }.     .
eeb0: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
eec0: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
eed0: 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
eee0: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
eef0: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
ef00: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
ef10: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
ef20: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
ef30: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
ef40: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
ef50: 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
ef60: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
ef70: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
ef80: 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
ef90: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
efa0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
efb0: 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
efc0: 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
efd0: 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
efe0: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
eff0: 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
f000: 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
f010: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
f020: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
f030: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
f040: 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
f050: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
f060: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
f070: 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
f080: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
f090: 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
f0a0: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
f0b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
f0c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
f0d0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
f0e0: 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
f0f0: 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
f100: 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
f110: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
f120: 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
f130: 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
f140: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
f150: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
f160: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
f170: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
f180: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
f190: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
f1a0: 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
f1b0: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
f1c0: 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
f1d0: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
f1e0: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
f1f0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
f200: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
f210: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
f220: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
f230: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
f240: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
f250: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
f270: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
f280: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
f290: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
f2a0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
f2b0: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
f2c0: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
f2d0: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
f2e0: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
f2f0: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
f300: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
f310: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
f320: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
f330: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
f340: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
f350: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
f360: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
f370: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
f380: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
f390: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
f3a0: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
f3b0: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
f3c0: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
f3d0: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
f3e0: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
f3f0: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
f400: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
f410: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
f420: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
f430: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
f440: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
f450: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
f460: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
f470: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
f480: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
f490: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
f4a0: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
f4b0: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
f4c0: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
f4d0: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
f4e0: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
f4f0: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
f500: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
f510: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
f520: 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
f530: 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
f540: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
f550: 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
f560: 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
f570: 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
f580: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
f590: 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
f5a0: 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
f5b0: 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
f5c0: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
f5d0: 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
f5e0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
f5f0: 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
f600: 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
f610: 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
f620: 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
f630: 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70  sult.  For IN op
f640: 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
f650: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
f660: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
f670: 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  is 0..*/.#ifndef
f680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
f690: 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
f6a0: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
f6b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
f6d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f6e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
f6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f700: 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
f710: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
f720: 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
f730: 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
f740: 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
f750: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
f760: 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
f770: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
f780: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
f790: 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
f7a0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
f7b0: 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
f7c0: 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
f7d0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f7f0: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
f800: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
f810: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
f840: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
f850: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
f860: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f870: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
f880: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
f890: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
f8a0: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
f8b0: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
f8c0: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
f8d0: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
f8e0: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
f8f0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
f900: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
f910: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
f920: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
f930: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
f940: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
f950: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
f960: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
f970: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
f980: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
f990: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
f9a0: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
f9b0: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
f9c0: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
f9d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
f9e0: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
f9f0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
fa00: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
fa10: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
fa20: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
fa30: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
fa40: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
fa50: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
fa60: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
fa70: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
fa80: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
fa90: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
faa0: 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
fab0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
fac0: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
fad0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
fae0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
faf0: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
fb00: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
fb10: 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
fb20: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
fb30: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
fb40: 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
fb50: 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
fb60: 20 25 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61 6d   %d", jmpIfDynam
fb70: 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c  ic>=0?"":"CORREL
fb80: 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20  ATED ",.        
fb90: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
fba0: 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22  ?"LIST":"SCALAR"
fbb0: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
fbc0: 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
fbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fbe0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
fbf0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
fc00: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
fc10: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
fc20: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
fc30: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
fc40: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
fc50: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
fc60: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
fc70: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
fc80: 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
fc90: 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
fca0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fcc0: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
fcd0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
fce0: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
fcf0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
fd00: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
fd10: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
fd20: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
fd30: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
fd40: 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
fd50: 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
fd60: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66  on */..      aff
fd70: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
fd80: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
fd90: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
fda0: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
fdb0: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
fdc0: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
fdd0: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
fde0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
fdf0: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
fe00: 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
fe10: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
fe20: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
fe30: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
fe40: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
fe50: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
fe60: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
fe70: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
fe80: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
fe90: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
fea0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
feb0: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
fec0: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
fed0: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
fee0: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
fef0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
ff00: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
ff10: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
ff20: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
ff30: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
ff40: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
ff50: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
ff60: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
ff70: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
ff80: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
ff90: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
ffa0: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
ffb0: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
ffc0: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
ffd0: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
ffe0: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
fff0: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
10000 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
10010 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
10020 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
10030 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
10040 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
10050 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
10060 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
10070 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
10080 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
10090 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
100a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
100b0 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
100c0 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77  ->iTable, !isRow
100d0 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  id);.      pKeyI
100e0 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
100f0 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
10100 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
10110 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20  db, 1, 1);..    
10120 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
10130 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
10140 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
10150 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
10160 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
10170 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
10180 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
10190 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
101a0 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
101b0 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
101c0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
101d0 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
101e0 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
101f0 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
10200 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10210 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
10220 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ect = pExpr->x.p
10230 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
10240 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
10250 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
10260 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
10270 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
10280 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
10290 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
102a0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
102b0 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
102c0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
102d0 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38  st.affSdst = (u8
102e0 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
102f0 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
10300 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
10310 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
10320 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
10330 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
10340 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 0;.        tes
10350 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
10360 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
10370 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
10380 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
10390 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
103a0 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
103b0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
103c0 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oc() */.        
103d0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
103e0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
103f0 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
10400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
10410 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
10420 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
10430 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
10440 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69    }.        pELi
10450 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
10460 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73  List;.        as
10470 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
10480 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
10490 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
104a0 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
104b0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  ) */.        ass
104c0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
104d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
104e0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
104f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
10500 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
10510 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
10520 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
10530 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
10540 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
10550 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
10560 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
10570 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
105c0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
105d0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
105e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
105f0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
10600 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
10610 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
10620 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
10630 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
10640 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
10650 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
10660 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
10670 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
10680 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
10690 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
106a0 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
106b0 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
106c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
106d0 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
106e0 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
106f0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
10700 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
10710 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
10720 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
10730 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
10740 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
10750 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
10760 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
10770 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
10780 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
10790 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
107a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
107b0 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
107c0 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
107d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
107e0 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
107f0 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
10800 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10810 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
10820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
10830 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
10840 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
10850 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
10860 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
10870 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
10880 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10890 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
108a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
108b0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
108c0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
108d0 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
108e0 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
108f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
10900 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
10910 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
10920 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
10930 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
10940 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
10950 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10960 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20  _Null, 0, r2);. 
10970 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
10980 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
10990 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
109a0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
109b0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
109c0 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
109d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
109e0 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20   iValToIns;..   
109f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
10a00 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
10a10 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
10a20 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
10a30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
10a40 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
10a50 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
10a60 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
10a70 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
10a80 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
10a90 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
10aa0 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
10ab0 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
10ac0 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
10ad0 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
10ae0 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
10af0 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
10b00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10b10 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e      if( jmpIfDyn
10b20 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69  amic>=0 && !sqli
10b30 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
10b40 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
10b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b60 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
10b70 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
10b80 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49              jmpI
10b90 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20  fDynamic = -1;. 
10ba0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
10bb0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
10bc0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
10bd0 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
10be0 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
10bf0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
10c00 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
10c10 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
10c20 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
10c30 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
10c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10c50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
10c60 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
10c70 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
10c80 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
10c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10ca0 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
10cb0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
10cc0 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
10ce0 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
10cf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10d00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10d10 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10d50 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
10d60 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
10d70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10d80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10d90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10da0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72  OP_Insert, pExpr
10db0 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
10dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
10dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10df0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
10e00 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72  Record, r3, 1, r
10e10 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
10e20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10e30 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
10e40 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
10e50 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20  Parse, r3, 1);. 
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10e70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10e80 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
10e90 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
10ea0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
10eb0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
10ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ed0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10ee0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
10ef0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10f00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10f10 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
10f20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10f30 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
10f40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
10f50 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
10f60 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
10f70 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
10f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10f90 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
10fa0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
10fb0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
10fc0 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
10fd0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
10fe0 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
10ff0 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
11000 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
11010 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
11020 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
11030 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
11040 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
11050 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
11060 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
11070 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
11080 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69  lumn.  If this i
11090 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
110a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  te.      ** an i
110b0 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78  nteger 0 (not ex
110c0 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73  ists) or 1 (exis
110d0 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  ts) into a memor
110e0 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  y cell.      ** 
110f0 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20  and record that 
11100 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
11110 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
11120 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
11130 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11160 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
11170 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
11180 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
11190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
111a0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
111b0 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  LECt result */..
111c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
111d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
111e0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
111f0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
11200 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
11210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
11220 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
11230 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
11240 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20  =TK_SELECT );.. 
11250 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
11260 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
11270 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
11280 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  ) );.      pSel 
11290 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
112a0 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
112b0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
112c0 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
112d0 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
112e0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
112f0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
11300 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
11310 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
11320 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
11330 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
11340 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11350 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
11360 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
11370 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
11380 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
11390 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
113a0 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
113b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
113c0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
113d0 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
113e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
113f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11400 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
11410 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
11420 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
11430 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
11440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11450 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
11460 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
11470 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
11480 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
11490 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
114a0 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
114b0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
114e0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
114f0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
11500 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  mit = 0;.      i
11510 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
11520 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 26  (pParse, pSel, &
11530 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
11540 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
11550 20 7d 0a 20 20 20 20 20 20 72 52 65 67 20 3d 20   }.      rReg = 
11560 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
11570 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
11580 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
11590 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
115a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
115b0 20 7d 0a 0a 20 20 69 66 28 20 72 48 61 73 4e 75   }..  if( rHasNu
115c0 6c 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 73 71  llFlag ){.    sq
115d0 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46  lite3SetHasNullF
115e0 6c 61 67 28 76 2c 20 70 45 78 70 72 2d 3e 69 54  lag(v, pExpr->iT
115f0 61 62 6c 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c  able, rHasNullFl
11600 61 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ag);.  }..  if( 
11610 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20  jmpIfDynamic>=0 
11620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11630 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d  beJumpHere(v, jm
11640 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d  pIfDynamic);.  }
11650 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
11660 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
11670 0a 20 20 72 65 74 75 72 6e 20 72 52 65 67 3b 0a  .  return rReg;.
11680 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11690 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
116a0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
116b0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
116c0 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
116d0 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 49 4e 20   code for an IN 
116e0 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
116f0 2a 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c  *      x IN (SEL
11700 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20  ECT ...).**     
11710 20 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61   x IN (value, va
11720 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  lue, ...).**.** 
11730 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  The left-hand si
11740 64 65 20 28 4c 48 53 29 20 69 73 20 61 20 73 63  de (LHS) is a sc
11750 61 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 2e  alar expression.
11760 20 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64    The right-hand
11770 20 73 69 64 65 20 28 52 48 53 29 0a 2a 2a 20 69   side (RHS).** i
11780 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 7a 65  s an array of ze
11790 72 6f 20 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65  ro or more value
117a0 73 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  s.  The expressi
117b0 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
117c0 65 20 4c 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74  e LHS is.** cont
117d0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
117e0 20 52 48 53 2e 20 20 54 68 65 20 76 61 6c 75 65   RHS.  The value
117f0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
11800 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e  on is unknown (N
11810 55 4c 4c 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c  ULL).** if the L
11820 48 53 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  HS is NULL or if
11830 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
11840 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
11850 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65   the RHS and the
11860 0a 2a 2a 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  .** RHS contains
11870 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
11880 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20  L values..**.** 
11890 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
118a0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
118b0 20 6a 75 6d 70 73 20 74 6f 20 64 65 73 74 49 66   jumps to destIf
118c0 46 61 6c 73 65 20 69 66 20 74 68 65 20 4c 48 53  False if the LHS
118d0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74   is not .** cont
118e0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
118f0 20 52 48 53 2e 20 20 49 66 20 64 75 65 20 74 6f   RHS.  If due to
11900 20 4e 55 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74   NULLs we cannot
11910 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
11920 65 20 4c 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74  e LHS.** is cont
11930 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
11940 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65   then jump to de
11950 73 74 49 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68  stIfNull.  If th
11960 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e  e LHS is contain
11970 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ed.** within the
11980 20 52 48 53 20 74 68 65 6e 20 66 61 6c 6c 20 74   RHS then fall t
11990 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69  hrough..*/.stati
119a0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
119b0 70 72 43 6f 64 65 49 4e 28 0a 20 20 50 61 72 73  prCodeIN(.  Pars
119c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
119d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
119e0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
119f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
11a00 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
11a10 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 20 65 78      /* The IN ex
11a20 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
11a30 74 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 20  t destIfFalse,  
11a40 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11a50 20 69 66 20 4c 48 53 20 69 73 20 6e 6f 74 20 63   if LHS is not c
11a60 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
11a70 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  RHS */.  int des
11a80 74 49 66 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f  tIfNull        /
11a90 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
11aa0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75  he results are u
11ab0 6e 6b 6e 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55  nknown due to NU
11ac0 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  LLs */.){.  int 
11ad0 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b  rRhsHasNull = 0;
11ae0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
11af0 61 74 20 69 73 20 74 72 75 65 20 69 66 20 52 48  at is true if RH
11b00 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20  S contains NULL 
11b10 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 61 72  values */.  char
11b20 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
11b30 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
11b40 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
11b50 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20  */.  int eType; 
11b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
11b70 70 65 20 6f 66 20 74 68 65 20 52 48 53 20 2a 2f  pe of the RHS */
11b80 0a 20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20  .  int r1;      
11b90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
11ba0 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73 74  orary use regist
11bb0 65 72 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  er */.  Vdbe *v;
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11bd0 20 53 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   Statement under
11be0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
11bf0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
11c00 68 65 20 52 48 53 2e 20 20 20 41 66 74 65 72 20  he RHS.   After 
11c10 74 68 69 73 20 73 74 65 70 2c 20 74 68 65 20 74  this step, the t
11c20 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
11c30 0a 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61  .  ** pExpr->iTa
11c40 62 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ble will contain
11c50 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61  s the values tha
11c60 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 52 48  t make up the RH
11c70 53 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50  S..  */.  v = pP
11c80 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
11c90 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
11ca0 20 20 20 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65       /* OOM dete
11cb0 63 74 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  cted prior to th
11cc0 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
11cd0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
11ce0 28 76 2c 20 22 62 65 67 69 6e 20 49 4e 20 65 78  (v, "begin IN ex
11cf0 70 72 22 29 29 3b 0a 20 20 65 54 79 70 65 20 3d  pr"));.  eType =
11d00 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
11d10 64 65 78 28 70 50 61 72 73 65 2c 20 70 45 78 70  dex(pParse, pExp
11d20 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
11d50 48 49 50 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e  HIP | IN_INDEX_N
11d60 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20  OOP_OK,.        
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 20 20 20 20 20 64 65 73 74 49 66 46 61 6c 73 65       destIfFalse
11d90 3d 3d 64 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30  ==destIfNull ? 0
11da0 20 3a 20 26 72 52 68 73 48 61 73 4e 75 6c 6c 29   : &rRhsHasNull)
11db0 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
11dc0 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ut the affinity 
11dd0 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
11de0 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20   a key from the 
11df0 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20  results.  ** of 
11e00 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
11e10 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f 72  affinityStr stor
11e20 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  es a static stri
11e30 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0a  ng suitable for.
11e40 20 20 2a 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61    ** P4 of OP_Ma
11e50 6b 65 52 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20  keRecord..  */. 
11e60 20 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70   affinity = comp
11e70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70  arisonAffinity(p
11e80 45 78 70 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64  Expr);..  /* Cod
11e90 65 20 74 68 65 20 4c 48 53 2c 20 74 68 65 20 3c  e the LHS, the <
11ea0 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70  expr> from "<exp
11eb0 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20  r> IN (...)"..  
11ec0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
11ed0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
11ee0 29 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65  );.  r1 = sqlite
11ef0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11f00 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
11f10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
11f20 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29  Expr->pLeft, r1)
11f30 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  ;..  /* If sqlit
11f40 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 29 20  e3FindInIndex() 
11f50 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20  did not find or 
11f60 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20  create an index 
11f70 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 73 75 69  that is.  ** sui
11f80 74 61 62 6c 65 20 66 6f 72 20 65 76 61 6c 75 61  table for evalua
11f90 74 69 6e 67 20 74 68 65 20 49 4e 20 6f 70 65 72  ting the IN oper
11fa0 61 74 6f 72 2c 20 74 68 65 6e 20 65 76 61 6c 75  ator, then evalu
11fb0 61 74 65 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a  ate using a.  **
11fc0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d   sequence of com
11fd0 70 61 72 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  parisons..  */. 
11fe0 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49   if( eType==IN_I
11ff0 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_NOOP ){.   
12000 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
12010 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
12020 74 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  t;.    CollSeq *
12030 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12040 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12050 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
12060 3b 0a 20 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f  ;.    int labelO
12070 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
12080 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
12090 20 69 6e 74 20 72 32 2c 20 72 65 67 54 6f 46 72   int r2, regToFr
120a0 65 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 43  ee;.    int regC
120b0 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69  kNull = 0;.    i
120c0 6e 74 20 69 69 3b 0a 20 20 20 20 61 73 73 65 72  nt ii;.    asser
120d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
120e0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
120f0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
12100 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d  if( destIfNull!=
12110 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
12120 20 20 20 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d       regCkNull =
12130 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12140 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
12150 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12160 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
12170 2c 20 72 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e  , r1, r1, regCkN
12180 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ull);.    }.    
12190 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69  for(ii=0; ii<pLi
121a0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29  st->nExpr; ii++)
121b0 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  {.      r2 = sql
121c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
121d0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
121e0 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20 26 72 65  a[ii].pExpr, &re
121f0 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20  gToFree);.      
12200 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26  if( regCkNull &&
12210 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
12220 65 4e 75 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69  eNull(pList->a[i
12230 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
12240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12250 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74  AddOp3(v, OP_Bit
12260 41 6e 64 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  And, regCkNull, 
12270 72 32 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  r2, regCkNull);.
12280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12290 28 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ( ii<pList->nExp
122a0 72 2d 31 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c  r-1 || destIfNul
122b0 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l!=destIfFalse )
122c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
122d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
122e0 50 5f 45 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f  P_Eq, r1, labelO
122f0 6b 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20 20  k, r2,.         
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50   (void*)pColl, P
12320 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
12330 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12340 49 66 28 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e  If(v, ii<pList->
12350 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20  nExpr-1);.      
12360 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
12370 28 76 2c 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e  (v, ii==pList->n
12380 45 78 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20  Expr-1);.       
12390 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
123a0 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79  geP5(v, affinity
123b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
123c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
123d0 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74  destIfNull==dest
123e0 49 66 46 61 6c 73 65 20 29 3b 0a 20 20 20 20 20  IfFalse );.     
123f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12400 64 4f 70 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72  dOp4(v, OP_Ne, r
12410 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  1, destIfFalse, 
12420 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
12440 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
12450 4f 4c 4c 53 45 51 29 3b 20 56 64 62 65 43 6f 76  OLLSEQ); VdbeCov
12460 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12470 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12480 6e 67 65 50 35 28 76 2c 20 61 66 66 69 6e 69 74  ngeP5(v, affinit
12490 79 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  y | SQLITE_JUMPI
124a0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
124b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
124c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
124d0 73 65 2c 20 72 65 67 54 6f 46 72 65 65 29 3b 0a  se, regToFree);.
124e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
124f0 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  gCkNull ){.     
12500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12510 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
12520 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74   regCkNull, dest
12530 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76  IfNull); VdbeCov
12540 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12550 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12560 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
12570 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
12580 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12590 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
125a0 28 76 2c 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20  (v, labelOk);.  
125b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
125c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
125d0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65  regCkNull);.  }e
125e0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  lse{.  .    /* I
125f0 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
12600 4c 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  L, then the resu
12610 6c 74 20 69 73 20 65 69 74 68 65 72 20 66 61 6c  lt is either fal
12620 73 65 20 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e  se or NULL depen
12630 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77  ding.    ** on w
12640 68 65 74 68 65 72 20 74 68 65 20 52 48 53 20 69  hether the RHS i
12650 73 20 65 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20  s empty or not, 
12660 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
12670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
12680 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
12690 6c 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  l(pExpr->pLeft) 
126a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  ){.      if( des
126b0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
126c0 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alse ){.        
126d0 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
126e0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
126f0 77 68 65 72 65 20 74 68 65 20 66 61 6c 73 65 20  where the false 
12700 61 6e 64 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65  and NULL outcome
12710 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
12720 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
12730 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12740 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
12750 4e 75 6c 6c 2c 20 72 31 2c 20 64 65 73 74 49 66  Null, r1, destIf
12760 4e 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  Null); VdbeCover
12770 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
12780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
12790 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
127a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
127b0 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56  _NotNull, r1); V
127c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
127d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
127e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
127f0 52 65 77 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69  Rewind, pExpr->i
12800 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
12810 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
12820 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12840 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
12850 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 4e 75 6c  to, 0, destIfNul
12860 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
12870 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12880 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20  v, addr1);.     
12890 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
128a0 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e  if( eType==IN_IN
128b0 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  DEX_ROWID ){.   
128c0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
128d0 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74  se, the RHS is t
128e0 68 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c  he ROWID of tabl
128f0 65 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20 2a  e b-tree.      *
12900 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
12910 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12920 4d 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64  MustBeInt, r1, d
12930 65 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62  estIfFalse); Vdb
12940 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12950 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12960 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
12970 78 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54  xists, pExpr->iT
12980 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73  able, destIfFals
12990 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  e, r1);.      Vd
129a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
129b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
129c0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
129d0 20 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69   the RHS is an i
129e0 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20  ndex b-tree..   
129f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
12a00 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12a10 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31   OP_Affinity, r1
12a20 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
12a30 79 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20 20 20  y, 1);.  .      
12a40 2f 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65  /* If the set me
12a50 6d 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61  mbership test fa
12a60 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ils, then the re
12a70 73 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20  sult of the .   
12a80 20 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e     ** "x IN (...
12a90 29 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  )" expression mu
12aa0 73 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f  st be either 0 o
12ab0 72 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73  r NULL. If the s
12ac0 65 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  et.      ** cont
12ad0 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c  ains no NULL val
12ae0 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ues, then the re
12af0 73 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68  sult is 0. If th
12b00 65 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20  e set .      ** 
12b10 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
12b20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
12b30 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
12b40 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  t of the.      *
12b50 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  * expression is 
12b60 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  also NULL..     
12b70 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
12b80 28 20 64 65 73 74 49 66 46 61 6c 73 65 21 3d 64  ( destIfFalse!=d
12b90 65 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72 52 68  estIfNull || rRh
12ba0 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  sHasNull==0 );. 
12bb0 20 20 20 20 20 69 66 28 20 72 52 68 73 48 61 73       if( rRhsHas
12bc0 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Null==0 ){.     
12bd0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
12be0 68 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20  h runs if it is 
12bf0 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65  known at compile
12c00 20 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52   time that the R
12c10 48 53 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  HS.        ** ca
12c20 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  nnot contain NUL
12c30 4c 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68  L values. This h
12c40 61 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65  appens as the re
12c50 73 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  sult.        ** 
12c60 6f 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20  of a "NOT NULL" 
12c70 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68  constraint in th
12c80 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
12c90 61 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  a..        **.  
12ca0 20 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75        ** Also ru
12cb0 6e 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66  n this branch if
12cc0 20 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c   NULL is equival
12cd0 65 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20  ent to FALSE.   
12ce0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73       ** for this
12cf0 20 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f   particular IN o
12d00 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 20  perator..       
12d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
12d20 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
12d30 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
12d40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12d50 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c  destIfFalse, r1,
12d60 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
12d70 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12d80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d90 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72     /* In this br
12da0 61 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66  anch, the RHS of
12db0 20 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f   the IN might co
12dc0 6e 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64  ntain a NULL and
12dd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
12de0 70 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55  presence of a NU
12df0 4c 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61  LL on the RHS ma
12e00 6b 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65  kes a difference
12e10 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20   in the.        
12e20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20  ** outcome..    
12e30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12e40 6e 74 20 6a 31 3b 0a 20 20 0a 20 20 20 20 20 20  nt j1;.  .      
12e50 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b    /* First check
12e60 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c   to see if the L
12e70 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  HS is contained 
12e80 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20  in the RHS.  If 
12e90 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
12ea0 68 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69  hen the answer i
12eb0 73 20 54 52 55 45 20 74 68 65 20 70 72 65 73 65  s TRUE the prese
12ec0 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20  nce of NULLs in 
12ed0 74 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20  the RHS does.   
12ee0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74       ** not matt
12ef0 65 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20  er.  If the LHS 
12f00 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
12f10 20 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65   in the RHS, the
12f20 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
12f30 20 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20   answer is NULL 
12f40 69 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61  if the RHS conta
12f50 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68  ins NULLs and th
12f60 65 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20  e answer is.    
12f70 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20      ** FALSE if 
12f80 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
12f90 66 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  free..        */
12fa0 0a 20 20 20 20 20 20 20 20 6a 31 20 3d 20 73 71  .        j1 = sq
12fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
12fc0 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
12fd0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
12fe0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
12ff0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
13000 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13010 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13020 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48  OP_IsNull, rRhsH
13030 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  asNull, destIfNu
13040 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ll);.        Vdb
13050 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
13060 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13070 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
13080 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c  to, 0, destIfFal
13090 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
130a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
130b0 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 7d  (v, j1);.      }
130c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
130d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
130e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
130f0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
13100 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
13110 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13120 20 22 65 6e 64 20 49 4e 20 65 78 70 72 22 29 29   "end IN expr"))
13130 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
13140 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
13150 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70  RY */../*.** Dup
13160 6c 69 63 61 74 65 20 61 6e 20 38 2d 62 79 74 65  licate an 8-byte
13170 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63   value.*/.static
13180 20 63 68 61 72 20 2a 64 75 70 38 62 79 74 65 73   char *dup8bytes
13190 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
131a0 63 68 61 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61  char *in){.  cha
131b0 72 20 2a 6f 75 74 20 3d 20 73 71 6c 69 74 65 33  r *out = sqlite3
131c0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69  DbMallocRaw(sqli
131d0 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 38 29  te3VdbeDb(v), 8)
131e0 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
131f0 20 20 20 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69     memcpy(out, i
13200 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74  n, 8);.  }.  ret
13210 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e  urn out;.}..#ifn
13220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13230 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f  FLOATING_POINT./
13240 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
13250 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
13260 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 66  t will put the f
13270 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
13280 20 76 61 6c 75 65 20 64 65 73 63 72 69 62 65 64   value described
13290 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e   by z[0..n-1] in
132a0 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
132b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20  ..**.** The z[] 
132c0 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62  string will prob
132d0 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f  ably not be zero
132e0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20 42 75  -terminated.  Bu
132f0 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63  t the .** z[n] c
13300 68 61 72 61 63 74 65 72 20 69 73 20 67 75 61 72  haracter is guar
13310 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73 6f 6d  anteed to be som
13320 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f 65 73  ething that does
13330 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b   not look.** lik
13340 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  e the continuati
13350 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  on of the number
13360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13370 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65 20 2a   codeReal(Vdbe *
13380 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
13390 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c 61 67  , int negateFlag
133a0 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69  , int iMem){.  i
133b0 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30 29 20  f( ALWAYS(z!=0) 
133c0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 76 61  ){.    double va
133d0 6c 75 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lue;.    char *z
133e0 56 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 74  V;.    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 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73    zV = dup8bytes
134a0 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75  (v, (char*)&valu
134b0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
134c0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
134d0 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  Real, 0, iMem, 0
134e0 2c 20 7a 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a  , zV, P4_REAL);.
134f0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
13500 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
13510 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
13520 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69  t will put the i
13530 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20  nteger describe 
13540 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e  by.** text z[0..
13550 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
13560 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45  er iMem..**.** E
13570 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20  xpr.u.zToken is 
13580 61 6c 77 61 79 73 20 55 54 46 38 20 61 6e 64 20  always UTF8 and 
13590 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
135a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
135b0 63 6f 64 65 49 6e 74 65 67 65 72 28 50 61 72 73  codeInteger(Pars
135c0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
135d0 2a 70 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46  *pExpr, int negF
135e0 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a  lag, int iMem){.
135f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
13600 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28  se->pVdbe;.  if(
13610 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20   pExpr->flags & 
13620 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
13630 20 20 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72     int i = pExpr
13640 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20  ->u.iValue;.    
13650 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a  assert( i>=0 );.
13660 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
13670 29 20 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71  ) i = -i;.    sq
13680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13690 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
136a0 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  , iMem);.  }else
136b0 7b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20  {.    int c;.   
136c0 20 69 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20   i64 value;.    
136d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
136e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
136f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
13700 30 20 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  0 );.    c = sql
13710 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
13720 34 28 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20  4(z, &value);.  
13730 20 20 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63    if( c==0 || (c
13740 3d 3d 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20  ==2 && negFlag) 
13750 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
13760 56 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67  V;.      if( neg
13770 46 6c 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20  Flag ){ value = 
13780 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  c==2 ? SMALLEST_
13790 49 4e 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20  INT64 : -value; 
137a0 7d 0a 20 20 20 20 20 20 7a 56 20 3d 20 64 75 70  }.      zV = dup
137b0 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a  8bytes(v, (char*
137c0 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  )&value);.      
137d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
137e0 34 28 76 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30  4(v, OP_Int64, 0
137f0 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
13800 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
13810 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
13820 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13830 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
13840 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13850 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
13860 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
13870 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
13880 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69  "", z);.#else.#i
13890 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
138a0 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20  T_HEX_INTEGER.  
138b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
138c0 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c  strnicmp(z,"0x",
138d0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
138e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
138f0 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69  (pParse, "hex li
13900 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25  teral too big: %
13910 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65  s", z);.      }e
13920 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
13930 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
13940 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
13950 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
13960 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
13970 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
13980 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
13990 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
139a0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
139b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
139c0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
139d0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
139e0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
139f0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
13a00 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
13a10 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
13a20 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
13a30 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
13a40 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
13a50 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
13a60 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
13a70 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
13a80 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
13a90 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
13aa0 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
13ab0 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
13ac0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
13ad0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
13ae0 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
13af0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13b00 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
13b10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
13b20 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
13b30 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
13b40 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
13b50 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
13b60 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
13b70 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Cache *p;..  /* 
13b80 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20  Unless an error 
13b90 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65  has occurred, re
13ba0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
13bb0 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
13bc0 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ve. */.  assert(
13bd0 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73   iReg>0 || pPars
13be0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
13bf0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
13c00 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
13c10 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f   iCol>=-1 && iCo
13c20 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46  l<32768 );  /* F
13c30 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  inite column num
13c40 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  bers */..  /* Th
13c50 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  e SQLITE_ColumnC
13c60 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c  ache flag disabl
13c70 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  es the column ca
13c80 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  che.  This is us
13c90 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74  ed.  ** for test
13ca0 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65  ing only - to ve
13cb0 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65  rify that SQLite
13cc0 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65   always gets the
13cd0 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a   same answer.  *
13ce0 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f  * with and witho
13cf0 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ut the column ca
13d00 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
13d10 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
13d20 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
13d30 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
13d40 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  che) ) return;..
13d50 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
13d60 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
13d70 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
13d80 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77   Actually, the w
13d90 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ay the column ca
13da0 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  che is currently
13db0 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75   used, we are gu
13dc0 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68  aranteed.  ** th
13dd0 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69  at the object wi
13de0 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79  ll never already
13df0 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56   be in cache.  V
13e00 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61  erify this guara
13e10 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ntee..  */.#ifnd
13e20 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28  ef NDEBUG.  for(
13e30 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13e40 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13e50 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13e60 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, p++){.    as
13e70 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
13e80 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
13e90 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
13ea0 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
13eb0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
13ec0 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
13ed0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
13ee0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
13ef0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
13f00 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
13f10 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
13f20 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
13f30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
13f40 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
13f50 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
13f60 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
13f70 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
13f80 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
13f90 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
13fa0 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
13fb0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
13fc0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
13fd0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
13fe0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
13ff0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
14000 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
14010 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
14020 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
14030 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
14040 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
14050 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14060 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14070 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14080 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14090 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
140a0 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
140b0 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
140c0 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
140d0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
140e0 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
140f0 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
14100 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
14110 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
14120 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14130 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
14140 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
14150 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
14160 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
14170 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
14180 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
14190 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
141a0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
141b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
141c0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
141d0 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
141e0 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
141f0 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
14200 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
14210 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
14220 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
14230 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
14240 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
14250 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
14260 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
14270 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
14280 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
14290 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69  .  int iLast = i
142a0 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a  Reg + nReg - 1;.
142b0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
142c0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
142d0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
142e0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
142f0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14300 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
14310 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
14320 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72  if( r>=iReg && r
14330 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
14340 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
14350 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
14360 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
14370 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14380 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
14390 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
143a0 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
143b0 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
143c0 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
143d0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
143e0 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
143f0 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
14400 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
14410 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
14420 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
14430 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
14440 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14450 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
14460 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66  eLevel++;.#ifdef
14470 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14480 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
14490 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
144a0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
144b0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53  .    printf("PUS
144c0 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72  H to %d\n", pPar
144d0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
144e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
144f0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f  /*.** Remove fro
14500 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
14510 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  he any entries t
14520 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73  hat were added s
14530 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20  ince the.** the 
14540 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33  previous sqlite3
14550 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70  ExprCachePush op
14560 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  eration.  In oth
14570 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
14580 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74  e.** the cache t
14590 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
145a0 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20  as in prior the 
145b0 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68  most recent Push
145c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
145d0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61  3ExprCachePop(Pa
145e0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
145f0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14600 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
14610 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14620 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29  iCacheLevel>=1 )
14630 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
14640 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65  heLevel--;.#ifde
14650 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
14660 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
14670 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
14680 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
14690 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f  {.    printf("PO
146a0 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  P  to %d\n", pPa
146b0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
146c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
146d0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
146e0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
146f0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14700 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14710 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
14720 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
14730 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
14740 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
14750 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
14760 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
14770 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
14780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
14790 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
147a0 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
147b0 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
147c0 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
147d0 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
147e0 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
147f0 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
14800 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
14810 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
14820 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
14830 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
14840 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
14850 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
14860 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
14870 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
14880 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
14890 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
148a0 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
148b0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
148c0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
148d0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
148e0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
148f0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14900 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
14910 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
14920 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
14930 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
14940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14950 74 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  te code to extra
14960 63 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ct the value of 
14970 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
14980 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a  mn of a table..*
14990 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
149a0 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
149b0 66 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a  fTable(.  Vdbe *
149c0 76 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  v,        /* The
149d0 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73   VDBE under cons
149e0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61  truction */.  Ta
149f0 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a  ble *pTab,    /*
14a00 20 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   The table conta
14a10 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
14a20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72  */.  int iTabCur
14a30 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  ,    /* The tabl
14a40 65 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68  e cursor.  Or th
14a50 65 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20  e PK cursor for 
14a60 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f  WITHOUT ROWID */
14a70 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
14a80 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
14a90 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74  he column to ext
14aa0 72 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ract */.  int re
14ab0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74  gOut      /* Ext
14ac0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69  ract the value i
14ad0 6e 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65  nto this registe
14ae0 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43  r */.){.  if( iC
14af0 6f 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54  ol<0 || iCol==pT
14b00 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
14b10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14b20 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
14b30 69 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29  iTabCur, regOut)
14b40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
14b50 6e 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61  nt op = IsVirtua
14b60 6c 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f  l(pTab) ? OP_VCo
14b70 6c 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e  lumn : OP_Column
14b80 3b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43  ;.    int x = iC
14b90 6f 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73  ol;.    if( !Has
14ba0 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20  Rowid(pTab) ){. 
14bb0 20 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33       x = sqlite3
14bc0 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71  ColumnOfIndex(sq
14bd0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
14be0 6e 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c  ndex(pTab), iCol
14bf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14c00 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14c10 2c 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78  , op, iTabCur, x
14c20 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20  , regOut);.  }. 
14c30 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
14c40 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
14c50 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62  nDefault(v, pTab
14c60 2c 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b  , iCol, regOut);
14c70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
14c80 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
14c90 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68   will extract th
14ca0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c  e iColumn-th col
14cb0 75 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c  umn from.** tabl
14cc0 65 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65  e pTab and store
14cd0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
14ce0 65 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e  e in a register.
14cf0 20 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69    An effort.** i
14d00 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20  s made to store 
14d10 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
14d20 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
14d30 67 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a  g, but this is.*
14d40 2a 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64  * not guaranteed
14d50 2e 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  .  The location 
14d60 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61  of the column va
14d70 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
14d80 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
14d90 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72  t be an open cur
14da0 73 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69  sor to pTab in i
14db0 54 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20  Table when this 
14dc0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
14dd0 6c 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d  lled.  If iColum
14de0 6e 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  n<0 then code is
14df0 20 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20   generated that 
14e00 65 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77  extracts the row
14e10 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
14e20 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
14e30 75 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  umn(.  Parse *pP
14e40 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69  arse,   /* Parsi
14e50 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
14e60 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
14e70 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
14e80 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
14e90 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
14ea0 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
14eb0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43  from */.  int iC
14ec0 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e  olumn,     /* In
14ed0 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65  dex of the table
14ee0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
14ef0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a   iTable,      /*
14f00 20 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   The cursor poin
14f10 74 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c  ting to the tabl
14f20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c  e */.  int iReg,
14f30 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
14f40 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
14f50 0a 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20  .  u8 p5        
14f60 20 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20      /* P5 value 
14f70 66 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f  for OP_Column */
14f80 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
14f90 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14fa0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
14fb0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
14fc0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14fd0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14fe0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14ff0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
15000 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
15010 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
15020 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
15030 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
15040 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
15050 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
15060 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
15070 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
15080 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
15090 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
150a0 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
150b0 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
150c0 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
150d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
150e0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
150f0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
15100 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
15110 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
15120 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15130 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
15140 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
15150 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
15160 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
15170 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
15180 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
15190 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  Reg;.}../*.** Cl
151a0 65 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63  ear all column c
151b0 61 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  ache entries..*/
151c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
151d0 72 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73  rCacheClear(Pars
151e0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
151f0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
15200 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66  olCache *p;..#if
15210 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
15220 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
15230 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
15240 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
15250 0a 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45  .    printf("CLE
15260 41 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  AR\n");.  }.#end
15270 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  if.  for(i=0, p=
15280 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
15290 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
152a0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
152b0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
152c0 65 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  eg ){.      cach
152d0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
152e0 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
152f0 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
15300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
15310 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
15320 61 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63  at an affinity c
15330 68 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72  hange has occurr
15340 65 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20  ed on iCount.** 
15350 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
15360 6e 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a  ng with iStart..
15370 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
15380 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
15390 43 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  Change(Parse *pP
153a0 61 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74  arse, int iStart
153b0 2c 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20  , int iCount){. 
153c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
153d0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
153e0 69 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b  iStart, iCount);
153f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
15400 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20  te code to move 
15410 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67  content from reg
15420 69 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69  isters iFrom...i
15430 46 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f  From+nReg-1.** o
15440 76 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b  ver to iTo..iTo+
15450 6e 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65  nReg-1. Keep the
15460 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70   column cache up
15470 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69  -to-date..*/.voi
15480 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
15490 65 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61  eMove(Parse *pPa
154a0 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
154b0 69 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65  int iTo, int nRe
154c0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 46  g){.  assert( iF
154d0 72 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c  rom>=iTo+nReg ||
154e0 20 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f   iFrom+nReg<=iTo
154f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
15500 65 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e  eAddOp3(pParse->
15510 70 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20  pVdbe, OP_Move, 
15520 69 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67  iFrom, iTo, nReg
15530 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
15540 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
15550 73 65 2c 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29  se, iFrom, nReg)
15560 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
15570 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
15580 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
15590 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a  _COVERAGE_TEST).
155a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
155b0 65 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65  e if any registe
155c0 72 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69  r in the range i
155d0 46 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75  From..iTo (inclu
155e0 73 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64  sive).** is used
155f0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
15600 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a  column cache..**
15610 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15620 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
15630 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73  assert() and tes
15640 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f  tcase() macros o
15650 6e 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  nly.** and does 
15660 6e 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20  not appear in a 
15670 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f  normal build..*/
15680 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64  .static int used
15690 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61  AsColumnCache(Pa
156a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
156b0 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
156c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
156d0 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
156e0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
156f0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
15700 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
15710 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
15720 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
15730 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
15740 3e 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54  >=iFrom && r<=iT
15750 6f 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20  o ) return 1;   
15760 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d   /*NO_TEST*/.  }
15770 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
15780 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15790 44 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f  DEBUG || SQLITE_
157a0 43 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f  COVERAGE_TEST */
157b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
157c0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
157d0 64 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53  de to a TK_REGIS
157e0 54 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  TER.*/.static vo
157f0 69 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  id exprToRegiste
15800 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
15810 52 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d  Reg){.  p->op2 =
15820 20 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20   p->op;.  p->op 
15830 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
15840 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65   p->iTable = iRe
15850 67 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72  g;.  ExprClearPr
15860 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69  operty(p, EP_Ski
15870 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  p);.}../*.** Gen
15880 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
15890 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
158a0 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
158b0 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
158c0 73 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74  sion.  Attempt t
158d0 6f 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  o store the resu
158e0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
158f0 22 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74  "target"..** Ret
15900 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
15910 20 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61   where results a
15920 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
15930 20 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69   With this routi
15940 6e 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ne, there is no 
15950 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72  guarantee that r
15960 65 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62  esults will.** b
15970 65 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67  e stored in targ
15980 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  et.  The result 
15990 6d 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20  might be stored 
159a0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  in some other.**
159b0 20 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20   register if it 
159c0 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  is convenient to
159d0 20 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c   do so.  The cal
159e0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  ling function.**
159f0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
15a00 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
15a10 6d 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  move the results
15a20 20 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a   to the desired.
15a30 2a 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ** register..*/.
15a40 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
15a50 6f 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20  odeTarget(Parse 
15a60 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
15a70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
15a80 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
15a90 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f  Parse->pVdbe;  /
15aa0 2a 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63  * The VM under c
15ab0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
15ac0 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
15ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15ae0 65 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63  e opcode being c
15af0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  oded */.  int in
15b00 52 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20  Reg = target;   
15b10 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73      /* Results s
15b20 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
15b30 72 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74  r inReg */.  int
15b40 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20   regFree1 = 0;  
15b50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e         /* If non
15b60 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20  -zero free this 
15b70 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
15b80 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  er */.  int regF
15b90 72 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20  ree2 = 0;       
15ba0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
15bb0 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
15bc0 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
15bd0 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72  .  int r1, r2, r
15be0 33 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20  3, r4;       /* 
15bf0 56 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72  Various register
15c00 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71   numbers */.  sq
15c10 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15c20 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
15c30 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15c40 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d  on */.  Expr tem
15c50 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
15c60 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65    /* Temporary e
15c70 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a  xpression node *
15c80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  /..  assert( tar
15c90 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c  get>0 && target<
15ca0 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b  =pParse->nMem );
15cb0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20  .  if( v==0 ){. 
15cc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
15cd0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
15ce0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72  led );.    retur
15cf0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  n 0;.  }..  if( 
15d00 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pExpr==0 ){.    
15d10 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
15d20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
15d30 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20  pExpr->op;.  }. 
15d40 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
15d50 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
15d60 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41  OLUMN: {.      A
15d70 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
15d80 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
15d90 66 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  fo;.      struct
15da0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
15db0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
15dc0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67  aCol[pExpr->iAgg
15dd0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41  ];.      if( !pA
15de0 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
15df0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  de ){.        as
15e00 73 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d  sert( pCol->iMem
15e10 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >0 );.        in
15e20 52 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d  Reg = pCol->iMem
15e30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15e40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15e50 20 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f   pAggInfo->useSo
15e60 72 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20  rtingIdx ){.    
15e70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15e80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
15e90 6d 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f  mn, pAggInfo->so
15ea0 72 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20  rtingIdxPTab,.  
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
15ed0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c  ->iSorterColumn,
15ee0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
15ef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
15f00 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  .      /* Otherw
15f10 69 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69  ise, fall thru i
15f20 6e 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d  nto the TK_COLUM
15f30 4e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  N case */.    }.
15f40 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
15f50 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  MN: {.      int 
15f60 69 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54  iTab = pExpr->iT
15f70 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20  able;.      if( 
15f80 69 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20  iTab<0 ){.      
15f90 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b    if( pParse->ck
15fa0 42 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Base>0 ){.      
15fb0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e      /* Generatin
15fc0 67 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  g CHECK constrai
15fd0 6e 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  nts or inserting
15fe0 20 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e   into partial in
15ff0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
16000 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
16010 69 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65  iColumn + pParse
16020 2d 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20  ->ckBase;.      
16030 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16050 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20      /* Deleting 
16060 66 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69  from a partial i
16070 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
16080 20 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d    iTab = pParse-
16090 3e 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20  >iPartIdxTab;.  
160a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
160b0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
160c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
160d0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70  Column(pParse, p
160e0 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20  Expr->pTab,.    
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
16110 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  ->iColumn, iTab,
16120 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20   target,.       
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
16150 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p2);.      break
16160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16170 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
16180 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
16190 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
161a0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
161b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
161c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
161d0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
161e0 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  T.    case TK_FL
161f0 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OAT: {.      ass
16200 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
16210 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
16220 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
16230 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70     codeReal(v, p
16240 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
16250 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
16260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
16270 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
16280 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
16290 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
162a0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
162b0 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
162c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
162d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
162e0 53 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67  String8, 0, targ
162f0 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e  et, 0, pExpr->u.
16300 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20  zToken, 0);.    
16310 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16320 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
16330 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16340 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16350 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74  _Null, 0, target
16360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16370 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
16380 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
16390 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
163a0 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
163b0 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f   int n;.      co
163c0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
163d0 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a     char *zBlob;.
163e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
163f0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16400 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
16410 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      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 30 5d 3d 3d 27 78 27 20 7c 7c 20 70  ken[0]=='x' || p
16440 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
16450 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20  ]=='X' );.      
16460 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16470 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27  .zToken[1]=='\''
16480 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70   );.      z = &p
16490 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32  Expr->u.zToken[2
164a0 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ];.      n = sql
164b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
164c0 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
164d0 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b  t( z[n]=='\'' );
164e0 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73  .      zBlob = s
164f0 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28  qlite3HexToBlob(
16500 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
16510 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73  , z, n);.      s
16520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16530 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32  (v, OP_Blob, n/2
16540 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c  , target, 0, zBl
16550 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  ob, P4_DYNAMIC);
16560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
16580 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
16590 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
165a0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
165b0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
165c0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61  alue) );.      a
165d0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
165e0 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20  zToken!=0 );.   
165f0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
16600 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30  ->u.zToken[0]!=0
16610 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16620 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16630 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
16640 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  r->iColumn, targ
16650 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
16660 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31  Expr->u.zToken[1
16670 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
16680 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16690 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20  .zToken[0]=='?' 
166a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
166b0 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75   strcmp(pExpr->u
166c0 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d  .zToken, pParse-
166d0 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43  >azVar[pExpr->iC
166e0 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a  olumn-1])==0 );.
166f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16700 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
16710 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  1, pParse->azVar
16720 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d  [pExpr->iColumn-
16730 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a  1], P4_STATIC);.
16740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
16750 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16760 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a  ase TK_REGISTER:
16770 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
16780 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
16790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
167a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
167b0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67  S: {.      inReg
167c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
167d0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
167e0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74   pExpr->pLeft, t
167f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
16800 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
16810 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
16820 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AST.    case TK_
16830 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CAST: {.      /*
16840 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
16850 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54  the form:   CAST
16860 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29  (pLeft AS token)
16870 20 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20   */.      inReg 
16880 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16890 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
168a0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
168b0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  rget);.      if(
168c0 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29   inReg!=target )
168d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
168e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
168f0 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
16900 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
16910 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
16920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
16930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16940 28 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72  (v, OP_Cast, tar
16950 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16970 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
16980 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
16990 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73  , 0));.      tes
169a0 74 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c  tcase( usedAsCol
169b0 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c  umnCache(pParse,
169c0 20 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29   inReg, inReg) )
169d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
169e0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
169f0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69  Change(pParse, i
16a00 6e 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  nReg, 1);.      
16a10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16a20 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16a30 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63  IT_CAST */.    c
16a40 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
16a50 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
16a60 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
16a70 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
16a80 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
16a90 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
16aa0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
16ab0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16ac0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16ad0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
16ae0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16af0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16b00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
16b10 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
16b20 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
16b30 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
16b40 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
16b50 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
16b70 20 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49   r2, inReg, SQLI
16b80 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
16b90 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
16ba0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
16bb0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
16bc0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
16bd0 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
16be0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
16bf0 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
16c00 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
16c10 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
16c20 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
16c30 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
16c40 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
16c50 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
16c60 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16c70 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
16c80 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
16c90 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16ca0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
16cb0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16cc0 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
16cd0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
16ce0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16cf0 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
16d00 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
16d10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16d20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
16d30 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
16d40 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16d50 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
16d60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16d70 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16d80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16d90 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16db0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
16dc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
16dd0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
16de0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
16df0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16e00 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
16e10 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
16e20 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16e30 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
16e40 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
16e50 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
16e60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16e70 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
16e80 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
16e90 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
16ea0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
16eb0 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
16ec0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
16ed0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16ee0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
16ef0 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
16f00 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
16f10 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
16f20 45 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49  E_STOREP2 | SQLI
16f30 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
16f40 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16f50 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
16f60 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
16f70 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
16f80 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
16f90 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
16fa0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16fb0 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
16fc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16fd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16fe0 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
16ff0 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
17000 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
17010 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
17020 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
17030 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
17040 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
17050 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
17060 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
17070 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
17080 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
17090 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
170a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
170b0 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  CAT: {.      ass
170c0 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f  ert( TK_AND==OP_
170d0 41 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20  And );          
170e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
170f0 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  TK_AND );.      
17100 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
17110 50 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20  P_Or );         
17120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17130 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20  p==TK_OR );.    
17140 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
17150 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20  S==OP_Add );    
17160 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17170 20 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a   op==TK_PLUS );.
17180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17190 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
171a0 61 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63  act );     testc
171b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55  ase( op==TK_MINU
171c0 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  S );.      asser
171d0 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
171e0 6d 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20  mainder );      
171f0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17200 5f 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  _REM );.      as
17210 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d  sert( TK_BITAND=
17220 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20  =OP_BitAnd );   
17230 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17240 3d 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20  =TK_BITAND );.  
17250 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
17260 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29  ITOR==OP_BitOr )
17270 3b 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  ;        testcas
17280 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20  e( op==TK_BITOR 
17290 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
172a0 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69   TK_SLASH==OP_Di
172b0 76 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65  vide );       te
172c0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53  stcase( op==TK_S
172d0 4c 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73  LASH );.      as
172e0 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d  sert( TK_LSHIFT=
172f0 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b  =OP_ShiftLeft );
17300 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17310 3d 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20  =TK_LSHIFT );.  
17320 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
17330 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
17340 69 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73  ight );  testcas
17350 65 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54  e( op==TK_RSHIFT
17360 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17370 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f  ( TK_CONCAT==OP_
17380 43 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74  Concat );      t
17390 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
173a0 43 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20  CONCAT );.      
173b0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
173c0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
173d0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
173e0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
173f0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
17400 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
17410 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17420 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17440 64 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20  dOp3(v, op, r2, 
17450 72 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  r1, target);.   
17460 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17470 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17480 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17490 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
174a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
174b0 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
174c0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
174d0 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
174e0 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
174f0 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
17500 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
17510 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a  ==TK_INTEGER ){.
17520 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
17530 67 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66  ger(pParse, pLef
17540 74 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  t, 1, target);.#
17550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17560 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
17570 54 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  T.      }else if
17580 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
17590 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
175a0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
175b0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
175c0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
175d0 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61  .        codeRea
175e0 6c 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54  l(v, pLeft->u.zT
175f0 6f 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29  oken, 1, target)
17600 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
17610 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
17620 6d 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45  mpX.op = TK_INTE
17630 47 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  GER;.        tem
17640 70 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e  pX.flags = EP_In
17650 74 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f  tValue|EP_TokenO
17660 6e 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d  nly;.        tem
17670 70 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b  pX.u.iValue = 0;
17680 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71  .        r1 = sq
17690 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
176a0 70 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58  p(pParse, &tempX
176b0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
176c0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
176d0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
176e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
176f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  eft, &regFree2);
17700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17710 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17720 5f 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72  _Subtract, r2, r
17730 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
17740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17750 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
17760 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
17770 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
17780 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17790 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54    case TK_BITNOT
177a0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
177b0 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
177c0 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50  t( TK_BITNOT==OP
177d0 5f 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73  _BitNot );   tes
177e0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49  tcase( op==TK_BI
177f0 54 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73  TNOT );.      as
17800 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
17810 5f 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20  _Not );         
17820 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17830 5f 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31  _NOT );.      r1
17840 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17850 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17860 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
17870 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74  gFree1);.      t
17880 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17890 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e  1==0 );.      in
178a0 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
178b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
178c0 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
178d0 20 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62   inReg);.      b
178e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
178f0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
17900 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
17910 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
17920 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73   addr;.      ass
17930 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
17940 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
17950 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17960 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
17970 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
17980 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
17990 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
179a0 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
179b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
179c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
179d0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
179e0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
179f0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17a00 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17a10 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
17a20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17a30 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17a40 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
17a50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17a60 76 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20  v, op, r1);.    
17a70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
17a80 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
17a90 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
17aa0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
17ab0 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
17ac0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17ad0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17ae0 65 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  er, 0, target);.
17af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17b00 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
17b10 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
17b20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17b30 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
17b40 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
17b50 20 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d   *pInfo = pExpr-
17b60 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
17b70 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b   if( pInfo==0 ){
17b80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17b90 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
17ba0 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
17bb0 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
17bc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17bd0 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
17be0 20 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25   of aggregate: %
17bf0 73 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  s()", pExpr->u.z
17c00 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65  Token);.      }e
17c10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52  lse{.        inR
17c20 65 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  eg = pInfo->aFun
17c30 63 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69  c[pExpr->iAgg].i
17c40 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Mem;.      }.   
17c50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17c60 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
17c70 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
17c80 70 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20  prList *pFarg;  
17c90 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
17ca0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
17cb0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
17cc0 6e 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20  nFarg;          
17cd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17ce0 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
17cf0 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63  ts */.      Func
17d00 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20  Def *pDef;      
17d10 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
17d20 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62  on definition ob
17d30 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ject */.      in
17d40 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
17d50 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
17d60 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  f the function n
17d70 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
17d80 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
17d90 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20   *zId;       /* 
17da0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  The function nam
17db0 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63  e */.      u32 c
17dc0 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20  onstMask = 0;   
17dd0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e    /* Mask of fun
17de0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
17df0 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e  that are constan
17e00 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  t */.      int i
17e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17e20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
17e30 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  r */.      u8 en
17e40 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20  c = ENC(db);    
17e50 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e    /* The text en
17e60 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74  coding used by t
17e70 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
17e80 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
17e90 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Coll = 0;    /* 
17ea0 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  A collating sequ
17eb0 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ence */..      a
17ec0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
17ed0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
17ee0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
17ef0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
17f00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
17f10 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
17f20 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
17f30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
17f40 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
17f50 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
17f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f70 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20  nFarg = pFarg ? 
17f80 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30  pFarg->nExpr : 0
17f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17fa0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17fb0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
17fc0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49  lue) );.      zI
17fd0 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  d = pExpr->u.zTo
17fe0 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d  ken;.      nId =
17ff0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
18000 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  (zId);.      pDe
18010 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
18020 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c  unction(db, zId,
18030 20 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63   nId, nFarg, enc
18040 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18050 70 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d  pDef==0 || pDef-
18060 3e 78 46 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20  >xFunc==0 ){.   
18070 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18080 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
18090 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20  known function: 
180a0 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49  %.*s()", nId, zI
180b0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
180c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
180d0 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64    /* Attempt a d
180e0 69 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61  irect implementa
180f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c  tion of the buil
18100 74 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20  t-in COALESCE() 
18110 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e  and.      ** IFN
18120 55 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  ULL() functions.
18130 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e    This avoids un
18140 6e 65 63 65 73 73 61 72 79 20 65 76 61 6c 75 61  necessary evalua
18150 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tion of.      **
18160 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20   arguments past 
18170 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55  the first non-NU
18180 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  LL argument..   
18190 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
181a0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
181b0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
181c0 41 4c 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20  ALESCE ){.      
181d0 20 20 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63    int endCoalesc
181e0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
181f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18200 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
18210 72 67 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  rg>=2 );.       
18220 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18230 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
18240 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[0].pExpr, targ
18250 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  et);.        for
18260 28 69 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=1; i<nFarg; i
18270 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
18280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18290 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
182a0 74 61 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65  target, endCoale
182b0 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sce);.          
182c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
182d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
182e0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
182f0 65 28 70 50 61 72 73 65 2c 20 74 61 72 67 65 74  e(pParse, target
18300 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
18310 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18320 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
18330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18340 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18350 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
18360 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
18370 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18380 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
18390 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
183a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
183b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
183c0 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
183d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
183e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
183f0 68 65 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75  he UNLIKELY() fu
18400 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
18410 70 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 69  p.  The result i
18420 73 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  s the value.    
18430 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
18440 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
18450 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
18460 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
18470 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c   SQLITE_FUNC_UNL
18480 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  IKELY ){.       
18490 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
184a0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 );.        sql
184b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
184c0 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
184d0 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
184e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
184f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
18500 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b  or(i=0; i<nFarg;
18510 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
18520 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74  f( i<32 && sqlit
18530 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
18540 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78  (pFarg->a[i].pEx
18550 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
18560 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31   testcase( i==31
18570 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
18580 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42  nstMask |= MASKB
18590 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20  IT32(i);.       
185a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
185b0 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
185c0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
185d0 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70  EDCOLL)!=0 && !p
185e0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
185f0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
18600 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
18610 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d  rse, pFarg->a[i]
18620 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
18630 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18640 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
18650 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d        if( constM
18660 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ask ){.         
18670 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d   r1 = pParse->nM
18680 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  em+1;.          
18690 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
186a0 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d  nFarg;.        }
186b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
186c0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
186d0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
186e0 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20   nFarg);.       
186f0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
18700 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20  or length() and 
18710 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f  typeof() functio
18720 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e  ns with a column
18730 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20   argument,.     
18740 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35     ** set the P5
18750 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
18760 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f  e OP_Column opco
18770 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e  de to OPFLAG_LEN
18780 47 54 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a  GTHARG.        *
18790 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45  * or OPFLAG_TYPE
187a0 4f 46 41 52 47 20 72 65 73 70 65 63 74 69 76 65  OFARG respective
187b0 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ly, to avoid unn
187c0 65 63 65 73 73 61 72 79 20 64 61 74 61 0a 20 20  ecessary data.  
187d0 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67        ** loading
187e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
187f0 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
18800 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c  funcFlags & (SQL
18810 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c  ITE_FUNC_LENGTH|
18820 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
18830 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  OF))!=0 ){.     
18840 20 20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a       u8 exprOp;.
18850 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18860 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20  ( nFarg==1 );.  
18870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18880 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
18890 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r!=0 );.        
188a0 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67    exprOp = pFarg
188b0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
188c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
188d0 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  exprOp==TK_COLUM
188e0 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f  N || exprOp==TK_
188f0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
18900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18910 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45  ( SQLITE_FUNC_LE
18920 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e  NGTH==OPFLAG_LEN
18930 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
18940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
18950 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
18960 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  ==OPFLAG_TYPEOFA
18970 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
18980 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 66    testcase( pDef
18990 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50  ->funcFlags & OP
189a0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
189b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 46  ;.            pF
189c0 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  arg->a[0].pExpr-
189d0 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20  >op2 = .        
189e0 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
189f0 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46  funcFlags & (OPF
18a00 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50  LAG_LENGTHARG|OP
18a10 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b  FLAG_TYPEOFARG);
18a20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18a30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18a40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18a50 50 75 73 68 28 70 50 61 72 73 65 29 3b 20 20 20  Push(pParse);   
18a60 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32    /* Ticket 2ea2
18a70 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20  425d34be */.    
18a80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18a90 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
18aa0 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c 0a 20  se, pFarg, r1,. 
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18ad0 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53  QLITE_ECEL_DUP|S
18ae0 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
18af0 52 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  R);.        sqli
18b00 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
18b10 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
18b20 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
18b30 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65  34be */.      }e
18b40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
18b50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
18b60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18b70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
18b80 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
18b90 6f 76 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e  overload the fun
18ba0 63 74 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72  ction if the fir
18bb0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20  st argument is. 
18bc0 20 20 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61       ** a virtua
18bd0 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a  l table column..
18be0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18bf0 2a 20 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63  * For infix func
18c00 74 69 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f  tions (LIKE, GLO
18c10 42 2c 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d  B, REGEXP, and M
18c20 41 54 43 48 29 20 75 73 65 20 74 68 65 0a 20 20  ATCH) use the.  
18c30 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72      ** second ar
18c40 67 75 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20  gument, not the 
18c50 66 69 72 73 74 2c 20 61 73 20 74 68 65 20 61 72  first, as the ar
18c60 67 75 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74  gument to test t
18c70 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
18c80 66 20 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  f it is a column
18c90 20 69 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61   in a virtual ta
18ca0 62 6c 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f  ble.  This is do
18cb0 6e 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ne because.     
18cc0 20 2a 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65   ** the left ope
18cd0 72 61 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75  rand of infix fu
18ce0 6e 63 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65  nctions (the ope
18cf0 72 61 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a  rand we want to.
18d00 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c        ** control
18d10 20 6f 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e   overloading) en
18d20 64 73 20 75 70 20 61 73 20 74 68 65 20 73 65 63  ds up as the sec
18d30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
18d40 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  the.      ** fun
18d50 63 74 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72  ction.  The expr
18d60 65 73 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42  ession "A glob B
18d70 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  " is equivalent 
18d80 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c  to .      ** "gl
18d90 6f 62 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e  ob(B,A).  We wan
18da0 74 20 74 6f 20 75 73 65 20 74 68 65 20 41 20 69  t to use the A i
18db0 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20  n "A glob B" to 
18dc0 74 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  test.      ** fo
18dd0 72 20 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c  r function overl
18de0 6f 61 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20  oading.  But we 
18df0 75 73 65 20 74 68 65 20 42 20 74 65 72 6d 20 69  use the B term i
18e00 6e 20 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20  n "glob(B,A)".. 
18e10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18e20 28 20 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70  ( nFarg>=2 && (p
18e30 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
18e40 5f 49 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20  _InfixFunc) ){. 
18e50 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
18e60 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
18e70 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
18e80 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
18e90 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
18ea0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
18eb0 46 61 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  Farg>0 ){.      
18ec0 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
18ed0 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
18ee0 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
18ef0 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30  Farg, pFarg->a[0
18f00 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
18f10 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
18f20 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
18f30 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
18f40 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
18f50 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
18f60 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
18f70 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20  fltColl; .      
18f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18f90 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
18fa0 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  q, 0, 0, 0, (cha
18fb0 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
18fc0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
18fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18fe0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
18ff0 6e 63 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73  nction, constMas
19000 6b 2c 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20  k, r1, target,. 
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 44         (char*)pD
19030 65 66 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  ef, P4_FUNCDEF);
19040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19050 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
19060 38 29 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  8)nFarg);.      
19070 69 66 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e  if( nFarg && con
19080 73 74 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20  stMask==0 ){.   
19090 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
190a0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
190b0 72 73 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b  rse, r1, nFarg);
190c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
190d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
190e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
190f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
19100 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
19110 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
19120 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
19130 65 28 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  e( op==TK_EXISTS
19140 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
19150 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  se( op==TK_SELEC
19160 54 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  T );.      inReg
19170 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75   = sqlite3CodeSu
19180 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
19190 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pExpr, 0, 0);.  
191a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
191b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
191c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
191d0 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74  tIfFalse = sqlit
191e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
191f0 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  v);.      int de
19200 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74  stIfNull = sqlit
19210 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19220 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
19230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19240 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
19250 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19260 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
19270 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49  se, pExpr, destI
19280 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75  fFalse, destIfNu
19290 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
192a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
192b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
192c0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
192d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
192e0 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
192f0 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alse);.      sql
19300 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19310 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72  , OP_AddImm, tar
19320 67 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  get, 0);.      s
19330 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
19340 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
19350 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
19360 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
19370 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19380 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20  SUBQUERY */...  
19390 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    /*.    **    x
193a0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
193b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
193c0 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
193d0 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t to.    **.    
193e0 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
193f0 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  <=z.    **.    *
19400 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * X is stored in
19410 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20   pExpr->pLeft.. 
19420 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65     ** Y is store
19430 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
19440 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20  t->a[0].pExpr.. 
19450 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65     ** Z is store
19460 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73  d in pExpr->pLis
19470 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20  t->a[1].pExpr.. 
19480 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
19490 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
194a0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
194b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
194c0 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
194d0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65  List_item *pLIte
194e0 6d 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  m = pExpr->x.pLi
194f0 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70  st->a;.      Exp
19500 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74  r *pRight = pLIt
19510 65 6d 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20  em->pExpr;..    
19520 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
19530 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
19540 65 2c 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72  e, pLeft, &regFr
19550 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
19560 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19570 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
19580 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
19590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
195a0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
195b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
195c0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
195d0 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65       r3 = sqlite
195e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
195f0 73 65 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20  se);.      r4 = 
19600 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19610 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19620 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
19630 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
19640 68 74 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20  ht, OP_Ge,.     
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
19660 20 72 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f   r2, r3, SQLITE_
19670 53 54 4f 52 45 50 32 29 3b 20 20 56 64 62 65 43  STOREP2);  VdbeC
19680 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
19690 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
196a0 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
196b0 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
196c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
196d0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
196e0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72  gFree2);.      r
196f0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
19700 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
19710 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
19720 32 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  2);.      testca
19730 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
19740 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
19750 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
19760 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
19770 65 2c 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53  e, r1, r2, r4, S
19780 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a  QLITE_STOREP2);.
19790 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
197a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
197b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
197c0 2c 20 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34  , OP_And, r3, r4
197d0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
197e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
197f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
19800 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
19810 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19820 70 50 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20  pParse, r4);.   
19830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19840 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c      case TK_COLL
19850 41 54 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54  ATE: .    case T
19860 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20  K_UPLUS: {.     
19870 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19880 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
19890 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
198a0 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  eft, target);.  
198b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
198c0 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52  ..    case TK_TR
198d0 49 47 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f  IGGER: {.      /
198e0 2a 20 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20  * If the opcode 
198f0 69 73 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74  is TK_TRIGGER, t
19900 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
19910 6f 6e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  on is a referenc
19920 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  e.      ** to a 
19930 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65  column in the ne
19940 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65  w.* or old.* pse
19950 75 64 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c  udo-tables avail
19960 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
19970 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
19980 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
19990 45 78 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73  Expr.iTable is s
199a0 65 74 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a  et to 1 for the.
199b0 20 20 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70        ** new.* p
199c0 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20  seudo-table, or 
199d0 30 20 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20  0 for the old.* 
199e0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78  pseudo-table. Ex
199f0 70 72 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20  pr.iColumn.     
19a00 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68   ** is set to th
19a10 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  e column of the 
19a20 70 73 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20  pseudo-table to 
19a30 72 65 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74  read, or to -1 t
19a40 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  o.      ** read 
19a50 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e  the rowid field.
19a60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19a70 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
19a80 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
19a90 20 75 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72   using an OP_Par
19aa0 61 6d 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70  am opcode. The p
19ab0 31 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d  1.      ** param
19ac0 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  eter is set to 0
19ad0 20 66 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69   for an old.rowi
19ae0 64 20 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20  d reference, or 
19af0 74 6f 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a  to (i+1).      *
19b00 2a 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  * to reference a
19b10 6e 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66  nother column of
19b20 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
19b30 6f 2d 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a  o-table, where .
19b40 20 20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68        ** i is th
19b50 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
19b60 6f 6c 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77  olumn. For a new
19b70 2e 72 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  .rowid reference
19b80 2c 20 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a  , p1 is.      **
19b90 20 73 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77   set to (n+1), w
19ba0 68 65 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75  here n is the nu
19bb0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
19bc0 69 6e 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74  in each pseudo-t
19bd0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46  able..      ** F
19be0 6f 72 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  or a reference t
19bf0 6f 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75  o any other colu
19c00 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
19c10 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31  pseudo-table, p1
19c20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74  .      ** is set
19c30 20 74 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65   to (n+2+i), whe
19c40 72 65 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61  re n and i are a
19c50 73 20 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f  s defined previo
19c60 75 73 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20  usly. For.      
19c70 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
19c80 68 65 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63  he table on whic
19c90 68 20 74 72 69 67 67 65 72 73 20 61 72 65 20 62  h triggers are b
19ca0 65 69 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20  eing fired is.  
19cb0 20 20 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20      ** declared 
19cc0 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
19cd0 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
19ce0 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
19cf0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
19d00 20 54 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65   Then p1 is inte
19d10 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
19d20 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ws:.      **.   
19d30 20 20 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20     **   p1==0   
19d40 2d 3e 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20  ->    old.rowid 
19d50 20 20 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20      p1==3   ->  
19d60 20 20 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20    new.rowid.    
19d70 20 20 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d    **   p1==1   -
19d80 3e 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20  >    old.a      
19d90 20 20 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20     p1==4   ->   
19da0 20 6e 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20   new.a.      ** 
19db0 20 20 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20    p1==2   ->    
19dc0 6f 6c 64 2e 62 20 20 20 20 20 20 20 20 20 70 31  old.b         p1
19dd0 3d 3d 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==5   ->    new.
19de0 62 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a  b       .      *
19df0 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
19e00 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  Tab = pExpr->pTa
19e10 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20  b;.      int p1 
19e20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
19e30 2a 20 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29  * (pTab->nCol+1)
19e40 20 2b 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43   + 1 + pExpr->iC
19e50 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73  olumn;..      as
19e60 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61  sert( pExpr->iTa
19e70 62 6c 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d  ble==0 || pExpr-
19e80 3e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  >iTable==1 );.  
19e90 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
19ea0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26  r->iColumn>=-1 &
19eb0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
19ec0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  <pTab->nCol );. 
19ed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
19ee0 62 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45  b->iPKey<0 || pE
19ef0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54  xpr->iColumn!=pT
19f00 61 62 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20  ab->iPKey );.   
19f10 20 20 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30     assert( p1>=0
19f20 20 26 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43   && p1<(pTab->nC
19f30 6f 6c 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20  ol*2+2) );..    
19f40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19f50 4f 70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c  Op2(v, OP_Param,
19f60 20 70 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20   p1, target);.  
19f70 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
19f80 28 76 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25  (v, "%s.%s -> $%
19f90 64 22 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78  d",.        (pEx
19fa0 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65  pr->iTable ? "ne
19fb0 77 22 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20  w" : "old"),.   
19fc0 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f       (pExpr->iCo
19fd0 6c 75 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22  lumn<0 ? "rowid"
19fe0 20 3a 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   : pExpr->pTab->
19ff0 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
1a000 75 6d 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20  umn].zName),.   
1a010 20 20 20 20 20 74 61 72 67 65 74 0a 20 20 20 20       target.    
1a020 20 20 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53    ));..#ifndef S
1a030 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1a040 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
1a050 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
1a060 20 68 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69   has REAL affini
1a070 74 79 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65  ty, it may curre
1a080 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61  ntly be stored a
1a090 73 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  s an.      ** in
1a0a0 74 65 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65  teger. Use OP_Re
1a0b0 61 6c 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61  alAffinity to ma
1a0c0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 72 65  ke sure it is re
1a0d0 61 6c 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20  ally real..     
1a0e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
1a0f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38  DENCE-OF: R-6098
1a100 35 2d 35 37 36 36 32 20 53 51 4c 69 74 65 20 77  5-57662 SQLite w
1a110 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20  ill convert the 
1a120 76 61 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20  value back to.  
1a130 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20      ** floating 
1a140 70 6f 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61  point when extra
1a150 63 74 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68  cting it from th
1a160 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20  e record.  */.  
1a170 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1a180 43 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20  Column>=0 .     
1a190 20 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b    && pTab->aCol[
1a1a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1a1b0 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1a1c0 5f 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20  _AFF_REAL.      
1a1d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1a1e0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1a1f0 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c  OP_RealAffinity,
1a200 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1a210 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
1a220 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1a230 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    /*.    ** Form
1a240 20 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   A:.    **   CAS
1a250 45 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e  E x WHEN e1 THEN
1a260 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
1a270 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
1a280 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
1a290 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
1a2a0 20 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20   Form B:.    ** 
1a2b0 20 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54    CASE WHEN e1 T
1a2c0 48 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54  HEN r1 WHEN e2 T
1a2d0 48 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20  HEN r2 ... WHEN 
1a2e0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
1a2f0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
1a300 20 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61   ** Form A is ca
1a310 6e 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  n be transformed
1a320 20 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61   into the equiva
1a330 6c 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66  lent form B as f
1a340 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20  ollows:.    **  
1a350 20 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20   CASE WHEN x=e1 
1a360 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65  THEN r1 WHEN x=e
1a370 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20  2 THEN r2 ....  
1a380 20 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e    **        WHEN
1a390 20 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c   x=eN THEN rN EL
1a3a0 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a  SE y END.    **.
1a3b0 20 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20      ** X (if it 
1a3c0 65 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45  exists) is in pE
1a3d0 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1a3e0 2a 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c  ** Y is in the l
1a3f0 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70  ast element of p
1a400 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66  Expr->x.pList if
1a410 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1a420 3e 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a  >nExpr is.    **
1a430 20 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20   odd.  The Y is 
1a440 61 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  also optional.  
1a450 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1a460 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70   elements in x.p
1a470 4c 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65  List.    ** is e
1a480 76 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f  ven, then Y is o
1a490 6d 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22  mitted and the "
1a4a0 6f 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c  otherwise" resul
1a4b0 74 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  t is NULL..    *
1a4c0 2a 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72  * Ei is in pExpr
1a4d0 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20  ->pList->a[i*2] 
1a4e0 61 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d  and Ri is pExpr-
1a4f0 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d  >pList->a[i*2+1]
1a500 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1a510 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
1a520 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1a530 74 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66  the Ri for the f
1a540 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69  irst matching Ei
1a550 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74  ,.    ** or if t
1a560 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68  here is no match
1a570 69 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45  ing Ei, the ELSE
1a580 20 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74   term Y, or if t
1a590 68 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e  here is.    ** n
1a5a0 6f 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c  o ELSE term, NUL
1a5b0 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  L..    */.    de
1a5c0 66 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f  fault: assert( o
1a5d0 70 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a  p==TK_CASE ); {.
1a5e0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62        int endLab
1a5f0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
1a600 20 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20          /* GOTO 
1a610 6c 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66  label for end of
1a620 20 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20   CASE stmt */.  
1a630 20 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65      int nextCase
1a640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a650 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
1a660 62 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45  bel for next WHE
1a670 4e 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  N clause */.    
1a680 20 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20    int nExpr;    
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6a0 20 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72      /* 2x number
1a6b0 20 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a   of WHEN terms *
1a6c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1a6f0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1a700 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
1a710 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1a720 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1a730 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1a740 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1a750 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
1a760 6c 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f  lem;  /* Array o
1a770 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
1a780 20 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d        Expr opCom
1a790 70 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  pare;           
1a7a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
1a7b0 3d 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20  ==Ei expression 
1a7c0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
1a7d0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1a7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a7f0 65 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  e X expression *
1a800 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54  /.      Expr *pT
1a810 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
1a820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d            /* X==
1a830 45 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a  Ei (form A) or j
1a840 75 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20  ust Ei (form B) 
1a850 2a 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  */.      VVA_ONL
1a860 59 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76  Y( int iCacheLev
1a870 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
1a880 63 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20  cheLevel; )..   
1a890 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
1a8a0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1a8b0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1a8c0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
1a8d0 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  st );.      asse
1a8e0 72 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  rt(pExpr->x.pLis
1a8f0 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
1a900 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
1a910 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
1a920 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20      aListelem = 
1a930 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  pEList->a;.     
1a940 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   nExpr = pEList-
1a950 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e  >nExpr;.      en
1a960 64 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  dLabel = sqlite3
1a970 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1a980 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20  ;.      if( (pX 
1a990 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21  = pExpr->pLeft)!
1a9a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  =0 ){.        te
1a9b0 6d 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20  mpX = *pX;.     
1a9c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
1a9d0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1a9e0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f  ;.        exprTo
1a9f0 52 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c  Register(&tempX,
1aa00 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1aa10 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c  Temp(pParse, pX,
1aa20 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
1aa30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aa40 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1aa50 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
1aa60 2e 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20  .op = TK_EQ;.   
1aa70 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70       opCompare.p
1aa80 4c 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20  Left = &tempX;. 
1aa90 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26         pTest = &
1aaa0 6f 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20  opCompare;.     
1aab0 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35     /* Ticket b35
1aac0 31 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64  1d95f9cd5ef17e9d
1aad0 39 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31  9dbae18f5ca86111
1aae0 39 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a  90001:.        *
1aaf0 2a 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72  * The value in r
1ab00 65 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65  egFree1 might ge
1ab10 74 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20  t SCopy-ed into 
1ab20 74 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e  the file result.
1ab30 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d  .        ** So m
1ab40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1ab50 65 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73  e regFree1 regis
1ab60 74 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65  ter is not reuse
1ab70 64 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20  d for other.    
1ab80 20 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20      ** purposes 
1ab90 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65  and possibly ove
1aba0 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20  rwritten.  */.  
1abb0 20 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d        regFree1 =
1abc0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1abd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
1abe0 70 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20  pr-1; i=i+2){.  
1abf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ac00 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1ac10 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1ac20 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pX ){.          
1ac30 61 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30  assert( pTest!=0
1ac40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   );.          op
1ac50 43 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d  Compare.pRight =
1ac60 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
1ac70 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  xpr;.        }el
1ac80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54  se{.          pT
1ac90 65 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b  est = aListelem[
1aca0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
1acb0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74    }.        next
1acc0 43 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Case = sqlite3Vd
1acd0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1ace0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1acf0 28 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pTest->op==TK_
1ad00 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1ad10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1ad20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
1ad30 73 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51  st, nextCase, SQ
1ad40 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
1ad50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1ad60 73 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se( aListelem[i+
1ad70 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  1].pExpr->op==TK
1ad80 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1ad90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1ada0 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74  de(pParse, aList
1adb0 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c  elem[i+1].pExpr,
1adc0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1add0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ade0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1adf0 30 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  0, endLabel);.  
1ae00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ae10 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1ae20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ae30 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1ae40 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
1ae50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ae60 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20  f( (nExpr&1)!=0 
1ae70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ae80 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1ae90 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1aea0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1aeb0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
1aec0 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
1aed0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1aee0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1aef0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1af00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1af10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1af20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1af30 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1af40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1af50 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1af60 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
1af70 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
1af80 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
1af90 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
1afa0 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
1afb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1afc0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1afd0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
1afe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1aff0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1b000 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1b010 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1b020 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b030 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
1b040 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
1b050 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
1b060 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
1b070 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1b080 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b090 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
1b0a0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1b0b0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
1b0c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
1b0d0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
1b0e0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
1b0f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b100 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
1b130 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
1b140 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
1b150 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
1b160 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1b170 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
1b180 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1b190 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
1b1a0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
1b1b0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1b1c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1b1d0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b1e0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1b1f0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
1b200 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1b210 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
1b220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b230 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
1b240 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
1b250 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
1b260 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
1b270 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
1b280 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b290 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
1b2a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1b2b0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
1b2c0 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
1b2d0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
1b2e0 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
1b310 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
1b320 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
1b330 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
1b340 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1b350 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1b360 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1b370 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1b380 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1b390 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1b3a0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
1b3b0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
1b3c0 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
1b3d0 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
1b3e0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
1b3f0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
1b400 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
1b410 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1b420 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
1b430 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
1b440 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1b450 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
1b460 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1b470 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
1b480 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
1b490 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
1b4a0 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20 20  t regDest,      
1b4b0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
1b4c0 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1b4d0 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73  ter */.  u8 reus
1b4e0 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72  able       /* Tr
1b4f0 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65  ue if this expre
1b500 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c  ssion is reusabl
1b510 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  e */.){.  ExprLi
1b520 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
1b530 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
1b540 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
1b550 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1b560 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  pr;.  pExpr = sq
1b570 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
1b580 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
1b590 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
1b5a0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1b5b0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
1b5c0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1b5d0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1b5e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1b5f0 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
1b600 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
1b610 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20  u.iConstExprReg 
1b620 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20  = regDest;.     
1b630 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
1b640 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a  = reusable;.  }.
1b650 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
1b660 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  Expr = p;.}../*.
1b670 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b680 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
1b690 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
1b6a0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1b6b0 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
1b6c0 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
1b6d0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1b6e0 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
1b6f0 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
1b700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1b710 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1b720 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1b730 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
1b740 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
1b750 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
1b760 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
1b770 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
1b780 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
1b790 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
1b7a0 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
1b7b0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ero..**.** If pE
1b7c0 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
1b7d0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1b7e0 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72  tine might gener
1b7f0 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65  ate this.** code
1b800 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67   to fill the reg
1b810 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69  ister in the ini
1b820 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74  tialization sect
1b830 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
1b840 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f  BE program, in o
1b850 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69  rder to factor i
1b860 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61  t out of the eva
1b870 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f  luation loop..*/
1b880 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1b890 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
1b8a0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1b8b0 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
1b8c0 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78  .  int r2;.  pEx
1b8d0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1b8e0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
1b8f0 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
1b900 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
1b910 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
1b920 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
1b930 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1b940 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
1b950 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
1b960 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50  ExprList *p = pP
1b970 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1b980 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1b990 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20   *pReg  = 0;.   
1b9a0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1b9b0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1b9c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1b9d0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
1b9e0 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
1b9f0 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
1ba00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ba10 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
1ba20 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
1ba30 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
1ba40 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
1ba50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1ba60 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
1ba70 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
1ba80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ba90 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50   }.    r2 = ++pP
1baa0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1bab0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1bac0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1bad0 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d  xpr, r2, 1);.  }
1bae0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
1baf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1bb00 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1bb10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1bb20 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1bb30 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
1bb40 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
1bb50 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
1bb60 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
1bb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1bb80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1bb90 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
1bba0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1bbb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
1bbc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1bbd0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1bbe0 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
1bbf0 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
1bc00 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1bc10 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1bc20 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1bc30 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
1bc40 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
1bc50 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
1bc60 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
1bc70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
1bc80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1bc90 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1bca0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
1bcb0 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
1bcc0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
1bcd0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
1bce0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
1bcf0 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
1bd00 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
1bd10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bd20 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1bd30 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
1bd40 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
1bd50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1bd60 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1bd70 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1bd80 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1bd90 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
1bda0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c   pParse->pVdbe |
1bdb0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1bdc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1bdd0 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1bde0 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
1bdf0 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
1be00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1be10 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1be20 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1be30 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
1be40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1be50 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
1be60 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70  ill evaluate exp
1be70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e  ression pExpr an
1be80 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72  d store the.** r
1be90 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74  esults in regist
1bea0 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  er target.  The 
1beb0 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72  results are guar
1bec0 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72  anteed to appear
1bed0 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1bee0 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20  target.  If the 
1bef0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
1bf00 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69  nstant, then thi
1bf10 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
1bf20 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64  ht choose to cod
1bf30 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
1bf40 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69   at initializati
1bf50 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64  on time..*/.void
1bf60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bf70 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65  Factorable(Parse
1bf80 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1bf90 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1bfa0 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t){.  if( pParse
1bfb0 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20  ->okConstFactor 
1bfc0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1bfd0 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20  Constant(pExpr) 
1bfe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1bff0 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61  prCodeAtInit(pPa
1c000 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1c010 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  et, 0);.  }else{
1c020 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1c030 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
1c040 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d  pr, target);.  }
1c050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c060 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61  te code that eva
1c070 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65 6e  luates the given
1c080 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
1c090 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a  puts the result.
1c0a0 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1c0b0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  arget..**.** Als
1c0c0 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  o make a copy of
1c0d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c0e0 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f  results into ano
1c0f0 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65 67  ther "cache" reg
1c100 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64  ister.** and mod
1c110 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
1c120 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  on so that the n
1c130 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  ext time it is e
1c140 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65  valuated,.** the
1c150 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70   result is a cop
1c160 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 72  y of the cache r
1c170 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  egister..**.** T
1c180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1c190 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73 69  sed for expressi
1c1a0 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73 65  ons that are use
1c1b0 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
1c1c0 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65 20  imes.  They are 
1c1d0 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61  evaluated once a
1c1e0 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  nd the results o
1c1f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1c200 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a  .** are reused..
1c210 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c220 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28  xprCodeAndCache(
1c230 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
1c240 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
1c250 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20  target){.  Vdbe 
1c260 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1c270 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a  be;.  int iMem;.
1c280 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1c290 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
1c2a0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52   pExpr->op!=TK_R
1c2b0 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c  EGISTER );.  sql
1c2c0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1c2d0 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1c2e0 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b  et);.  iMem = ++
1c2f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1c300 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1c310 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61  2(v, OP_Copy, ta
1c320 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65  rget, iMem);.  e
1c330 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70 45  xprToRegister(pE
1c340 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23  xpr, iMem);.}..#
1c350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c360 55 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  UG./*.** Generat
1c370 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
1c380 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
1c390 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1c3a0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
1c3b0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1c3c0 72 28 54 72 65 65 56 69 65 77 20 2a 70 56 69 65  r(TreeView *pVie
1c3d0 77 2c 20 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  w, const Expr *p
1c3e0 45 78 70 72 2c 20 75 38 20 6d 6f 72 65 54 6f 46  Expr, u8 moreToF
1c3f0 6f 6c 6c 6f 77 29 7b 0a 20 20 63 6f 6e 73 74 20  ollow){.  const 
1c400 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30  char *zBinOp = 0
1c410 3b 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70  ;   /* Binary op
1c420 65 72 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  erator */.  cons
1c430 74 20 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d  t char *zUniOp =
1c440 20 30 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f   0;   /* Unary o
1c450 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 70 56 69  perator */.  pVi
1c460 65 77 20 3d 20 73 71 6c 69 74 65 33 54 72 65 65  ew = sqlite3Tree
1c470 56 69 65 77 50 75 73 68 28 70 56 69 65 77 2c 20  ViewPush(pView, 
1c480 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20  moreToFollow);. 
1c490 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
1c4a0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
1c4b0 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1c4c0 22 6e 69 6c 22 29 3b 0a 20 20 20 20 73 71 6c 69  "nil");.    sqli
1c4d0 74 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70  te3TreeViewPop(p
1c4e0 56 69 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72  View);.    retur
1c4f0 6e 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  n;.  }.  switch(
1c500 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
1c510 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1c520 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  LUMN: {.      sq
1c530 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1c540 65 28 70 56 69 65 77 2c 20 22 41 47 47 7b 25 64  e(pView, "AGG{%d
1c550 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
1c560 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1c570 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1c580 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c590 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1c5a0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1c5b0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
1c5c0 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
1c5d0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
1c5e0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
1c5f0 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
1c600 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  nts */.        s
1c610 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1c620 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 55 4d  ne(pView, "COLUM
1c630 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69  N(%d)", pExpr->i
1c640 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
1c650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1c660 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1c670 65 28 70 56 69 65 77 2c 20 22 7b 25 64 3a 25 64  e(pView, "{%d:%d
1c680 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  }",.            
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1c6b0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1c6c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1c6d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c6e0 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
1c6f0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
1c700 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1c710 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  ntValue ){.     
1c720 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1c730 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25  ewLine(pView, "%
1c740 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
1c750 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lue);.      }els
1c760 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1c770 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c780 56 69 65 77 2c 20 22 25 73 22 2c 20 70 45 78 70  View, "%s", pExp
1c790 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c7a0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1c7b0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1c7c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1c7d0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1c7e0 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1c7f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1c800 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c810 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%s", pExpr->u.
1c820 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1c830 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1c840 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1c850 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73  TRING: {.      s
1c860 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1c870 6e 65 28 70 56 69 65 77 2c 22 25 51 22 2c 20 70  ne(pView,"%Q", p
1c880 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1c890 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c8a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1c8b0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1c8c0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1c8d0 65 28 70 56 69 65 77 2c 22 4e 55 4c 4c 22 29 3b  e(pView,"NULL");
1c8e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c8f0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1c900 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
1c910 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
1c920 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73  _BLOB: {.      s
1c930 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1c940 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20 70  ne(pView,"%s", p
1c950 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1c960 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c970 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1c980 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1c990 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c9a0 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1c9b0 65 77 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c  ew,"VARIABLE(%s,
1c9c0 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d)",.          
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1c9f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1ca00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ca10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1ca20 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
1ca30 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1ca40 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 52 45  ewLine(pView,"RE
1ca50 47 49 53 54 45 52 28 25 64 29 22 2c 20 70 45 78  GISTER(%d)", pEx
1ca60 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
1ca70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ca80 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
1ca90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
1caa0 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1cab0 77 2c 22 41 53 20 25 51 22 2c 20 70 45 78 70 72  w,"AS %Q", pExpr
1cac0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1cad0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1cae0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
1caf0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
1cb00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cb10 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1cb20 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
1cb30 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1cb40 56 69 65 77 2c 22 49 44 20 25 51 22 2c 20 70 45  View,"ID %Q", pE
1cb50 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1cb60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cb70 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1cb80 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
1cb90 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
1cba0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
1cbb0 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
1cbc0 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
1cbd0 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
1cbe0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1cbf0 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 43 41 53  wLine(pView,"CAS
1cc00 54 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  T %Q", pExpr->u.
1cc10 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
1cc20 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1cc30 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1cc40 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
1cc50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1cc60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1cc70 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1cc80 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
1cc90 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b    zBinOp = "LT";
1cca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ccb0 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
1ccc0 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20   zBinOp = "LE"; 
1ccd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1cce0 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
1ccf0 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20  zBinOp = "GT";  
1cd00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1cd10 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
1cd20 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20 20 20  BinOp = "GE";   
1cd30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cd40 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42  e TK_NE:      zB
1cd50 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20  inOp = "NE";    
1cd60 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cd70 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 42 69   TK_EQ:      zBi
1cd80 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  nOp = "EQ";     
1cd90 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cda0 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42 69 6e  TK_IS:      zBin
1cdb0 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 62  Op = "IS";     b
1cdc0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1cdd0 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f  K_ISNOT:   zBinO
1cde0 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 62 72  p = "ISNOT";  br
1cdf0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1ce00 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _AND:     zBinOp
1ce10 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62 72 65   = "AND";    bre
1ce20 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1ce30 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  OR:      zBinOp 
1ce40 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72 65 61  = "OR";     brea
1ce50 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
1ce60 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d  LUS:    zBinOp =
1ce70 20 22 41 44 44 22 3b 20 20 20 20 62 72 65 61 6b   "ADD";    break
1ce80 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
1ce90 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  AR:    zBinOp = 
1cea0 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  "MUL";    break;
1ceb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1cec0 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  US:   zBinOp = "
1ced0 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  SUB";    break;.
1cee0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1cef0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52       zBinOp = "R
1cf00 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  EM";    break;. 
1cf10 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
1cf20 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49  D:  zBinOp = "BI
1cf30 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TAND"; break;.  
1cf40 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1cf50 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54     zBinOp = "BIT
1cf60 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OR";  break;.   
1cf70 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
1cf80 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49 56 22    zBinOp = "DIV"
1cf90 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1cfa0 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20  case TK_LSHIFT: 
1cfb0 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46   zBinOp = "LSHIF
1cfc0 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1cfd0 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
1cfe0 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49 46 54  zBinOp = "RSHIFT
1cff0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1d000 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
1d010 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22  BinOp = "CONCAT"
1d020 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1d030 65 20 54 4b 5f 44 4f 54 3a 20 20 20 20 20 7a 42  e TK_DOT:     zB
1d040 69 6e 4f 70 20 3d 20 22 44 4f 54 22 3b 20 20 20  inOp = "DOT";   
1d050 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
1d060 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55  e TK_UMINUS:  zU
1d070 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b  niOp = "UMINUS";
1d080 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1d090 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e   TK_UPLUS:   zUn
1d0a0 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20  iOp = "UPLUS";  
1d0b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d0c0 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69  TK_BITNOT:  zUni
1d0d0 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62  Op = "BITNOT"; b
1d0e0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1d0f0 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f  K_NOT:     zUniO
1d100 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72  p = "NOT";    br
1d110 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1d120 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70  _ISNULL:  zUniOp
1d130 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65   = "ISNULL"; bre
1d140 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d150 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20  NOTNULL: zUniOp 
1d160 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
1d170 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1d180 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20  _COLLATE: {.    
1d190 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d1a0 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43 4f  wLine(pView, "CO
1d1b0 4c 4c 41 54 45 20 25 51 22 2c 20 70 45 78 70 72  LLATE %Q", pExpr
1d1c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1d1d0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d1e0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
1d1f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
1d200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d210 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
1d220 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
1d230 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
1d240 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
1d250 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20  List *pFarg;    
1d260 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75     /* List of fu
1d270 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1d280 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78   */.      if( Ex
1d290 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1d2a0 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
1d2b0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
1d2c0 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
1d2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
1d2e0 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
1d2f0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
1d300 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1d310 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
1d320 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ON ){.        sq
1d330 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d340 65 28 70 56 69 65 77 2c 20 22 41 47 47 5f 46 55  e(pView, "AGG_FU
1d350 4e 43 54 49 4f 4e 25 64 20 25 51 22 2c 0a 20 20  NCTION%d %Q",.  
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1d380 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e  ->op2, pExpr->u.
1d390 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1d3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1d3b0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d3c0 65 28 70 56 69 65 77 2c 20 22 46 55 4e 43 54 49  e(pView, "FUNCTI
1d3d0 4f 4e 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  ON %Q", pExpr->u
1d3e0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1d3f0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61 72  }.      if( pFar
1d400 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
1d410 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
1d420 4c 69 73 74 28 70 56 69 65 77 2c 20 70 46 61 72  List(pView, pFar
1d430 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
1d440 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1d450 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1d460 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d470 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
1d480 49 53 54 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  ISTS: {.      sq
1d490 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d4a0 65 28 70 56 69 65 77 2c 20 22 45 58 49 53 54 53  e(pView, "EXISTS
1d4b0 2d 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 73  -expr");.      s
1d4c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
1d4d0 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70  lect(pView, pExp
1d4e0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29  r->x.pSelect, 0)
1d4f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d500 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d510 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1d520 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d530 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 53 45 4c  Line(pView, "SEL
1d540 45 43 54 2d 65 78 70 72 22 29 3b 0a 20 20 20 20  ECT-expr");.    
1d550 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d560 77 53 65 6c 65 63 74 28 70 56 69 65 77 2c 20 70  wSelect(pView, p
1d570 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  Expr->x.pSelect,
1d580 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
1d590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d5a0 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
1d5b0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1d5c0 69 6e 65 28 70 56 69 65 77 2c 20 22 49 4e 22 29  ine(pView, "IN")
1d5d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1d5e0 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1d5f0 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
1d600 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45   1);.      if( E
1d610 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1d620 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1d630 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ct) ){.        s
1d640 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
1d650 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70  lect(pView, pExp
1d660 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29  r->x.pSelect, 0)
1d670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d680 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1d690 65 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70  eeViewExprList(p
1d6a0 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70  View, pExpr->x.p
1d6b0 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
1d6c0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1d6d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1d6e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
1d6f0 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f  BQUERY */..    /
1d700 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
1d710 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
1d720 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1d730 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1d740 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
1d750 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1d760 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1d770 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1d780 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
1d790 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
1d7a0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1d7b0 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
1d7c0 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
1d7d0 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
1d7e0 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
1d7f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
1d800 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1d810 45 78 70 72 20 2a 70 58 20 3d 20 70 45 78 70 72  Expr *pX = pExpr
1d820 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
1d830 78 70 72 20 2a 70 59 20 3d 20 70 45 78 70 72 2d  xpr *pY = pExpr-
1d840 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1d850 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1d860 20 2a 70 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pZ = pExpr->x.
1d870 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1d880 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1d890 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1d8a0 65 77 2c 20 22 42 45 54 57 45 45 4e 22 29 3b 0a  ew, "BETWEEN");.
1d8b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1d8c0 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
1d8d0 20 70 58 2c 20 31 29 3b 0a 20 20 20 20 20 20 73   pX, 1);.      s
1d8e0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d8f0 70 72 28 70 56 69 65 77 2c 20 70 59 2c 20 31 29  pr(pView, pY, 1)
1d900 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1d910 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1d920 77 2c 20 70 5a 2c 20 30 29 3b 0a 20 20 20 20 20  w, pZ, 0);.     
1d930 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d940 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
1d950 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
1d960 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
1d970 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
1d980 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1d990 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
1d9a0 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
1d9b0 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
1d9c0 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
1d9d0 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
1d9e0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
1d9f0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
1da00 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
1da10 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
1da20 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
1da30 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
1da40 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
1da50 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
1da60 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
1da70 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
1da80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
1da90 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
1daa0 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
1dab0 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
1dac0 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
1dad0 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
1dae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
1daf0 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1db00 70 56 69 65 77 2c 20 22 25 73 28 25 64 29 22 2c  pView, "%s(%d)",
1db10 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
1db20 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57  r->iTable ? "NEW
1db30 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72  " : "OLD", pExpr
1db40 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1db50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1db60 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
1db70 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1db80 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1db90 65 77 2c 20 22 43 41 53 45 22 29 3b 0a 20 20 20  ew, "CASE");.   
1dba0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1dbb0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
1dbc0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b 0a  xpr->pLeft, 1);.
1dbd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1dbe0 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
1dbf0 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  iew, pExpr->x.pL
1dc00 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ist, 0, 0);.    
1dc10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1dc20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dc30 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 63  IT_TRIGGER.    c
1dc40 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a  ase TK_RAISE: {.
1dc50 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1dc60 20 2a 7a 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b   *zType = "unk";
1dc70 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
1dc80 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 29  Expr->affinity )
1dc90 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  {.        case O
1dca0 45 5f 52 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54  E_Rollback:   zT
1dcb0 79 70 65 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22  ype = "rollback"
1dcc0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
1dcd0 20 20 63 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a    case OE_Abort:
1dce0 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61        zType = "a
1dcf0 62 6f 72 74 22 3b 20 20 20 20 20 62 72 65 61 6b  bort";     break
1dd00 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  ;.        case O
1dd10 45 5f 46 61 69 6c 3a 20 20 20 20 20 20 20 7a 54  E_Fail:       zT
1dd20 79 70 65 20 3d 20 22 66 61 69 6c 22 3b 20 20 20  ype = "fail";   
1dd30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1dd40 20 20 63 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65    case OE_Ignore
1dd50 3a 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 69  :     zType = "i
1dd60 67 6e 6f 72 65 22 3b 20 20 20 20 62 72 65 61 6b  gnore";    break
1dd70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dd80 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1dd90 69 6e 65 28 70 56 69 65 77 2c 20 22 52 41 49 53  ine(pView, "RAIS
1dda0 45 20 25 73 28 25 51 29 22 2c 20 7a 54 79 70 65  E %s(%Q)", zType
1ddb0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1ddc0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1ddd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1dde0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1ddf0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1de00 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 6f  ewLine(pView, "o
1de10 70 3d 25 64 22 2c 20 70 45 78 70 72 2d 3e 6f 70  p=%d", pExpr->op
1de20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1de30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1de40 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71  zBinOp ){.    sq
1de50 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1de60 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 7a  e(pView, "%s", z
1de70 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  BinOp);.    sqli
1de80 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1de90 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
1dea0 65 66 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  eft, 1);.    sql
1deb0 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
1dec0 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70  (pView, pExpr->p
1ded0 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 65 6c  Right, 0);.  }el
1dee0 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b  se if( zUniOp ){
1def0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
1df00 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1df10 22 25 73 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20  "%s", zUniOp);. 
1df20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1df30 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 45  ewExpr(pView, pE
1df40 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a  xpr->pLeft, 0);.
1df50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 72 65    }.  sqlite3Tre
1df60 65 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b  eViewPop(pView);
1df70 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1df80 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
1df90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1dfa0 47 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  G./*.** Generate
1dfb0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
1dfc0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
1dfd0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
1dfe0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
1dff0 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
1e000 4c 69 73 74 28 0a 20 20 54 72 65 65 56 69 65 77  List(.  TreeView
1e010 20 2a 70 56 69 65 77 2c 0a 20 20 63 6f 6e 73 74   *pView,.  const
1e020 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1e030 2c 0a 20 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c  ,.  u8 moreToFol
1e040 6c 6f 77 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  low,.  const cha
1e050 72 20 2a 7a 4c 61 62 65 6c 0a 29 7b 0a 20 20 69  r *zLabel.){.  i
1e060 6e 74 20 69 3b 0a 20 20 70 56 69 65 77 20 3d 20  nt i;.  pView = 
1e070 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50  sqlite3TreeViewP
1e080 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54  ush(pView, moreT
1e090 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20  oFollow);.  if( 
1e0a0 7a 4c 61 62 65 6c 3d 3d 30 20 7c 7c 20 7a 4c 61  zLabel==0 || zLa
1e0b0 62 65 6c 5b 30 5d 3d 3d 30 20 29 20 7a 4c 61 62  bel[0]==0 ) zLab
1e0c0 65 6c 20 3d 20 22 4c 49 53 54 22 3b 0a 20 20 69  el = "LIST";.  i
1e0d0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1e0e0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1e0f0 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25  ewLine(pView, "%
1e100 73 20 28 65 6d 70 74 79 29 22 2c 20 7a 4c 61 62  s (empty)", zLab
1e110 65 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  el);.  }else{.  
1e120 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1e130 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73  wLine(pView, "%s
1e140 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20  ", zLabel);.    
1e150 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1e160 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1e170 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1e180 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1e190 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
1e1a0 72 2c 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  r, i<pList->nExp
1e1b0 72 2d 31 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  r-1);.#if 0.    
1e1c0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1e1d0 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
1e1e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1e1f0 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 41  Printf(pOut, " A
1e200 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  S %s", pList->a[
1e210 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
1e220 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69   }.      if( pLi
1e230 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73  st->a[i].bSpanIs
1e240 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1e250 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1e260 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25 73 29  ntf(pOut, " (%s)
1e270 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
1e280 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Span);.      }.#
1e290 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1e2a0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1e2b0 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23  wPop(pView);.}.#
1e2c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e2d0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1e2e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1e2f0 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
1e300 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
1e310 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
1e320 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1e330 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
1e340 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1e350 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
1e360 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
1e370 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1e380 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
1e390 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
1e3a0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
1e3b0 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
1e3c0 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
1e3d0 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
1e3e0 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
1e3f0 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
1e400 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
1e410 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1e420 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
1e430 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
1e440 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
1e450 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
1e460 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
1e470 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
1e480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
1e490 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
1e4a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1e4b0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1e4c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1e4d0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
1e4e0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
1e4f0 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
1e500 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67  ed */.  int targ
1e510 65 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68  et,        /* Wh
1e520 65 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73  ere to write res
1e530 75 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66 6c 61  ults */.  u8 fla
1e540 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
1e550 53 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c  SQLITE_ECEL_* fl
1e560 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ags */.){.  stru
1e570 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1e580 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1e590 2c 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70  , n;.  u8 copyOp
1e5a0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1e5b0 54 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f  TE_ECEL_DUP) ? O
1e5c0 50 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70  P_Copy : OP_SCop
1e5d0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  y;.  assert( pLi
1e5e0 73 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  st!=0 );.  asser
1e5f0 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20  t( target>0 );. 
1e600 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1e610 3e 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a  >pVdbe!=0 );  /*
1e620 20 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73   Never gets this
1e630 20 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a   far otherwise *
1e640 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e  /.  n = pList->n
1e650 45 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e  Expr;.  if( !Con
1e660 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1e670 65 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53  e) ) flags &= ~S
1e680 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1e690 52 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  R;.  for(pItem=p
1e6a0 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1e6b0 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
1e6c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
1e6d0 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  r = pItem->pExpr
1e6e0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1e6f0 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46   & SQLITE_ECEL_F
1e700 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c  ACTOR)!=0 && sql
1e710 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1e720 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  nt(pExpr) ){.   
1e730 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1e740 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1e750 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1e760 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1e770 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67  .      int inReg
1e780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1e790 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1e7a0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69   pExpr, target+i
1e7b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
1e7c0 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a  eg!=target+i ){.
1e7d0 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
1e7e0 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 56 64 62  pOp;.        Vdb
1e7f0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1e800 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Vdbe;.        if
1e810 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70  ( copyOp==OP_Cop
1e820 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  y.         && (p
1e830 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65  Op=sqlite3VdbeGe
1e840 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63  tOp(v, -1))->opc
1e850 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20  ode==OP_Copy.   
1e860 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31        && pOp->p1
1e870 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65  +pOp->p3+1==inRe
1e880 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f  g.         && pO
1e890 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d  p->p2+pOp->p3+1=
1e8a0 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20  =target+i.      
1e8b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
1e8c0 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20  Op->p3++;.      
1e8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e8f0 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20  dOp2(v, copyOp, 
1e900 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29  inReg, target+i)
1e910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e920 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1e930 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1e940 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e950 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f   for a BETWEEN o
1e960 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  perator..**.**  
1e970 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e    x BETWEEN y AN
1e980 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62  D z.**.** The ab
1e990 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ove is equivalen
1e9a0 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78  t to .**.**    x
1e9b0 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a  >=y AND x<=z.**.
1e9c0 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75  ** Code it as su
1e9d0 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20  ch, taking care 
1e9e0 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  to do the common
1e9f0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
1ea00 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66  * elimination of
1ea10 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   x..*/.static vo
1ea20 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
1ea30 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
1ea40 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1ea50 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1ea60 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1ea70 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1ea80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
1ea90 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
1eaa0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
1eab0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1eac0 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20  ere if the jump 
1ead0 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e  is taken */.  in
1eae0 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20  t jumpIfTrue,   
1eaf0 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1eb00 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1eb10 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1eb20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1eb30 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
1eb40 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
1eb50 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45  s NULL */.){.  E
1eb60 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
1eb70 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
1eb80 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
1eb90 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
1eba0 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
1ebb0 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
1ebc0 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
1ebd0 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
1ebe0 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
1ebf0 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
1ec00 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
1ec10 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1ec20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1ec30 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
1ec40 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
1ec50 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1ec60 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ec70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1ec80 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70   );.  exprX = *p
1ec90 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65  Expr->pLeft;.  e
1eca0 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
1ecb0 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c  ND;.  exprAnd.pL
1ecc0 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
1ecd0 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68  .  exprAnd.pRigh
1ece0 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
1ecf0 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
1ed00 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66  TK_GE;.  compLef
1ed10 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1ed20 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69  ;.  compLeft.pRi
1ed30 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1ed40 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1ed50 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70  ;.  compRight.op
1ed60 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70   = TK_LE;.  comp
1ed70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
1ed80 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68  xprX;.  compRigh
1ed90 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
1eda0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
1edb0 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52  pExpr;.  exprToR
1edc0 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20  egister(&exprX, 
1edd0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ede0 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
1edf0 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  rX, &regFree1));
1ee00 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75  .  if( jumpIfTru
1ee10 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1ee20 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1ee30 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1ee40 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ee50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1ee60 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1ee70 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1ee80 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1ee90 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
1eea0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1eeb0 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1eec0 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
1eed0 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
1eee0 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
1eef0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1ef00 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1ef10 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1ef20 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1ef30 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1ef40 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1ef50 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1ef60 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1ef70 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1ef80 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1ef90 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1efa0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1efb0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1efc0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1efd0 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1efe0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1eff0 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1f000 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1f010 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1f020 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1f030 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1f040 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1f050 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1f060 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1f070 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1f080 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
1f090 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1f0a0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1f0b0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1f0c0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1f0d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1f0e0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1f0f0 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1f100 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1f110 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1f120 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1f130 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1f140 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
1f150 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1f160 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1f170 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1f180 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1f190 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1f1a0 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1f1b0 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1f1c0 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1f1d0 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
1f1e0 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1f1f0 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
1f200 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
1f210 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
1f220 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1f230 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1f240 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
1f250 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
1f260 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
1f270 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
1f280 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
1f290 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
1f2a0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1f2b0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
1f2c0 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
1f2d0 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
1f2e0 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
1f2f0 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
1f300 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
1f310 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
1f320 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
1f330 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
1f340 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
1f350 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
1f360 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
1f370 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
1f380 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1f390 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
1f3a0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1f3b0 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
1f3c0 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
1f3d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1f3e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
1f3f0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1f400 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
1f410 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
1f420 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
1f430 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
1f440 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
1f450 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
1f460 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
1f470 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
1f480 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
1f490 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1f4a0 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1f4b0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
1f4c0 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
1f4d0 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
1f4e0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
1f4f0 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
1f500 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
1f510 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1f520 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
1f530 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1f540 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1f550 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f560 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f570 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f580 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1f590 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1f5a0 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
1f5b0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1f5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f5d0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1f5e0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1f5f0 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1f600 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f610 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f620 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f630 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f640 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1f650 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f660 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1f670 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f680 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
1f690 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1f6a0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1f6b0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1f6c0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1f6d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f6e0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f6f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f700 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1f710 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f720 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1f730 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1f740 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1f750 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f760 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f770 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1f780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f790 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1f7a0 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1f7b0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1f7c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1f7d0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1f7e0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f7f0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1f800 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1f810 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f820 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1f830 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1f840 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1f850 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1f860 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1f870 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1f880 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f890 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f8a0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f8b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f8c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f8d0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f8e0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1f8f0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1f900 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f910 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1f920 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1f930 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1f940 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1f950 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1f970 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1f980 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
1f990 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1f9a0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1f9b0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1f9c0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1f9d0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
1f9e0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1f9f0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1fa00 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1fa10 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1fa20 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
1fa30 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1fa40 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1fa50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1fa60 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1fa70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fa80 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1fa90 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1faa0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1fab0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1fac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fad0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1fae0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1faf0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1fb00 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1fb10 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1fb20 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1fb30 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1fb40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fb50 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1fb60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1fb70 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1fb80 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fb90 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1fba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fbb0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1fbc0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1fbd0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1fbe0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
1fbf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc00 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1fc10 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1fc20 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1fc30 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fc40 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1fc50 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1fc60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fc70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fc80 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1fc90 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
1fca0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1fcb0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1fcc0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1fcd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fce0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1fcf0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1fd00 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1fd10 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  dest, SQLITE_NUL
1fd20 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
1fd30 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1fd40 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20  ==TK_EQ);.      
1fd50 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1fd60 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20  , op==TK_NE);.  
1fd70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1fd80 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1fd90 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1fda0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1fdb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fdc0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1fdd0 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1fde0 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1fdf0 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1fe00 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1fe10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fe20 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1fe30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1fe40 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1fe50 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1fe60 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1fe70 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1fe80 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1fe90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1fea0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1feb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fec0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1fed0 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1fee0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1fef0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1ff00 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
1ff10 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1ff20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
1ff30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ff40 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1ff50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ff60 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1ff70 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1ff80 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1ff90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1ffa0 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1ffb0 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1ffc0 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1ffd0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ffe0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1fff0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20000 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
20010 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
20020 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
20030 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20040 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
20050 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
20060 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
20070 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
20080 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
20090 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
200a0 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
200b0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
200c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
200d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
200e0 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
200f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20100 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
20110 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
20120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
20130 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
20140 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
20150 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
20160 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
20170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20180 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
20190 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
201a0 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
201b0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
201c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
201d0 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
201e0 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
201f0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
20200 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
20210 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20230 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
20240 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
20250 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
20260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
20270 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
20280 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
20290 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
202a0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
202b0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
202c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
202d0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
202e0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
202f0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
20300 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
20310 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
20320 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
20330 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
20340 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
20350 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
20360 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
20370 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
20380 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
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 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
203b0 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
203c0 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
203d0 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
203e0 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
203f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
20400 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
20410 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
20420 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
20430 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
20440 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
20450 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
20460 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
20470 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
20480 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
20490 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
204a0 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
204b0 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
204c0 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
204d0 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
204e0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
204f0 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
20500 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
20510 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
20520 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
20530 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
20540 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
20550 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
20560 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
20570 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
20580 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
20590 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
205a0 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
205b0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
205c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
205d0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
205e0 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
205f0 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
20600 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
20610 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
20620 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
20630 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
20640 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
20650 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
20660 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
20670 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
20680 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
20690 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
206a0 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
206b0 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
206c0 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
206d0 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
206e0 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
206f0 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
20700 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
20720 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
20730 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
20740 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
20750 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
20760 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
20770 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
20780 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
20790 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
207a0 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
207b0 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
207c0 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
207d0 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
207e0 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
207f0 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
20800 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
20810 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
20820 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
20830 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
20840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
20850 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
20860 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
20870 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
20880 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
20890 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
208a0 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
208b0 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
208c0 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
208d0 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
208e0 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
208f0 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
20900 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20910 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
20920 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
20930 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
20940 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
20950 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
20960 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
20970 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
20980 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
20990 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
209a0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
209b0 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
209c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
209d0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
209e0 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
209f0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
20a00 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
20a10 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
20a20 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
20a30 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
20a40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
20a50 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
20a60 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
20a70 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
20a80 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
20a90 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
20aa0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
20ab0 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
20ac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20ad0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
20ae0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
20af0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20b00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20b10 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
20b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20b30 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
20b40 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
20b50 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20b60 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
20b70 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
20b80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
20b90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20ba0 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
20bb0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
20bc0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20bd0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
20be0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
20bf0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
20c00 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
20c10 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20c20 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
20c30 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
20c40 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
20c50 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20c60 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20c70 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20c80 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
20c90 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
20ca0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20cb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20cc0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
20cd0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
20ce0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
20cf0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
20d00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20d10 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
20d20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20d30 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
20d40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
20d50 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
20d60 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
20d70 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
20d80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20d90 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
20da0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
20db0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
20dc0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
20dd0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
20de0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
20df0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
20e00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20e10 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
20e20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20e30 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
20e40 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
20e50 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
20e60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20e70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20e80 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
20e90 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
20ea0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
20eb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20ec0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
20ed0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
20ee0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
20ef0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
20f00 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
20f10 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
20f20 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
20f30 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20f40 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
20f50 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
20f60 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
20f70 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
20f80 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
20f90 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
20fa0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
20fb0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
20fc0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
20fd0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
20fe0 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
20ff0 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
21000 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
21010 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
21020 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
21030 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
21040 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
21050 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
21060 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
21070 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
21080 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
21090 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
210a0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
210b0 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
210c0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
210d0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
210e0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
210f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21100 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
21110 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
21120 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
21130 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
21140 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
21150 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
21160 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
21170 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
21180 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
21190 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
211a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
211b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
211c0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
211d0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
211e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
211f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
21200 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
21210 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
21220 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
21230 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
21240 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64  TK_EQ;.      cod
21250 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
21260 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
21270 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
21280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21290 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
212a0 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
212b0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
212c0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
212d0 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
212e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
212f0 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
21300 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
21310 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
21320 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
21330 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
21340 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
21350 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
21360 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
21370 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
21380 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21390 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
213a0 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
213b0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
213c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
213d0 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
213e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
213f0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
21400 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
21410 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
21420 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
21430 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
21440 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
21450 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
21460 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
21470 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
21480 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
21490 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
214a0 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
214b0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
214c0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
214d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
214e0 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
214f0 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
21500 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   0, jumpIfNull);
21510 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21520 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
21530 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
21540 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
21550 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
21560 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
21570 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
21580 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
21590 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
215a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
215b0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
215c0 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
215d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
215e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
215f0 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
21600 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
21610 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
21620 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21630 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
21640 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
21650 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
21660 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
21670 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
21680 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
21690 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
216a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
216b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
216c0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
216d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
216e0 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
216f0 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
21700 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
21710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21720 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
21730 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
21740 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
21750 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
21760 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
21770 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
21780 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
21790 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
217a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
217b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
217c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
217d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
217e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
217f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
21800 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21810 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
21820 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
21830 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
21840 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
21850 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
21860 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
21870 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
21880 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
21890 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
218a0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
218b0 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
218c0 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
218d0 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
218e0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
218f0 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
21900 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
21910 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
21920 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
21930 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
21940 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
21950 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
21960 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
21970 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
21980 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
21990 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
219a0 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
219b0 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
219c0 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
219d0 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
219e0 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
219f0 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
21a00 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
21a10 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
21a20 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
21a30 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
21a40 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
21a50 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
21a60 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
21a70 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
21a80 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
21a90 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
21aa0 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
21ab0 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
21ac0 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
21ad0 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
21ae0 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
21af0 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
21b00 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
21b10 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
21b20 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
21b30 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
21b40 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
21b50 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
21b60 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
21b70 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
21b80 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
21b90 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
21ba0 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
21bb0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
21bc0 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
21bd0 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
21be0 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
21bf0 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
21c00 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
21c10 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
21c20 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
21c30 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
21c40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
21c50 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
21c60 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
21c70 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
21c80 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
21c90 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
21ca0 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
21cb0 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
21cc0 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
21cd0 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
21ce0 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
21cf0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21d00 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
21d10 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
21d20 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
21d30 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
21d40 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
21d50 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
21d60 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
21d70 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   2;.  }.  combin
21d80 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
21d90 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
21da0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
21db0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
21dc0 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
21dd0 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
21de0 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
21df0 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
21e00 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
21e10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21e20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
21e30 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
21e40 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
21e50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
21e60 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
21e70 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
21e80 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
21e90 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20  pB, iTab)<2 ){. 
21ea0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21eb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
21ec0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
21ed0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
21ee0 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c  mpare(pA, pB->pL
21ef0 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a  eft, iTab)<2 ){.
21f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21f10 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
21f20 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
21f30 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
21f40 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70  && ALWAYS(pA->op
21f50 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  !=TK_AGG_COLUMN)
21f60 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
21f70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
21f80 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
21f90 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
21fa0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21fb0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
21fc0 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
21fd0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
21fe0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
21ff0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
22000 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
22010 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
22020 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
22030 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
22040 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b  okenOnly)==0) ){
22050 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
22060 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  dFlags & EP_xIsS
22070 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32  elect ) return 2
22080 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
22090 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
220a0 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
220b0 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
220c0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
220d0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
220e0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
220f0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
22100 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
22110 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
22120 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
22130 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
22140 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
22150 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  n 2;.    if( ALW
22160 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
22170 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
22180 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ==0) ){.      if
22190 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
221a0 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
221b0 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
221c0 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
221d0 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
221e0 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
221f0 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
22200 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
22210 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
22220 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22230 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
22240 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
22250 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
22260 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
22270 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
22280 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
22290 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
222a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
222b0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
222c0 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
222d0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
222e0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
222f0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
22300 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
22310 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
22320 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
22330 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
22340 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
22350 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
22360 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
22370 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
22380 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
22390 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
223a0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
223b0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
223c0 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
223d0 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
223e0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
223f0 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
22400 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
22410 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
22420 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
22430 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
22440 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
22450 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
22460 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
22470 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
22480 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
22490 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
224a0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
224b0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
224c0 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
224d0 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
224e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
224f0 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
22500 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22510 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
22520 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
22530 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
22540 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
22550 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
22560 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
22570 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
22580 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
22590 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
225a0 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
225b0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
225c0 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
225d0 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
225e0 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
225f0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
22600 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
22610 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
22620 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
22630 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
22640 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22650 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
22660 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
22670 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
22680 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
22690 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
226a0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
226b0 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
226c0 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
226d0 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
226e0 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
226f0 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
22700 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
22710 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
22720 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
22730 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
22740 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
22750 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
22760 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
22770 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
22780 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
22790 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
227a0 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
227b0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
227c0 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
227d0 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
227e0 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
227f0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
22800 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
22810 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
22820 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
22830 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
22840 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
22850 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
22860 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
22870 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
22880 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
22890 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
228a0 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
228b0 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
228c0 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
228d0 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
228e0 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
228f0 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
22900 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
22910 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
22920 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
22930 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
22940 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
22950 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
22960 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
22970 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
22980 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
22990 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
229a0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
229b0 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
229c0 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
229d0 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
229e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
229f0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
22a00 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
22a10 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
22a20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
22a30 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
22a40 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
22a50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22a60 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
22a70 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
22a80 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
22a90 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
22aa0 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
22ab0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
22ac0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
22ad0 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
22ae0 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
22af0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
22b00 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
22b10 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
22b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22b30 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
22b40 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
22b50 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
22b60 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
22b70 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
22b80 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
22b90 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
22ba0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
22bb0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
22bc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
22bd0 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
22be0 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
22bf0 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
22c00 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
22c10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
22c20 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
22c30 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
22c40 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
22c50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
22c60 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
22c70 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
22c80 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
22c90 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
22ca0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
22cb0 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
22cc0 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
22cd0 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
22ce0 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
22cf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22d00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
22d10 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
22d20 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
22d30 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
22d40 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
22d50 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
22d60 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
22d70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
22d80 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
22d90 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22da0 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
22db0 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
22dc0 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
22dd0 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
22de0 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
22df0 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
22e00 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
22e10 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
22e20 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
22e30 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
22e40 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
22e50 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
22e60 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
22e70 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
22e80 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
22e90 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
22ea0 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
22eb0 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
22ec0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
22ed0 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
22ee0 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
22ef0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
22f00 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
22f10 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
22f20 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
22f30 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
22f40 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
22f50 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
22f60 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
22f70 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
22f80 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
22f90 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
22fa0 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
22fb0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
22fc0 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72  Src;.    int nSr
22fd0 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d  c = pSrc ? pSrc-
22fe0 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66  >nSrc : 0;.    f
22ff0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
23000 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
23010 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
23020 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
23030 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
23040 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20  .    if( i<nSrc 
23050 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
23060 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
23070 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
23080 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
23090 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
230a0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
230b0 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
230c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
230d0 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
230e0 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
230f0 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
23100 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
23110 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
23120 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
23130 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
23140 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
23150 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
23160 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
23170 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
23180 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
23190 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
231a0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
231b0 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
231c0 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
231d0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
231e0 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
231f0 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
23200 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
23210 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
23220 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
23230 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
23240 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
23250 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
23260 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
23270 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
23280 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
23290 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
232a0 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
232b0 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
232c0 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
232d0 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
232e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
232f0 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
23300 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
23310 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
23320 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
23330 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
23340 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
23350 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
23360 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
23370 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
23380 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
23390 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
233a0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
233b0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
233c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
233d0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
233e0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
233f0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
23400 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
23410 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
23420 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
23430 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
23440 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
23450 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
23460 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
23470 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
23480 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
23490 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
234a0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
234b0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
234c0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
234d0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
234e0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
234f0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
23500 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
23510 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
23520 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
23530 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
23540 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
23550 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
23560 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
23570 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
23580 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
23590 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
235a0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
235b0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
235c0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
235d0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
235e0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
235f0 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
23600 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
23610 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
23620 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
23630 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
23640 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
23650 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
23660 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
23670 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
23680 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
23690 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
236a0 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
236b0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
236c0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
236d0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
236e0 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
236f0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
23700 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
23710 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
23720 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
23730 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
23740 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
23750 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
23760 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
23770 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
23780 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
23790 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
237a0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
237b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
237c0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
237d0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
237e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
237f0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
23800 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
23810 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
23820 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
23830 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
23840 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
23850 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
23860 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
23870 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
23880 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
23890 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
238a0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
238b0 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
238c0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
238d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
238e0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
238f0 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
23900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
23910 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
23920 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
23930 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
23940 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
23950 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23960 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
23970 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
23980 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
23990 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
239a0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
239b0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
239c0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
239d0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
239e0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
239f0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
23a00 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
23a10 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
23a20 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
23a30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23a40 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
23a50 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
23a60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
23a70 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
23a80 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
23a90 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
23aa0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
23ab0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
23ac0 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
23ad0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
23ae0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
23af0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
23b00 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
23b10 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
23b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
23b30 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
23b40 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
23b50 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
23b60 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
23b70 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
23b80 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
23ba0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
23bb0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
23bd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
23be0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23bf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
23c00 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
23c10 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
23c20 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
23c30 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
23c40 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
23c50 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
23c60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23c70 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
23c80 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
23c90 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
23ca0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
23cb0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
23cc0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
23cd0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
23ce0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
23cf0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
23d00 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
23d10 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
23d20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
23d30 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23d50 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
23d60 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
23d70 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
23d80 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
23d90 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
23da0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
23db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23dc0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
23de0 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
23df0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
23e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23e10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23e20 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
23e30 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
23e40 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
23e50 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
23e60 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
23e70 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
23e80 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
23e90 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
23ea0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ec0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
23ed0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
23ee0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
23ef0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
23f10 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
23f20 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
23f50 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
23f70 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
23f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
23fc0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
23fd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23fe0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
23ff0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
24000 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
24010 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
24020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
24040 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
24050 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
24060 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
24070 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
24080 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
24090 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
240a0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
240b0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
240c0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
240d0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
240e0 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
240f0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
24100 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
24110 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
24120 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
24130 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
24140 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24150 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
24160 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
24170 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
24180 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
24190 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
241a0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
241b0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
241c0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
241d0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
241e0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
241f0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
24200 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
24210 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
24220 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
24230 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
24240 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
24250 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
24260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
24270 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
24280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
24290 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
242a0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
242b0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
242c0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
242d0 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
242e0 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
242f0 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
24300 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
24310 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
24320 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
24330 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
24340 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
24350 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
24360 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
24370 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
24380 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
24390 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
243a0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
243b0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
243c0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
243d0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
243e0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
243f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
24400 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
24410 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
24420 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31  pExpr, pExpr, -1
24430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24460 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
24470 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
24480 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
24490 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
244a0 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
244b0 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
244c0 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
244d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
244e0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
244f0 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
24500 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
24510 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
24520 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
24530 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
24540 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24550 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
24560 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24570 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
24580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
24590 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
245a0 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
245b0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
245c0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
245d0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
245e0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
245f0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
24600 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
24610 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
24620 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
24630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
24640 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
24650 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
24660 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
24690 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
246a0 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
246b0 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
246c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
246d0 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
246e0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
246f0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
24700 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
24710 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
24720 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
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 70 50 61 72 73  Distinct = pPars
24750 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
24760 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24770 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
24780 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
24790 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
247a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
247b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
247c0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
247d0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
247e0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
247f0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
24800 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24810 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
24820 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
24830 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
24840 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
24850 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
24860 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24870 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
24880 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
24890 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
248a0 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
248b0 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
248c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
248d0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
248e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
248f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
24900 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
24910 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
24920 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
24930 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
24940 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
24950 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
24960 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
24970 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
24980 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72  ARAMETER(pWalker
24990 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
249a0 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
249b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
249c0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
249d0 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
249e0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
249f0 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
24a00 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
24a10 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
24a20 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
24a30 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
24a40 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
24a50 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
24a60 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
24a70 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
24a80 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
24a90 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
24aa0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
24ab0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24ac0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
24ad0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
24ae0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
24af0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
24b00 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
24b10 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
24b20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24b30 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
24b40 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
24b50 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
24b60 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
24b70 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
24b80 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
24b90 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
24ba0 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
24bb0 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
24bc0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
24bd0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
24be0 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  ct;.  w.u.pNC = 
24bf0 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
24c00 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
24c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
24c20 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
24c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
24c40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
24c50 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
24c60 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
24c70 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
24c80 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
24c90 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
24ca0 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
24cb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
24cc0 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
24cd0 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
24ce0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24cf0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
24d00 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
24d10 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
24d20 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
24d30 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
24d40 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
24d50 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
24d60 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
24d70 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
24d80 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
24d90 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
24da0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
24db0 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
24dc0 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
24dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
24de0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
24df0 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
24e00 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
24e10 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
24e20 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
24e30 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
24e40 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
24e50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
24e60 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
24e70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
24e80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
24e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
24ea0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
24eb0 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
24ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
24ed0 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
24ee0 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
24ef0 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
24f00 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
24f10 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  urpose..**.** If
24f20 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63   a register is c
24f30 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75  urrently being u
24f40 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d  sed by the colum
24f50 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a  n cache, then.**
24f60 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f   the deallocatio
24f70 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
24f80 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
24f90 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
24fa0 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
24fb0 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
24fc0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
24fd0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
24fe0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24ff0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
25000 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
25010 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
25020 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
25030 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
25040 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
25050 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
25060 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
25070 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
25080 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
25090 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
250a0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
250b0 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
250c0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
250d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
250e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
250f0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
25100 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
25110 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
25120 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
25130 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
25140 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
25150 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
25160 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
25170 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
25180 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
25190 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
251a0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
251b0 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
251c0 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
251d0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
251e0 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
251f0 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
25200 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
25210 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
25220 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
25230 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
25240 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
25250 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
25260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
25270 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
25280 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
25290 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
252a0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
252b0 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
252c0 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
252d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
252e0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
252f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25300 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
25310 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69  iReg, nReg);.  i
25320 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
25330 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
25340 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
25350 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
25360 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
25370 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
25380 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74  /*.** Mark all t
25390 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
253a0 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76  rs as being unav
253b0 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
253c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
253d0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
253e0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
253f0 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  e){.  pParse->nT
25400 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  empReg = 0;.  pP
25410 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
25420 3d 20 30 3b 0a 7d 0a                             = 0;.}.