/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact d09dac67d53c78880ba31d56e8ba2be3a6490553:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20 54 4b  TK_COLLATE or TK
0be0: 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  _AS operators an
0bf0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0c00: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c10: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c20: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c30: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c40: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c50: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c60: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c70: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c90: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0cb0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cc0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cd0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0ce0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0cf0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0d00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d10: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d20: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d40: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d50: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d70: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0da0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
0dc0: 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  S );.      pExpr
0dd0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0de0: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0df0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0e00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0e10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0e20: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0e30: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0e40: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0e50: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0e60: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0e70: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0e80: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0e90: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0ea0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0eb0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0ec0: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
0ed0: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
0ee0: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
0ef0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0f00: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
0f10: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
0f20: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
0f30: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
0f40: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
0f50: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
0f60: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
0f70: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
0f80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
0f90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0fa0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
0fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0fc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0fd0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0fe0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0ff0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1010: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1020: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1030: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1040: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1050: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1060: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1070: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1080: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1090: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
10a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
10b0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
10c0: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
10d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
10e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1100: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1120: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1130: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1140: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1150: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1160: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1170: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
1180: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
1190: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
11a0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
11b0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
11c0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
11d0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
11e0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
11f0: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1200: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1210: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1220: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1230: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1240: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1250: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1270: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
1280: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
1290: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12b0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
12c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
12f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1300: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1310: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1320: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1330: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1340: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1350: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1360: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1370: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
1380: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
1390: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
13a0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
13b0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
13c0: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
13d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13e0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
13f0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1400: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1410: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1420: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1430: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1440: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1450: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
1460: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
1470: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
1480: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
1490: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
14a0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
14b0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
14c0: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
14d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
14e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
14f0: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1500: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1510: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1530: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1540: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1550: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
1560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1570: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1580: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
1590: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
15a0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
15b0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
15c0: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
15d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1610: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1650: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
1660: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
1670: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
1680: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
1690: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
16b0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
16c0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
16d0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
16e0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
16f0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1700: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1710: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1720: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1730: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1740: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1760: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1770: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1780: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1790: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
17a0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
17b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
17c0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
17d0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
17e0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
17f0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1800: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1810: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1820: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1830: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1840: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1850: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1860: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1870: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1880: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1890: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
18a0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
18b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
18d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1900: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1910: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1920: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1930: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1940: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1950: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1960: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1970: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1990: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
19a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
19b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
19c0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
19d0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
19e0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
19f0: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1a00: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1a10: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1a20: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1a30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1a40: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1a50: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1a60: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1a70: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a80: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1a90: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1aa0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1ab0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1ac0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1ad0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1ae0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1af0: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1b00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1b10: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b20: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1b30: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1b50: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1b60: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1b70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1b80: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1b90: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ba0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1bb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1bc0: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1bd0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1be0: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1bf0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c10: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1c20: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1c30: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c40: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1c50: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1c60: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c80: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1c90: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1ca0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1cb0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1cc0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1cd0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1ce0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
1cf0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
1d00: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  E_AFF_NONE;.  }.
1d10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1d20: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1d30: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70  a comparison exp
1d40: 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27  ression, eg. '='
1d50: 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65  , '<', IN(...) e
1d60: 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e  tc..** idx_affin
1d70: 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e  ity is the affin
1d80: 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ity of an indexe
1d90: 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e  d column. Return
1da0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20   true.** if the 
1db0: 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e  index with affin
1dc0: 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79  ity idx_affinity
1dd0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1de0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70   comparison in p
1e00: 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
1e10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
1e20: 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c  yOk(Expr *pExpr,
1e30: 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69   char idx_affini
1e40: 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ty){.  char aff 
1e50: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
1e60: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73  nity(pExpr);.  s
1e70: 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20  witch( aff ){.  
1e80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1e90: 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65  F_NONE:.      re
1ea0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65  turn 1;.    case
1eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1ec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  :.      return i
1ed0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
1ee0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
1ef0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1f00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f10: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1f20: 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  (idx_affinity);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1f40: 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65  urn the P5 value
1f50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f60: 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  used for a binar
1f70: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  y comparison.** 
1f80: 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f  opcode (OP_Eq, O
1f90: 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20  P_Ge etc.) used 
1fa0: 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72  to compare pExpr
1fb0: 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f  1 and pExpr2..*/
1fc0: 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72  .static u8 binar
1fd0: 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20  yCompareP5(Expr 
1fe0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
1ff0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
2000: 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66  fNull){.  u8 aff
2010: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2020: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2030: 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75  pr2);.  aff = (u
2040: 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  8)sqlite3Compare
2050: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
2060: 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70   aff) | (u8)jump
2070: 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e  IfNull;.  return
2080: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   aff;.}../*.** R
2090: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20a0: 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  to the collation
20b0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73   sequence that s
20c0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79  hould be used by
20d0: 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  .** a binary com
20e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
20f0: 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74   comparing pLeft
2100: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a   and pRight..**.
2110: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  ** If the left h
2120: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68  and expression h
2130: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
2140: 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68  equence type, th
2150: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64  en it is.** used
2160: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
2170: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2180: 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ce for the right
2190: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
21a0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20  .** is used, or 
21b0: 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e  the default (BIN
21c0: 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20  ARY) if neither 
21d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
21e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79   collating.** ty
21f0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  pe..**.** Argume
2200: 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e  nt pRight (but n
2210: 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65  ot pLeft) may be
2220: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
2230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2240: 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  * it is not cons
2250: 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53  idered..*/.CollS
2260: 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72  eq *sqlite3Binar
2270: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  , .  Expr *pLeft
22a0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  , .  Expr *pRigh
22b0: 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  t.){.  CollSeq *
22c0: 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pColl;.  assert(
22d0: 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20   pLeft );.  if( 
22e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
22f0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
2300: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2310: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2320: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  se, pLeft);.  }e
2330: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26  lse if( pRight &
2340: 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  & (pRight->flags
2350: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
2360: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
2370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2380: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2390: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
23a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23b0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23c0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
23d0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
23e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
23f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2400: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2420: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
2430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2440: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
2450: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
2460: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
2470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
2480: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2490: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
24a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
24b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
24c0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
24d0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
24f0: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2500: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2510: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2530: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2540: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2550: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2560: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2570: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2580: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2590: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
25a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
25b0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
25c0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
25d0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
25e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
25f0: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2600: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2610: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2620: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2640: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2650: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2660: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2670: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
26a0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
26b0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26e0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
26f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2700: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2710: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2720: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2730: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
2740: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
2750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2760: 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74  argument nHeight
2770: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2780: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
2790: 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73  ximum.** express
27a0: 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65  ion depth allowe
27b0: 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  d. If it is not,
27c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27d0: 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50  message in.** pP
27e0: 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  arse..*/.int sql
27f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2800: 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ght(Parse *pPars
2810: 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b  e, int nHeight){
2820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48  TE_OK;.  int mxH
2840: 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e  eight = pParse->
2850: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2860: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
2870: 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67  TH];.  if( nHeig
2880: 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20  ht>mxHeight ){. 
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
28b0: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
28c0: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
28d0: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
28e0: 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20  %d)", mxHeight. 
28f0: 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53     );.    rc = S
2900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2920: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
2930: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
2940: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
2950: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
2960: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
2970: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
2980: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
2990: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
29a0: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
29b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
29c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
29d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29e0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
2a10: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
2a20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2a30: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
2a40: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
2a50: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
2a60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
2a70: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
2a80: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
2a90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2aa0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
2ab0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
2ac0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2ae0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
2af0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
2b00: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
2b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2b20: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
2b40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
2b50: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2b60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2b90: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2ba0: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
2bb0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
2bc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2bd0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2be0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
2bf0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2c00: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
2c10: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
2c20: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
2c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c40: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
2c50: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2c60: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
2c70: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2c80: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2c90: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
2ca0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2cb0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
2cc0: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
2cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2ce0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
2cf0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
2d20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
2d40: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
2d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d60: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
2d80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2d90: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
2da0: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
2db0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
2dc0: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
2dd0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
2de0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
2df0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
2e00: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
2e10: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
2e20: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
2e30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2e40: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
2e50: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
2e60: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
2e70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
2e80: 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65  ate EP_Propagate
2e90: 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45   flags up from E
2ea0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45  xpr.x.pList to E
2eb0: 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66  xpr.flags,.** if
2ec0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ee0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2f20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2f30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2f40: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2f50: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2f60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2f70: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2f80: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2f90: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2fa0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ight);.  }else i
2fb0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  f( p->x.pList ){
2fc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2fd0: 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74  rList(p->x.pList
2fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , &nHeight);.   
2ff0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
3000: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
3010: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
3020: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
3030: 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  }.  p->nHeight =
3040: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
3050: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
3060: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
3070: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65  able using the e
3080: 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66  xprSetHeight() f
3090: 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74  unction. If.** t
30a0: 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65  he height is gre
30b0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ater than the ma
30c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78  ximum allowed ex
30d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a  pression depth,.
30e0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
30f0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  r in pParse..**.
3100: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
3110: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
3120: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
3130: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
3140: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
3150: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
3160: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3170: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
3180: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
3190: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
31a0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
31b0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
31c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
31d0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
31e0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
3210: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
3220: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
3230: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
3240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3250: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
3260: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3270: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
3280: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
3290: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
32a0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
32b0: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
32c0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
32d0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f  eight;.}.#else /
32e0: 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74  * ABOVE:  Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61   enforcement ena
3300: 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65  bled.  BELOW: He
3310: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
3320: 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72   off */./*.** Pr
3330: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
3340: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
3350: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
3360: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
3370: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
3380: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
3390: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
33a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
33b0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
33c0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26  && p->x.pList &&
33d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
33e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
33f0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61  t) ){.    p->fla
3400: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3410: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
3420: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
3430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65  List);.  }.}.#de
3440: 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67  fine exprSetHeig
3450: 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ht(y).#endif /* 
3460: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3470: 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  DEPTH>0 */../*.*
3480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3490: 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63  s the core alloc
34a0: 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f  ator for Expr no
34b0: 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  des..**.** Const
34c0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
34d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
34e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34f0: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
3500: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
3510: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b  and for the pTok
3520: 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  en argument is a
3530: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
3540: 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  on.** obtained f
3550: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3560: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
3570: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
3580: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3590: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
35a0: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
35b0: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
35c0: 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  *.** If dequote 
35d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
35e0: 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65  e token (if it e
35f0: 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74  xists) is dequot
3600: 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  ed..** If dequot
3610: 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64  e is false, no d
3620: 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66  equoting is perf
3630: 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65  ormance.  The de
3640: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
3650: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
3660: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
3670: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
3680: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
3690: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
36a0: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
36b0: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
36c0: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
36d0: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
36e0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
36f0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
3700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
3710: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
3720: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
3730: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
3740: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
3750: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
3760: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
3770: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
3780: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
3790: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
37a0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
37b0: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
37c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
37d0: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
37e0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
37f0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
3800: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
3810: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
3820: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
3830: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
3840: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
3850: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
3860: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
3870: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3880: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
3890: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
38a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
38b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
38c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
38d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3900: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
3910: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
3920: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
3930: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
3940: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
3950: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
3960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
3970: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
3980: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
3990: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
39a0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
39b0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
39c0: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
39d0: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
39e0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
39f0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3a00: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3a10: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
3a20: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
3a30: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
3a40: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
3a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
3a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3a80: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a90: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3aa0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  {.    pNew->op =
3ab0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
3ac0: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3ad0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
3ae0: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
3af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3b00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3b10: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
3b20: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
3b30: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3b50: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
3b60: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
3b70: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3b80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3b90: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
3ba0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3bc0: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
3bd0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
3be0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
3bf0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
3c00: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
3c10: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
3c30: 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20  te && nExtra>=3 
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3c50: 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a   ((c = pToken->z
3c60: 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  [0])=='\'' || c=
3c70: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='"' || c=='[' |
3c80: 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20  | c=='`') ){.   
3c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
3ca0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
3cb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
3cc0: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e   if( c=='"' ) pN
3cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3ce0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
3cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d00: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3d10: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d20: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d70: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d80: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3da0: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3db0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3dc0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3df0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3e00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3e10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e60: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e90: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3ea0: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3eb0: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ec0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3ed0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ef0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3f10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3fa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3fb0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fc0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fe0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4000: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
4010: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4020: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4030: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4040: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4070: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4090: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
40a0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
40b0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40d0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40e0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40f0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
4100: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
4110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4120: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4130: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4140: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4150: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4160: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4170: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4180: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4190: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
41a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41b0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41c0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41d0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41e0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41f0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
4200: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
4210: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4220: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4230: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4240: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4250: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4260: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4270: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4280: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4290: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
42a0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
42b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42e0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4300: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4310: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4330: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4340: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4360: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4370: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4380: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4390: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
43a0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
43b0: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43c0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
43d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
4400: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4410: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4420: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4440: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4450: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4470: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4480: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
4490: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20  pToken, 1);.    
44a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
44b0: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
44c0: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
44d0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
44e0: 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c  f( p ) {.    sql
44f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
4500: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
4510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  Height);.  }.  r
4520: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4530: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4540: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4550: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4560: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4570: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4580: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4590: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
45a0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
45b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
45c0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
45d0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
45e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
45f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
4600: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
4610: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
4620: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
4630: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
4640: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4650: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4660: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4670: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4680: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4690: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
46a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
46b0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
46c0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
46d0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
46e0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
46f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
4700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4710: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
4720: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
4730: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
4740: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4750: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4760: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4770: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4780: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4790: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
47b0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
47c0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
47d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
47e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
47f0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
4800: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
4810: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
4820: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
4830: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
4840: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4850: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4860: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4870: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4890: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
48a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
48b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
48c0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
48d0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
48e0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
48f0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4900: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4910: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4930: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4950: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4960: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4970: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4980: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4990: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
49a0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
49b0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
49c0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
49d0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
49e0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
49f0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4a00: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4a40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4a50: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4a70: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4a80: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4a90: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4ab0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4ac0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4ad0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4af0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4b10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4b20: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b40: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4b50: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4b60: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4b70: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4b90: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4ba0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4bb0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4bc0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4bd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4be0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4bf0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4c00: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4c10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4c20: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4c30: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4c40: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4c50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4c60: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4c70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4c80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4c90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4ca0: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4cd0: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4ce0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4cf0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4d00: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4d10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4d30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4d40: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4d50: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4d60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d80: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4d90: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4da0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4db0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4dc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4dd0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4de0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4df0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4e00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4e10: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4e20: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4e30: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4e40: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4e50: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4e60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4e70: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
4e80: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
4e90: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
4ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4eb0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
4ec0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
4ed0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4ee0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4ef0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4f00: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4f10: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4f20: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4f30: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4f40: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4f50: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4f60: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4f70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
4f80: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
4f90: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
4fa0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4fb0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
4fc0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
4fd0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4fe0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4ff0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
5000: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5010: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
5020: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
5030: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
5040: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5050: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5060: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5070: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5080: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5090: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
50a0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
50b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
50c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
50d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50e0: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
50f0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
5100: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
5110: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5130: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
5140: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5150: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5160: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5190: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
51a0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
51b0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
51c0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
51d0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
51e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
51f0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
5200: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
5210: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5220: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
5230: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
5240: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5250: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5260: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5270: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5280: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5290: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
52a0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
52b0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
52c0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
52d0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
52e0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
52f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
5300: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
5310: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
5320: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
5330: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
5340: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5350: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5360: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5370: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5390: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
53a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
53b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53d0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
53e0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
53f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5410: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
5420: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
5430: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
5440: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5450: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5480: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5490: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
54a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
54b0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
54c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
54d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
54e0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
54f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5500: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
5510: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
5520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
5530: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5560: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5570: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5580: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5590: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
55a0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
55b0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
55c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
55d0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
55e0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
55f0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
5600: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
5610: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
5620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5630: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
5640: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5650: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5660: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5670: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5680: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5690: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
56a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
56b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
56c0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
56d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56f0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
5700: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
5710: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
5720: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
5730: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5750: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5760: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5780: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5790: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
57a0: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
57b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
57c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
57d0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
57e0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
57f0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
5800: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
5810: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5820: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5830: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5840: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5850: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5870: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5880: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5890: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
58a0: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
58c0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
58e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
58f0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
5900: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5910: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5920: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5930: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5940: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5950: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5960: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5970: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
59a0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
59b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
59c0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
59d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
59e0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
59f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5a10: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5a30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5a40: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5a50: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5a60: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5a70: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a90: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5aa0: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5ab0: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
5ac0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ad0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
5af0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
5b00: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
5b10: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
5b20: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
5b30: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
5b40: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
5b50: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ht==0 );.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
5b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5b90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
5ba0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5bb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bc0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
5bd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5be0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
5bf0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
5c20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5c30: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
5c40: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
5c50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5c60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5c70: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ca0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5cc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5cf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5d20: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5d40: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5d50: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5d60: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5d70: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5d80: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5d90: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5da0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5dc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5dd0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5de0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5df0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5e20: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5e30: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5e40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5e60: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5e70: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5e90: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5ea0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5eb0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5ec0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5ed0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5ee0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5ef0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5f00: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5f10: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5f20: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5f30: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5f40: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5f50: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5f60: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5f70: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5f80: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5f90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5fa0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5fb0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5fc0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5fd0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
6030: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6040: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
6050: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
6060: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
6070: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
6080: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
6090: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
60a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
60b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
60c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
60d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
60e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
60f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
6100: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
6110: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
6120: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
6130: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
6140: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
6150: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
6160: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
6170: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6180: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
61a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
61b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
61c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
61d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
61e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
61f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
6200: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
6210: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
6220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
6230: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
6240: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
6250: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
6260: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
6270: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
6280: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
6290: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
62a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
62b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
62c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
62d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
62e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
62f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
6300: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
6310: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
6320: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
6330: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
6340: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
6350: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
6360: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
6370: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
6380: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
63a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
63b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
63c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
63d0: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
63e0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
63f0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
6400: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
6410: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
6420: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
6430: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
6440: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
6450: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
6460: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
6470: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
6480: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
6490: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
64a0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
64b0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
64c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
64d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
64e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
64f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6500: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
6510: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
6520: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6530: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
6540: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
6550: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
6560: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
6570: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
6580: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
6590: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
65a0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
65b0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
65c0: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
65d0: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
65e0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
65f0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
6600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
6610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6620: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
6630: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
6640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6650: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6660: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
6670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6690: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
66b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66c0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
66d0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
66e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
66f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6730: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
6740: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
6750: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
6760: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
6770: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
6790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
67a0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
67b0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
67c0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
67d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
67e0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
67f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
6800: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
6810: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
6820: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
6830: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6850: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6860: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6870: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6880: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6890: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
68a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
68b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
68c0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
68d0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
68e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
6910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
6920: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
6930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6940: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6950: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
6960: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
6970: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
6980: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
6990: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
69a0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
69b0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
69c0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
69d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
69f0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
6a00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
6a10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
6a20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
6a30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
6a40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
6a50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
6a60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
6a70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
6a80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
6a90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
6aa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
6ab0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
6ac0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
6ad0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
6ae0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
6af0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
6b00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
6b10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
6b20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
6b30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
6b40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
6b50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
6b60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
6b70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
6b80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
6b90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
6ba0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6bb0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6bc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
6bd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
6be0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6bf0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6c00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
6c10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
6c20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
6c30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
6c40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
6c50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
6c60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
6c70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
6c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6ca0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
6cb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
6cc0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
6cd0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
6ce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
6cf0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
6d00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
6d20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
6d30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
6d40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
6d50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
6d60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
6d70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
6d80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
6d90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
6da0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
6db0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
6dc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
6dd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
6de0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6df0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
6e00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
6e10: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
6e20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
6e40: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
6e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
6e60: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
6e70: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
6e80: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
6eb0: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
6ec0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
6ed0: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
6ee0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6ef0: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
6f00: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
6f10: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
6f20: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
6f30: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
6f40: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
6f50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
6f60: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
6f70: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
6f80: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
6f90: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
6fa0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
6fb0: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
6fc0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6fe0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
6ff0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
7000: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7010: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
7020: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
7030: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
7040: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7050: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
7060: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
7070: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
7080: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
7090: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
70a0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
70b0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
70c0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
70d0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
70e0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
70f0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
7100: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7110: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
7120: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
7130: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
7140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
7150: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
7160: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
7170: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
7180: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
7190: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
71b0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
71c0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
71d0: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
71e0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
71f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7200: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
7210: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
7220: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
7230: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7240: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7250: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
7270: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
7280: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
7290: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
72a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
72b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
72c0: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
72d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
72e0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
72f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
7310: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
7320: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7330: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
7340: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
7350: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7360: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7370: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7380: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7390: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
73a0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
73b0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
73c0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
73d0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
73e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
73f0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7400: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
7410: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
7420: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
7430: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
7440: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
7450: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
7460: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7470: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7480: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7490: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
74a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
74b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
74c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
74d0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
74e0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
74f0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7500: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
7510: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
7520: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
7530: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
7540: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
7550: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
7560: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7580: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7590: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
75a0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
75b0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
75c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
75d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
75e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
75f0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7600: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7610: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7620: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
7630: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
7640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7650: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
7660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7670: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7680: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76a0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
76b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
76c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
76d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
76e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
76f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7710: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7720: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7730: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
7740: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7750: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7760: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7780: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7790: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
77a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
77b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
77c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
77d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
77e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
77f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7810: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7860: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7870: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7890: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
78d0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7920: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7930: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7940: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7950: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7960: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7970: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7980: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7990: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
79a0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
79b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
79c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79d0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7a00: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7a10: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7a20: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7a30: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7a40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7a50: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7a60: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7a70: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7a80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7a90: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7aa0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7ab0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7ac0: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7ad0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7af0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7b00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7b10: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7b20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7b30: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7b50: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7b80: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7b90: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7ba0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7bb0: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7bc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7be0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7bf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7c00: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7c10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7c20: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7c30: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7c40: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7c50: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7c60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7c70: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7c90: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7ca0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7cb0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7cc0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7cd0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7ce0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7cf0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7d00: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7d10: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7d20: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7d30: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7d40: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7d50: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7d60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7d70: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
7d80: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
7d90: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
7da0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
7db0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
7dc0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
7dd0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
7de0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
7df0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
7e00: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
7e10: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
7e20: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
7e30: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
7e40: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
7e50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
7e60: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
7e70: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
7e80: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
7e90: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
7ea0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
7eb0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
7ec0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
7ed0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
7ee0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
7ef0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
7f00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
7f10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
7f20: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7f30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
7f40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7f50: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
7f60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
7f70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
7f80: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
7f90: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
7fa0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7fb0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
7fc0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
7fd0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7fe0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
7ff0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8000: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8010: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
8020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8050: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8060: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8090: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
80a0: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
80b0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
80c0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
80d0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
80e0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
80f0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8120: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8130: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8150: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8160: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8170: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8190: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
81a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
81b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
81c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
81d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
81e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
81f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8200: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8210: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8240: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8250: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8270: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8280: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8290: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
82a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
82b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
82d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
82e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
82f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8300: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8330: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8340: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8350: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8360: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8370: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8390: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
83a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
83b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
83c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
83d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
83e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
83f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8400: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8410: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8420: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8430: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8440: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8450: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8470: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
84a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
84b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
84c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
84d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
84e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
84f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8500: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
8510: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
8520: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
8530: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
8540: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8550: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
8560: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8580: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8590: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
85a0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
85b0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
85c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
85d0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
85e0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
85f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8600: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8610: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8640: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8650: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8660: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8670: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8690: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
86a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
86b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
86c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
86e0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
86f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8700: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8710: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8720: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
8730: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
8740: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
8750: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8760: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8770: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8780: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8790: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
87a0: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
87b0: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
87c0: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
87d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
87e0: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
87f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
8800: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
8810: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
8820: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
8830: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
8840: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
8850: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8860: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8870: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8880: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8890: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
88a0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
88b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
88c0: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
88d0: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
88e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
88f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
8900: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
8910: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8920: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8930: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8940: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8950: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8970: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8980: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8990: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
89a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
89b0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
89c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
89d0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
89e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
89f0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8a00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8a10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8a20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8a30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8a40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8a50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8a60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8a70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8a80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8a90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8aa0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8ab0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8ac0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8ae0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8af0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
8b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b10: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
8b20: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
8b30: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8b40: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
8b50: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8b60: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8b90: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8ba0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8bb0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8bc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8bd0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8be0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8bf0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
8c00: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
8c10: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
8c20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
8c30: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
8c40: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
8c50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8c60: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8c70: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8c80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8c90: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8ca0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8cb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8cc0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8cd0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8cf0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8d00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8d10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
8d20: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
8d30: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8d50: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8d60: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8d70: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8d80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8d90: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8da0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8dc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8dd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8de0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8df0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8e00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
8e10: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
8e20: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8e30: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
8e40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
8e50: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8e60: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8e70: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8e80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8e90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ea0: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8eb0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8ec0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8ed0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8ee0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8ef0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
8f00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8f10: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
8f20: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8f30: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
8f40: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8f50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8f60: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8f70: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8f80: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8f90: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8fa0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8fb0: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8fc0: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8fd0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8fe0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8ff0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
9000: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
9010: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
9020: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
9030: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
9040: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9050: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
9060: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
9070: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
9080: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
9090: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
90a0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
90b0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
90c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
90d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
90e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
90f0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
9100: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
9110: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
9120: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d  .  pNew->pWith =
9130: 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e   withDup(db, p->
9140: 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  pWith);.  sqlite
9150: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
9160: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
9180: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
9190: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
91a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
91b0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
91c0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
91d0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
91e0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
91f0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9200: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9210: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9220: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9230: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
9240: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
9250: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
9260: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9270: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9280: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9290: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
92a0: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
92b0: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
92c0: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
92d0: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
92e0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
92f0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
9300: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
9310: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
9320: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
9330: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
9340: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
9350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9380: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
93a0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
93b0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
93c0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
93d0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
93e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
93f0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
9400: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
9410: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9420: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9430: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9440: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9450: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9460: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
9470: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
9480: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9490: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
94a0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
94b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
94c0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
94d0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
94e0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
94f0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
9500: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
9510: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
9520: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
9530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9540: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9550: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
9560: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
9570: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
9580: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
9590: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
95a0: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
95b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
95c0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
95d0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
95f0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
9600: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
9610: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
9620: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9630: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9640: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9650: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
9660: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
9670: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
9680: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
9690: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
96a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
96b0: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
96c0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
96d0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
96e0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
9700: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
9710: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
9720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9730: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9740: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
9750: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9760: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
9770: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9780: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9790: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
97a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
97b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
97c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
97d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
97e0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
97f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
9800: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9810: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
9820: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9830: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9840: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9860: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
9870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9880: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9890: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
98a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
98b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
98c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
98d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
98e0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
98f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
9900: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
9910: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
9920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9930: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
9940: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
9950: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9960: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
9970: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9980: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
9990: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
99a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
99b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
99c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
99d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
99e0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
99f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9a00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
9a10: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
9a20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
9a30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9a40: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
9a50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9a60: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
9a70: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
9a80: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
9a90: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
9aa0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
9ab0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9ac0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
9ad0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9ae0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9af0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9b00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9b10: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
9b20: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
9b30: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
9b40: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
9b50: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
9b60: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
9b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9b80: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ba0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9bc0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
9bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9bf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9c00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9c10: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9c20: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9c30: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9c40: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
9c50: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
9c60: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
9c70: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
9c80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9c90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
9ca0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
9cb0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
9cc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
9cd0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
9cf0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
9d00: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
9d10: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9d20: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
9d30: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
9d40: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
9d50: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
9d60: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
9d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d80: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
9d90: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
9da0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9db0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
9dc0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
9e00: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
9e10: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
9e20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9e30: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
9e40: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
9e50: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
9e60: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
9e70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9e80: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
9e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ea0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
9eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
9ec0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9ed0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9ee0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
9ef0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
9f00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9f10: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
9f20: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
9f30: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9f40: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
9f50: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
9f60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
9f70: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
9f80: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
9f90: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
9fa0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9fb0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
9fc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
9fd0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
9fe0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
9ff0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
a000: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
a010: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
a020: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
a030: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
a040: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
a050: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a060: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
a070: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
a080: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
a090: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
a0a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
a0b0: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
a0c0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
a0d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
a0e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
a0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a100: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
a110: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
a120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
a140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a150: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
a160: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
a170: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
a180: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
a190: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
a1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a1b0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
a1c0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
a1d0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
a1e0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
a1f0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
a200: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
a210: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
a220: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
a230: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
a240: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
a250: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
a260: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a270: 20 20 20 20 20 6d 20 7c 3d 20 70 4c 69 73 74 2d       m |= pList-
a280: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61  >a[i].pExpr->fla
a290: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
a2a0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
a2b0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
a2c0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
a2d0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
a2e0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
a2f0: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
a300: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
a310: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
a320: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
a330: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
a340: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
a350: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
a360: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
a370: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
a380: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
a390: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
a3a0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
a3b0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
a3c0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
a3d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
a3e0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
a400: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
a410: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
a420: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
a430: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
a440: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
a450: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
a460: 78 70 72 52 65 66 4f 6e 65 54 61 62 6c 65 4f 6e  xprRefOneTableOn
a470: 6c 79 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ly()            
a480: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a490: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
a4a0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a4b0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
a4c0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a4d0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
a4e0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
a4f0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
a500: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
a510: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
a520: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
a530: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
a540: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
a550: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
a560: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a570: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
a580: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
a590: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
a5a0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
a5b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
a5c0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
a5d0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
a5e0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
a5f0: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
a600: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
a610: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
a620: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
a630: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
a640: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
a650: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
a660: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
a670: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
a680: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
a690: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
a6a0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
a6b0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
a6c0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
a6d0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
a6e0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
a6f0: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
a700: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
a710: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
a720: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
a730: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
a740: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
a750: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
a760: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
a770: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
a780: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
a790: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
a7a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
a7b0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
a7c0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
a7d0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
a7e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
a7f0: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
a800: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
a810: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
a820: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
a830: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
a840: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
a850: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
a860: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
a870: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a880: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
a890: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a8a0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
a8b0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
a8c0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
a8d0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
a8e0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a8f0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
a900: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
a910: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
a920: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
a930: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
a940: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
a950: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
a960: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
a970: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
a980: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
a990: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
a9a0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
a9b0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
a9c0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
a9d0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
a9e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a9f0: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
aa00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
aa10: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aa20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
aa40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
aa50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
aa60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
aa70: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
aa80: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
aa90: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
aaa0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
aab0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
aac0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aad0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
aae0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
aaf0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ab00: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
ab10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ab20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
ab30: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
ab40: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ab50: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ab60: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
ab70: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ab80: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
ab90: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
aba0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
abb0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
abc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
abd0: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
abe0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
abf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ac00: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
ac10: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
ac20: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
ac30: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ac40: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ac50: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
ac60: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
ac70: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
ac80: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
ac90: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
aca0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
acb0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
acc0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
acd0: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
ace0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
acf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ad00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
ad10: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
ad20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ad30: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ad40: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
ad50: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ad60: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
ad70: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
ad80: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
ad90: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
ada0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
adb0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
adc0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
add0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
ade0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
adf0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
ae00: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
ae10: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
ae20: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
ae30: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ae40: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
ae50: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
ae60: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
ae70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
ae80: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ae90: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
aea0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
aeb0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
aec0: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
aed0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aee0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
aef0: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
af00: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
af10: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
af20: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
af30: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
af40: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
af50: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
af60: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
af70: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
af80: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
af90: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
afa0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
afb0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
afc0: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
afd0: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
afe0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
aff0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
b000: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
b010: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b020: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
b030: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
b040: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
b050: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
b060: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
b070: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
b080: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b090: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b0a0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b0b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b0c0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b0d0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
b0e0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
b0f0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
b100: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b110: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b120: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b130: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b140: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b150: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b160: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b170: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b180: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b190: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b1a0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b1b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
b1c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
b1d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b1e0: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
b1f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b200: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b210: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b230: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
b240: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
b250: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
b260: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
b270: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
b280: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
b290: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
b2a0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
b2b0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
b2c0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
b2d0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
b2e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
b2f0: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
b300: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
b310: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
b320: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
b330: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b340: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b350: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b360: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
b370: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
b380: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
b390: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
b3a0: 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
b3b0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
b3c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
b3d0: 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
b3e0: 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
b3f0: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
b400: 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
b410: 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
b420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b430: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
b440: 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
b450: 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
b460: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
b470: 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iCur);.}../*.*
b480: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b490: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b4a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b4c0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
b4d0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
b4e0: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
b4f0: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
b500: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
b510: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
b520: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
b530: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
b540: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
b550: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
b560: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
b570: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
b580: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
b590: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
b5a0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
b5b0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
b5c0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
b5d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
b5e0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
b5f0: 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74  pr *p, u8 isInit
b600: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49  ){.  assert( isI
b610: 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74  nit==0 || isInit
b620: 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
b630: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34  exprIsConst(p, 4
b640: 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a  +isInit, 0);.}..
b650: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
b660: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
b670: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
b680: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
b690: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
b6a0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
b6b0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
b6c0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
b6d0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
b6e0: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
b6f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b700: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
b710: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
b720: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
b730: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
b740: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
b750: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
b760: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
b770: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
b780: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b790: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
b7a0: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
b7b0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
b7c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
b7d0: 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
b7e0: 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
b7f0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
b800: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
b810: 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
b820: 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
b830: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
b840: 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
b850: 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
b860: 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
b870: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
b880: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
b890: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
b8a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
b8b0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
b8c0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
b8d0: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
b8e0: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
b8f0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
b900: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
b910: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b920: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
b930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
b940: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
b950: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
b960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b970: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
b980: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
b990: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
b9a0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
b9b0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
b9c0: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
b9d0: 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
b9e0: 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
b9f0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
ba00: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
ba10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ba30: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
ba40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ba50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ba60: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
ba70: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
ba80: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
ba90: 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
baa0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
bab0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
bac0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
bad0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
bae0: 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
baf0: 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
bb00: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
bb10: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
bb20: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
bb30: 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
bb40: 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
bb50: 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
bb60: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
bb70: 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
bb80: 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
bb90: 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
bba0: 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
bbb0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
bbc0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
bbd0: 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
bbe0: 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
bbf0: 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
bc00: 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
bc10: 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
bc20: 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
bc30: 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
bc40: 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
bc50: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
bc60: 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
bc70: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
bc80: 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
bc90: 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
bca0: 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
bcb0: 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
bcc0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
bcd0: 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
bce0: 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
bcf0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
bd00: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
bd10: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
bd20: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
bd30: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
bd40: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
bd50: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
bd60: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
bd70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bd80: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
bd90: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
bda0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
bdb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
bdc0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
bdd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
bde0: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  LUMN:.      asse
bdf0: 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29  rt( p->pTab!=0 )
be00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  ;.      return E
be10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
be20: 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
be30: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
be40: 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  (p->iColumn>=0 &
be50: 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  & p->pTab->aCol[
be60: 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  p->iColumn].notN
be70: 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66  ull==0);.    def
be80: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
be90: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
bea0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
beb0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
bec0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73  ession is a cons
bed0: 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64  tant which would
bee0: 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   be.** unchanged
bef0: 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   by OP_Affinity 
bf00: 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74  with the affinit
bf10: 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  y given in the s
bf20: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
bf30: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
bf40: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
bf50: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
bf60: 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
bf70: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
bf80: 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e  e omitted.  When
bf90: 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e   in doubt return
bfa0: 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65   FALSE.  A false
bfb0: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20   negative.** is 
bfc0: 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c  harmless.  A fal
bfd0: 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77  se positive, how
bfe0: 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74  ever, can result
bff0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a   in the wrong.**
c000: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
c010: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
c020: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
c030: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20  (const Expr *p, 
c040: 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20  char aff){.  u8 
c050: 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53  op;.  if( aff==S
c060: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
c070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
c080: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
c090: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
c0a0: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
c0b0: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
c0c0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
c0d0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
c0e0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
c0f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
c100: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
c110: 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
c120: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
c130: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
c140: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
c150: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
c160: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
c170: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
c180: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
c190: 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  AL || aff==SQLIT
c1a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
c1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c1c0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
c1d0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
c1e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
c1f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c200: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
c210: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
c220: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
c230: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
c240: 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29  ( p->iTable>=0 )
c250: 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62  ;  /* p cannot b
c260: 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43  e part of a CHEC
c270: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  K constraint */.
c280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
c290: 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20  iColumn<0.      
c2a0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
c2b0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c2c0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
c2d0: 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20  FF_NUMERIC);.   
c2e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
c2f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
c320: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
c330: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
c340: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
c350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
c360: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
c370: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
c380: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
c390: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
c3a0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
c3b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
c3c0: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
c3d0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
c3e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
c3f0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
c400: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
c410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c420: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
c430: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
c440: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
c450: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
c460: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
c470: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
c480: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
c490: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
c4a0: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
c4b0: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
c4c0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
c4d0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
c4e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
c4f0: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
c500: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
c510: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
c520: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
c530: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
c540: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
c550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c560: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
c570: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c580: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
c590: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
c5a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c5b0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
c5c0: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
c5d0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
c5f0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
c600: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
c610: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
c620: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
c630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
c640: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
c650: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
c660: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
c670: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
c680: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
c690: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
c6a0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
c6b0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
c6c0: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
c6d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c6e0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
c6f0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
c700: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
c710: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
c720: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
c730: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
c740: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
c750: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
c760: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
c770: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
c780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
c790: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
c7a0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
c7b0: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
c7c0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
c7d0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
c7e0: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
c7f0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
c800: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
c810: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
c820: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
c830: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
c840: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c860: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
c870: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
c880: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
c890: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
c8a0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
c8b0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
c8c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
c8d0: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
c8e0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
c8f0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
c900: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
c910: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
c920: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
c930: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
c940: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
c950: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
c960: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
c970: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
c980: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
c990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
c9a0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
c9b0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
c9c0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
c9d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c9e0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
c9f0: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
ca00: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
ca10: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
ca20: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
ca30: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
ca40: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
ca50: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ca60: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
ca70: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ca80: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
ca90: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
caa0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
cab0: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
cac0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
cad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cae0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UERY */../*.** C
caf0: 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69  ode an OP_Once i
cb00: 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61  nstruction and a
cb10: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
cb20: 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75  r its flag. Retu
cb30: 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65  rn the .** addre
cb40: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
cb50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  struction..*/.in
cb60: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  t sqlite3CodeOnc
cb70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
cb80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
cb90: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cba0: 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69  rse);      /* Vi
cbb0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
cbc0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72  ing coded */.  r
cbd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
cbe0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
cbf0: 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  ce, pParse->nOnc
cc00: 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  e++);.}../*.** G
cc10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cc20: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
cc30: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
cc40: 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
cc50: 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
cc60: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
cc70: 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
cc80: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
cc90: 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
cca0: 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
ccb0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
ccc0: 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
ccd0: 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
cce0: 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
ccf0: 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
cd00: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
cd10: 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
cd20: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
cd30: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
cd40: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
cd50: 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
cd60: 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
cd70: 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
cd80: 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74 65  int j1;.  sqlite
cd90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cda0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
cdb0: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20  gHasNull);.  j1 
cdc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cdd0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
cde0: 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
cdf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
ce00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ce10: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
ce20: 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
ce30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
ce40: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
ce50: 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
ce60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ce70: 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
ce80: 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
ce90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cea0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a  ere(v, j1);.}...
ceb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cec0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
ced0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
cee0: 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
cef0: 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
cf00: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
cf10: 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
cf20: 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
cf30: 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
cf40: 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
cf50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cf60: 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
cf70: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
cf80: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
cf90: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
cfa0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
cfb0: 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
cfc0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
cfd0: 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
cfe0: 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
cff0: 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
d000: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d010: 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
d020: 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
d030: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
d040: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
d050: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
d060: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
d070: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
d080: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
d090: 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
d0a0: 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
d0b0: 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
d0c0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d0d0: 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
d0e0: 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
d0f0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d100: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
d110: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
d120: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
d130: 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
d140: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
d150: 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
d160: 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
d170: 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
d180: 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
d190: 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
d1a0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
d1b0: 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
d1c0: 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
d1d0: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
d1e0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
d1f0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
d200: 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
d210: 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
d220: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d230: 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
d240: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
d250: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
d260: 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
d270: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
d280: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
d290: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
d2a0: 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
d2b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d2c0: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
d2d0: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
d2e0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d2f0: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
d300: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
d310: 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
d320: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d330: 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
d340: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
d350: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
d360: 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
d370: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d380: 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
d390: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
d3a0: 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
d3b0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d3c0: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
d3d0: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
d3e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d3f0: 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
d400: 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
d410: 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
d420: 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
d430: 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
d440: 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
d450: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
d460: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
d480: 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
d490: 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
d4a0: 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
d4b0: 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
d4c0: 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
d4d0: 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
d4e0: 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
d4f0: 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
d500: 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
d510: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
d520: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  > FROM <table>.*
d530: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
d540: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d550: 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
d560: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
d570: 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
d580: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
d590: 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
d5a0: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
d5b0: 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
d5c0: 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
d5d0: 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
d5e0: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
d5f0: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
d600: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
d610: 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
d620: 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
d630: 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
d640: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  n exactly one of
d650: 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
d660: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
d670: 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
d680: 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  P.  If inFlags c
d690: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
d6a0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
d6b0: 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
d6c0: 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
d6d0: 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66   used for a.** f
d6e0: 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  ast membership t
d6f0: 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
d700: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
d710: 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20   is set, the.** 
d720: 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  IN index will be
d730: 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
d740: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
d750: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
d760: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ** IN operator..
d770: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
d780: 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
d790: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
d7a0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
d7b0: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
d7c0: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
d7d0: 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
d7e0: 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
d7f0: 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
d800: 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
d810: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
d820: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
d830: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
d840: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
d850: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
d860: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
d870: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
d880: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
d890: 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49   it.** has a UNI
d8a0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
d8b0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  r UNIQUE index..
d8c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
d8d0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
d8e0: 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
d8f0: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
d900: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
d910: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
d920: 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
d930: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
d940: 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
d950: 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20  unless <column> 
d960: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
d970: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20  IMARY KEY or an 
d980: 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65  index can .** be
d990: 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c   found with <col
d9a0: 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74  umn> as its left
d9b0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  -most column..**
d9c0: 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
d9d0: 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
d9e0: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
d9f0: 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
da00: 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
da10: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
da20: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
da30: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
da40: 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
da50: 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
da60: 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
da70: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
da80: 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
da90: 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
daa0: 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
dab0: 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
dac0: 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
dad0: 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
dae0: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
daf0: 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
db00: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
db10: 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
db20: 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
db30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
db40: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
db50: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
db60: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
db70: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
db80: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
db90: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
dba0: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
dbb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
dbc0: 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
dbd0: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
dbe0: 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
dbf0: 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
dc00: 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
dc10: 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
dc20: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
dc30: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
dc40: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
dc50: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
dc60: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
dc70: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
dc80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
dc90: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
dca0: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
dcb0: 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
dcc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
dcd0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
dce0: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
dcf0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
dd00: 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
dd10: 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
dd20: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
dd30: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
dd40: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
dd50: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
dd60: 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
dd70: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
dd80: 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
dd90: 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
dda0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
ddb0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
ddc0: 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
ddd0: 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
dde0: 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
ddf0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
de00: 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
de10: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
de20: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
de30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
de40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
de50: 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  InIndex(Parse *p
de60: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c  Parse, Expr *pX,
de70: 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e   u32 inFlags, in
de80: 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  t *prRhsHasNull)
de90: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
dec0: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
ded0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
dee0: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
def0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
df00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
df10: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
df20: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
df30: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
df40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
df50: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
df60: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
df70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
df80: 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dfa0: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
dfb0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
dfc0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
dfd0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
dfe0: 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
dff0: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
e000: 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
e010: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
e020: 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
e030: 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
e040: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
e050: 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  0;..  /* Check t
e060: 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
e070: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
e080: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
e090: 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
e0a0: 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
e0b0: 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
e0c0: 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
e0d0: 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
e0e0: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
e0f0: 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f   p = (ExprHasPro
e100: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
e110: 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e  Select) ? pX->x.
e120: 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20  pSelect : 0);.  
e130: 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73  if( ALWAYS(pPars
e140: 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69  e->nErr==0) && i
e150: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e160: 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c  pt(p) ){.    sql
e170: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e180: 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  e->db;          
e190: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e1a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
e1b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
e1e0: 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  e <table>. */.  
e1f0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
e220: 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20  ession <column> 
e230: 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b  */.    i16 iCol;
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e260: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
e270: 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20   <column> */.   
e280: 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20   i16 iDb;       
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e2b0: 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62  ase idx for pTab
e2c0: 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
e2d0: 20 70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20   p );           
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2f0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e300: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e310: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
e320: 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b   p->pEList!=0 );
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e340: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e350: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e360: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
e370: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
e380: 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20  .pExpr!=0 ); /* 
e390: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e3a0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e3b0: 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  ) */.    assert(
e3c0: 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20   p->pSrc!=0 );  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e3e0: 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e  Because of isCan
e3f0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e400: 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20  ) */.    pTab = 
e410: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
e420: 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  ab;.    pExpr = 
e430: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
e440: 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20  pExpr;.    iCol 
e450: 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69 43  = (i16)pExpr->iC
e460: 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f  olumn;.   .    /
e470: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61  * Code an OP_Tra
e480: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f  nsaction and OP_
e490: 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74  TableLock for <t
e4a0: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44  able>. */.    iD
e4b0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
e4c0: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
e4d0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
e4e0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
e4f0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
e500: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
e510: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72  e3TableLock(pPar
e520: 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74  se, iDb, pTab->t
e530: 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e  num, 0, pTab->zN
e540: 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ame);..    /* Th
e550: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
e560: 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
e570: 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62  two places. In b
e580: 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64  oth cases the vd
e590: 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c  be.    ** has al
e5a0: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
e5b0: 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20  ated. So assume 
e5c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29  sqlite3GetVdbe()
e5d0: 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a   is always.    *
e5e0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72  * successful her
e5f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
e600: 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28  sert(v);.    if(
e610: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
e620: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
e630: 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
e640: 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  rse);.      Vdbe
e650: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
e660: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54      sqlite3OpenT
e670: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
e680: 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
e690: 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20  _OpenRead);.    
e6a0: 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44    eType = IN_IND
e6b0: 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20  EX_ROWID;..     
e6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e6d0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
e6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
e720: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20  r variable */.. 
e730: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c       /* The coll
e740: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
e750: 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61  sed by the compa
e760: 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64  rison. If an ind
e770: 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a  ex is to.      *
e780: 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61  * be used in pla
e790: 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62  ce of a temp-tab
e7a0: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f  le, it must be o
e7b0: 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67  rdered according
e7c0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  .      ** to thi
e7d0: 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
e7e0: 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ence.  */.      
e7f0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20  CollSeq *pReq = 
e800: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
e810: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
e820: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
e830: 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Expr);..      /*
e840: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
e850: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69  affinity that wi
e860: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65  ll be used to pe
e870: 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20  rform the .     
e880: 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   ** comparison i
e890: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
e8a0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
e8b0: 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20  e column. If.   
e8c0: 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c     ** it is not,
e8d0: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
e8e0: 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69  ble to use any i
e8f0: 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndex..      */. 
e900: 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74       int affinit
e910: 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e  y_ok = sqlite3In
e920: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
e930: 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  , pTab->aCol[iCo
e940: 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20  l].affinity);.. 
e950: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
e960: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e970: 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20   && eType==0 && 
e980: 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64  affinity_ok; pId
e990: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
e9a0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64          if( (pId
e9b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
e9c0: 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26  iCol).         &
e9d0: 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  & sqlite3FindCol
e9e0: 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
e9f0: 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30  , pIdx->azColl[0
ea00: 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20  ], 0)==pReq.    
ea10: 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65       && (!mustBe
ea20: 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d  Unique || (pIdx-
ea30: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49  >nKeyCol==1 && I
ea40: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
ea50: 78 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  x))).        ){.
ea60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41            int iA
ea70: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
ea80: 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56  eOnce(pParse); V
ea90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
eaa0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eab0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
eac0: 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62  P_OpenRead, iTab
ead0: 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
eae0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
eaf0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
eb00: 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yInfo(pParse, pI
eb10: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  dx);.          V
eb20: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
eb30: 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  %s", pIdx->zName
eb40: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
eb50: 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49  sert( IN_INDEX_I
eb60: 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f  NDEX_DESC == IN_
eb70: 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b  INDEX_INDEX_ASC+
eb80: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  1 );.          e
eb90: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
eba0: 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78  INDEX_ASC + pIdx
ebb0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b  ->aSortOrder[0];
ebc0: 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
ebd0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20  prRhsHasNull && 
ebe0: 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  !pTab->aCol[iCol
ebf0: 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20  ].notNull ){.   
ec00: 20 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48           *prRhsH
ec10: 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  asNull = ++pPars
ec20: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20  e->nMem;.       
ec30: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48       sqlite3SetH
ec40: 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54  asNullFlag(v, iT
ec50: 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  ab, *prRhsHasNul
ec60: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
ec70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec80: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
ec90: 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20   iAddr);.       
eca0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ecb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
ecc0: 20 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64   preexisting ind
ecd0: 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ex is available 
ece0: 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73  for the IN claus
ecf0: 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e  e.  ** and IN_IN
ed00: 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61  DEX_NOOP is an a
ed10: 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a  llowed reply.  *
ed20: 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66  * and the RHS of
ed30: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ed40: 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20   is a list, not 
ed50: 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  a subquery.  ** 
ed60: 61 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e  and the RHS is n
ed70: 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20 68 61  ot contant or ha
ed80: 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74  s two or fewer t
ed90: 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  erms,.  ** then 
eda0: 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20  it is not worth 
edb0: 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65  creating an ephe
edc0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65  meral table to e
edd0: 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65  valuate.  ** the
ede0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20   IN operator so 
edf0: 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
ee00: 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  NOOP..  */.  if(
ee10: 20 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20   eType==0.   && 
ee20: 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e  (inFlags & IN_IN
ee30: 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20  DEX_NOOP_OK).   
ee40: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
ee50: 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65  rty(pX, EP_xIsSe
ee60: 6c 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71  lect).   && (!sq
ee70: 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
ee80: 74 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e  tant(pX) || pX->
ee90: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  x.pList->nExpr<=
eea0: 32 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70  2).  ){.    eTyp
eeb0: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  e = IN_INDEX_NOO
eec0: 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a 20 20  P;.  }.     ..  
eed0: 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
eee0: 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
eef0: 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e   find an existin
ef00: 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  g table or index
ef10: 20 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52   to use as the R
ef20: 48 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a  HS b-tree..    *
ef30: 2a 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74  * We will have t
ef40: 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70  o generate an ep
ef50: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f  hemeral table to
ef60: 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20   do the job..   
ef70: 20 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65   */.    u32 save
ef80: 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
ef90: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
efa0: 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61  ;.    int rMayHa
efb0: 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  veNull = 0;.    
efc0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
efd0: 5f 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e  _EPH;.    if( in
efe0: 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58  Flags & IN_INDEX
eff0: 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70  _LOOP ){.      p
f000: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
f010: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
f020: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
f030: 75 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61  umn<0 && !ExprHa
f040: 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50  sProperty(pX, EP
f050: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
f060: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
f070: 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20  N_INDEX_ROWID;. 
f080: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f090: 20 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c   if( prRhsHasNul
f0a0: 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68  l ){.      *prRh
f0b0: 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48  sHasNull = rMayH
f0c0: 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72  aveNull = ++pPar
f0d0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a  se->nMem;.    }.
f0e0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
f0f0: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
f100: 20 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c   pX, rMayHaveNul
f110: 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  l, eType==IN_IND
f120: 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70  EX_ROWID);.    p
f130: 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
f140: 70 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c  p = savedNQueryL
f150: 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oop;.  }else{.  
f160: 20 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69    pX->iTable = i
f170: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
f180: 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69  n eType;.}.#endi
f190: 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
f1a0: 65 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61  e code for scala
f1b0: 72 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  r subqueries use
f1c0: 64 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20  d as a subquery 
f1d0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53  expression, EXIS
f1e0: 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65  TS,.** or IN ope
f1f0: 72 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65  rators.  Example
f200: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45  s:.**.**     (SE
f210: 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20  LECT a FROM b)  
f220: 20 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75          -- subqu
f230: 65 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54  ery.**     EXIST
f240: 53 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  S (SELECT a FROM
f250: 20 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20   b)   -- EXISTS 
f260: 73 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20  subquery.**     
f270: 78 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20  x IN (4,5,11)   
f280: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e             -- IN
f290: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c   operator with l
f2a0: 69 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e  ist on right-han
f2b0: 64 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20  d side.**     x 
f2c0: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
f2d0: 4d 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f  M b)     -- IN o
f2e0: 70 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62  perator with sub
f2f0: 71 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67  query on the rig
f300: 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78  ht.**.** The pEx
f310: 70 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73  pr parameter des
f320: 63 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65  cribes the expre
f330: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61  ssion that conta
f340: 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70  ins the IN.** op
f350: 65 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65  erator or subque
f360: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ry..**.** If par
f370: 61 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69  ameter isRowid i
f380: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f390: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
f3a0: 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  r is guaranteed.
f3b0: 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20  ** to be of the 
f3c0: 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e  form "<rowid> IN
f3d0: 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65   (?, ?, ?)", whe
f3e0: 72 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20  re <rowid> is a 
f3f0: 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20  reference.** to 
f400: 73 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79  some integer key
f410: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62   column of a tab
f420: 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  le B-Tree. In th
f430: 69 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a  is case, use an.
f440: 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65  ** intkey B-Tree
f450: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
f460: 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c  t of IN(...) val
f470: 75 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74  ues instead of t
f480: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f  he usual.** (slo
f490: 77 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65  wer) variable le
f4a0: 6e 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65  ngth keys B-Tree
f4b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48  ..**.** If rMayH
f4c0: 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a  aveNull is non-z
f4d0: 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ero, that means 
f4e0: 74 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69  that the operati
f4f0: 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28  on is an IN.** (
f500: 6e 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20  not a SELECT or 
f510: 45 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74  EXISTS) and that
f520: 20 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63   the RHS might c
f530: 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a  ontains NULLs..*
f540: 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
f550: 6e 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69  ne does is initi
f560: 61 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74  alize the regist
f570: 65 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79  er given by rMay
f580: 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e  HaveNull.** to N
f590: 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f  ULL.  Calling ro
f5a0: 75 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65  utines will take
f5b0: 20 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e   care of changin
f5c0: 67 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a  g this register.
f5d0: 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d  ** value to non-
f5e0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20  NULL if the RHS 
f5f0: 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a  is NULL-free..**
f600: 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54  .** For a SELECT
f610: 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61   or EXISTS opera
f620: 74 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20  tor, return the 
f630: 72 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f  register that ho
f640: 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  lds the.** resul
f650: 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61  t.  For IN opera
f660: 74 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72  tors or if an er
f670: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
f680: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
f690: 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  0..*/.#ifndef SQ
f6a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
f6b0: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  RY.int sqlite3Co
f6c0: 64 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50  deSubselect(.  P
f6d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f6e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
f6f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
f700: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
f710: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e         /* The IN
f720: 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49  , SELECT, or EXI
f730: 53 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  STS operator */.
f740: 20 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c    int rHasNullFl
f750: 61 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ag,       /* Reg
f760: 69 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72  ister that recor
f770: 64 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73  ds whether NULLs
f780: 20 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f   exist in RHS */
f790: 0a 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20  .  int isRowid  
f7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
f7b0: 20 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e   true, LHS of IN
f7c0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72   operator is a r
f7d0: 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  owid */.){.  int
f7e0: 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
f7f0: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
f800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d           /* One-
f810: 74 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73  time test addres
f820: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20  s */.  int rReg 
f830: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f850: 2a 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69  * Register stori
f860: 6e 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a  ng resulting */.
f870: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
f880: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f890: 65 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  e);.  if( NEVER(
f8a0: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  v==0) ) return 0
f8b0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
f8c0: 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
f8d0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
f8e0: 65 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e  e must be run in
f8f0: 20 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76   its entirety ev
f900: 65 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65  ery time it is e
f910: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
f920: 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
f930: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a  llowing is true:
f940: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20  .  **.  **    * 
f950: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
f960: 73 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c  side is a correl
f970: 61 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20  ated subquery.  
f980: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
f990: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
f9a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
f9b0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61  st containing va
f9c0: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20  riables.  **    
f9d0: 2a 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65  *  We are inside
f9e0: 20 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a   a trigger.  **.
f9f0: 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74    ** If all of t
fa00: 68 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c  he above are fal
fa10: 73 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  se, then we can 
fa20: 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75  run this code ju
fa30: 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76  st once.  ** sav
fa40: 65 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61  e the results, a
fa50: 6e 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  nd reuse the sam
fa60: 65 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73  e result on subs
fa70: 65 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  equent invocatio
fa80: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
fa90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
faa0: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
fab0: 65 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49  ect) ){.    jmpI
fac0: 66 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74  fDynamic = sqlit
fad0: 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73  e3CodeOnce(pPars
fae0: 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
faf0: 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  (v);.  }..#ifnde
fb00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
fb10: 50 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72  PLAIN.  if( pPar
fb20: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
fb30: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  {.    char *zMsg
fb40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
fb50: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
fb60: 65 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20  e->db, "EXECUTE 
fb70: 25 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64  %s%s SUBQUERY %d
fb80: 22 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  ", jmpIfDynamic>
fb90: 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45  =0?"":"CORRELATE
fba0: 44 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78  D ",.        pEx
fbb0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c  pr->op==TK_IN?"L
fbc0: 49 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70  IST":"SCALAR", p
fbd0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
fbe0: 63 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  ctId.    );.    
fbf0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc00: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
fc10: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
fc20: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
fc30: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
fc40: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
fc50: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
fc60: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
fc70: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
fc80: 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20  inity;          
fc90: 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20      /* Affinity 
fca0: 6f 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  of the LHS of th
fcb0: 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  e IN */.      in
fcc0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
fcd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
fce0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
fcf0: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
fd00: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78  tion */.      Ex
fd10: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
fd20: 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65  r->pLeft; /* the
fd30: 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   LHS of the IN o
fd40: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
fd50: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
fd60: 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  fo = 0;      /* 
fd70: 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
fd80: 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69  */..      affini
fd90: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
fda0: 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b  Affinity(pLeft);
fdb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
fdc0: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
fdd0: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
fde0: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
fdf0: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
fe00: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
fe10: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
fe20: 61 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68  ame way.  An eph
fe30: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20  emeral table is 
fe40: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
fe50: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
fe60: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
fe70: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
fe80: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
fe90: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
fea0: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
feb0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
fec0: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
fed0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
fee0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
fef0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
ff00: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
ff10: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
ff20: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
ff30: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
ff40: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
ff50: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
ff60: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
ff70: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
ff80: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
ff90: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
ffa0: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
ffb0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
ffc0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
ffd0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
ffe0: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
fff0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
10000 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
10010 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
10020 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
10030 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
10040 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
10050 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
10060 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
10070 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
10080 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
10090 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
100a0 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
100b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
100c0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
100d0 65 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69  emeral, pExpr->i
100e0 54 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29  Table, !isRowid)
100f0 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
10100 20 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a   = isRowid ? 0 :
10110 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
10120 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
10130 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69   1, 1);..      i
10140 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
10150 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
10160 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
10170 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
10180 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
10190 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
101a0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
101b0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
101c0 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
101d0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
101e0 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
101f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
10200 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
10210 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
10220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10230 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
10240 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
10250 65 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ect;.        Sel
10260 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
10270 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
10280 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20  pEList;..       
10290 20 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69   assert( !isRowi
102a0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  d );.        sql
102b0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
102c0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65  it(&dest, SRT_Se
102d0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
102e0 29 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e  );.        dest.
102f0 61 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66  affSdst = (u8)af
10300 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
10310 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
10320 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46  iTable&0x0000FFF
10330 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  F)==pExpr->iTabl
10340 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  e );.        pSe
10350 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  lect->iLimit = 0
10360 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
10370 73 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c  se( pSelect->sel
10380 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
10390 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  nct );.        t
103a0 65 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66  estcase( pKeyInf
103b0 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65  o==0 ); /* Cause
103c0 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69  d by OOM in sqli
103d0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
103e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  ) */.        if(
103f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
10400 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
10410 26 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  &dest) ){.      
10420 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
10430 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
10440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10450 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
10460 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
10470 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
10480 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
10490 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29  t( pKeyInfo!=0 )
104a0 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61  ; /* OOM will ca
104b0 75 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73  use exit after s
104c0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a  qlite3Select() *
104d0 2f 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 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
104f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10500 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
10510 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10520 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
10530 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
10540 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
10550 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
10560 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  [0] = sqlite3Bin
10570 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
10580 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
10590 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20  >pLeft,.        
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
105e0 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xpr);.      }els
105f0 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
10600 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20  pr->x.pList!=0) 
10610 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
10620 73 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49  se 2:     expr I
10630 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20  N (exprlist).   
10640 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
10650 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
10660 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
10670 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
10680 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
10690 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
106a0 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
106b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
106c0 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
106d0 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
106e0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
106f0 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
10700 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
10710 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
10720 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
10730 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
10740 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
10750 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
10760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
10770 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
10780 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
10790 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
107a0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
107b0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
107c0 20 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72         int r1, r
107d0 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20  2, r3;..        
107e0 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
107f0 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
10800 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
10810 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
10820 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
10830 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
10840 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
10850 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
10860 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29  able(pKeyInfo) )
10870 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79  ;.          pKey
10880 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d  Info->aColl[0] =
10890 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
108a0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
108b0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
108c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
108d0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
108e0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
108f0 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a   <exprlist>. */.
10900 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
10910 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10920 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
10930 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
10940 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10950 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
10960 77 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62  wid ) sqlite3Vdb
10970 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
10980 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20  ll, 0, r2);.    
10990 20 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d      for(i=pList-
109a0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c  >nExpr, pItem=pL
109b0 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  ist->a; i>0; i--
109c0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
109d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
109e0 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
109f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56            int iV
10a00 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20  alToIns;..      
10a10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78      /* If the ex
10a20 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
10a30 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65  constant then we
10a40 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20   will need to.  
10a50 20 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62          ** disab
10a60 6c 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74  le the test that
10a70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61   was generated a
10a80 62 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20  bove that makes 
10a90 73 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a  sure.          *
10aa0 2a 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79  * this code only
10ab0 20 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20   executes once. 
10ac0 20 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e   Because for a n
10ad0 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  on-constant.    
10ae0 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
10af0 69 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72  ion we need to r
10b00 65 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65  erun this code e
10b10 61 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ach time..      
10b20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
10b30 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69   if( jmpIfDynami
10b40 63 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33  c>=0 && !sqlite3
10b50 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
10b60 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  E2) ){.         
10b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
10b80 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d  angeToNoop(v, jm
10b90 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20  pIfDynamic);.   
10ba0 20 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79           jmpIfDy
10bb0 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20  namic = -1;.    
10bc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
10bd0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
10be0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  he expression an
10bf0 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
10c00 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
10c10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
10c20 20 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69   isRowid && sqli
10c30 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10c40 28 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73  (pE2, &iValToIns
10c50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10c60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10c70 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49  p3(v, OP_InsertI
10c80 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nt, pExpr->iTabl
10c90 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73  e, r2, iValToIns
10ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
10cb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
10cc0 72 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r3 = sqlite3Expr
10cd0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
10ce0 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20  e, pE2, r1);.   
10cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52           if( isR
10d00 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
10d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10d20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75  eAddOp2(v, OP_Mu
10d30 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20  stBeInt, r3,.   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10d60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10d70 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
10d80 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
10d90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10da0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10db0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10dc0 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69  Insert, pExpr->i
10dd0 54 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a  Table, r2, r3);.
10de0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
10df0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
10e00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e10 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
10e20 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20  ord, r3, 1, r2, 
10e30 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  &affinity, 1);. 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10e50 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
10e60 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
10e70 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20  se, r3, 1);.    
10e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10ea0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78  P_IdxInsert, pEx
10eb0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b  pr->iTable, r2);
10ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
10ed0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
10ef0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10f00 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
10f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10f20 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
10f30 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
10f40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65   }.      if( pKe
10f50 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  yInfo ){.       
10f60 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
10f70 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76  geP4(v, addr, (v
10f80 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  oid *)pKeyInfo, 
10f90 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
10fa0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10fb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
10fc0 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
10fd0 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
10fe0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
10ff0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
11000 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
11010 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
11020 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
11030 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
11040 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
11050 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
11060 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
11070 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
11080 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
11090 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
110a0 6e 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61  n.  If this is a
110b0 6e 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a  n EXISTS, write.
110c0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65        ** an inte
110d0 67 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74  ger 0 (not exist
110e0 73 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29  s) or 1 (exists)
110f0 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
11100 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ell.      ** and
11110 20 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d   record that mem
11120 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c  ory cell in iCol
11130 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  umn..      */.  
11140 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
11150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
11170 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
11180 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   encode */.     
11190 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
111a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
111b0 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
111c0 20 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43   deal with SELEC
111d0 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20  t result */..   
111e0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
111f0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
11200 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
11210 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
11220 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
11230 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
11240 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
11250 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
11260 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20  _SELECT );..    
11270 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
11280 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
11290 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
112a0 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
112b0 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
112c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
112d0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
112e0 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d  st, 0, ++pParse-
112f0 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  >nMem);.      if
11300 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
11310 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20  SELECT ){.      
11320 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
11330 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  RT_Mem;.        
11340 64 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73  dest.iSdst = des
11350 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
11360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11370 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
11380 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d   0, dest.iSDParm
11390 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
113a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74  omment((v, "Init
113b0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
113c0 22 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "));.      }else
113d0 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
113e0 44 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74  Dest = SRT_Exist
113f0 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
11400 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11410 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64  OP_Integer, 0, d
11420 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20  est.iSDParm);.  
11430 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11440 74 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53  t((v, "Init EXIS
11450 54 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20  TS result"));.  
11460 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11470 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
11480 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e  arse->db, pSel->
11490 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
114a0 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71  Sel->pLimit = sq
114b0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
114c0 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  e, TK_INTEGER, 0
114d0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49         &sqlite3I
11500 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20  ntTokens[1]);.  
11510 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74      pSel->iLimit
11520 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
11530 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
11540 61 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73  arse, pSel, &des
11550 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
11560 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
11570 20 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73        rReg = des
11580 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20  t.iSDParm;.     
11590 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
115a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
115b0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62  Reduce);.      b
115c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
115d0 0a 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46  .  if( rHasNullF
115e0 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
115f0 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67  e3SetHasNullFlag
11600 28 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  (v, pExpr->iTabl
11610 65 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29  e, rHasNullFlag)
11620 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70  ;.  }..  if( jmp
11630 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a  IfDynamic>=0 ){.
11640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
11650 75 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66  umpHere(v, jmpIf
11660 44 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20  Dynamic);.  }.  
11670 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11680 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  Pop(pParse);..  
11690 72 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23  return rReg;.}.#
116a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
116b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
116c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
116d0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
116e0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
116f0 64 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70  de for an IN exp
11700 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
11710 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54      x IN (SELECT
11720 20 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20   ...).**      x 
11730 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
11740 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  , ...).**.** The
11750 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
11760 28 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61  (LHS) is a scala
11770 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54  r expression.  T
11780 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
11790 64 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61  de (RHS).** is a
117a0 6e 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20  n array of zero 
117b0 6f 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20  or more values. 
117c0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
117d0 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c  is true if the L
117e0 48 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e  HS is.** contain
117f0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
11800 53 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66  S.  The value of
11810 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
11820 69 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c  is unknown (NULL
11830 29 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20  ).** if the LHS 
11840 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68  is NULL or if th
11850 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e  e LHS is not con
11860 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68  tained within th
11870 65 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a  e RHS and the.**
11880 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   RHS contains on
11890 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76  e or more NULL v
118a0 61 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alues..**.** Thi
118b0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
118c0 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75  tes code that ju
118d0 6d 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c  mps to destIfFal
118e0 73 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  se if the LHS is
118f0 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e   not .** contain
11900 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
11910 53 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55  S.  If due to NU
11920 4c 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  LLs we cannot de
11930 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c  termine if the L
11940 48 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e  HS.** is contain
11950 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68  ed in the RHS th
11960 65 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49  en jump to destI
11970 66 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c  fNull.  If the L
11980 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a  HS is contained.
11990 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ** within the RH
119a0 53 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f  S then fall thro
119b0 75 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ugh..*/.static v
119c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
119d0 6f 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a  odeIN(.  Parse *
119e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
119f0 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
11a00 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
11a10 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
11a20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
11a30 20 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65   /* The IN expre
11a40 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64  ssion */.  int d
11a50 65 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20  estIfFalse,     
11a60 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
11a70 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
11a80 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53  ained in the RHS
11a90 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
11aa0 4e 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a  Null        /* J
11ab0 75 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20  ump here if the 
11ac0 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e  results are unkn
11ad0 6f 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73  own due to NULLs
11ae0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68   */.){.  int rRh
11af0 73 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f  sHasNull = 0;  /
11b00 2a 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20  * Register that 
11b10 69 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63  is true if RHS c
11b20 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c  ontains NULL val
11b30 75 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66  ues */.  char af
11b40 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f  finity;        /
11b50 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66  * Comparison aff
11b60 69 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a  inity to use */.
11b70 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
11b80 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
11b90 6f 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  of the RHS */.  
11ba0 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
11bb0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
11bc0 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20  ry use register 
11bd0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
11be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
11bf0 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
11c00 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
11c10 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
11c20 52 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69  RHS.   After thi
11c30 73 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c  s step, the tabl
11c40 65 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20  e with cursor.  
11c50 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
11c60 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74   will contains t
11c70 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
11c80 61 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a  ake up the RHS..
11c90 20 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73    */.  v = pPars
11ca0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
11cb0 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
11cc0 20 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65    /* OOM detecte
11cd0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
11ce0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62  routine */.  Vdb
11cf0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
11d00 20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22   "begin IN expr"
11d10 29 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71  ));.  eType = sq
11d20 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
11d30 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a  (pParse, pExpr,.
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f               IN_
11d60 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
11d70 20 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   | IN_INDEX_NOOP
11d80 5f 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _OK,.           
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64    destIfFalse==d
11db0 65 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20  estIfNull ? 0 : 
11dc0 26 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a  &rRhsHasNull);..
11dd0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
11de0 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
11df0 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
11e00 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
11e10 75 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ults.  ** of the
11e20 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
11e30 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
11e40 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
11e50 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a  suitable for.  *
11e60 2a 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52  * P4 of OP_MakeR
11e70 65 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66  ecord..  */.  af
11e80 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
11e90 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
11ea0 72 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74  r);..  /* Code t
11eb0 68 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70  he LHS, the <exp
11ec0 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
11ed0 49 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a  IN (...)"..  */.
11ee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
11ef0 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
11f00 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
11f10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11f20 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
11f30 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
11f40 72 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a  r->pLeft, r1);..
11f50 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46    /* If sqlite3F
11f60 69 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64  indInIndex() did
11f70 20 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65   not find or cre
11f80 61 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61  ate an index tha
11f90 74 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62  t is.  ** suitab
11fa0 6c 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e  le for evaluatin
11fb0 67 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  g the IN operato
11fc0 72 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  r, then evaluate
11fd0 20 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65   using a.  ** se
11fe0 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
11ff0 69 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  isons..  */.  if
12000 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
12010 58 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78  X_NOOP ){.    Ex
12020 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
12030 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
12040 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
12050 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
12060 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
12070 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
12080 20 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d     int labelOk =
12090 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
120a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e  Label(v);.    in
120b0 74 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b  t r2, regToFree;
120c0 0a 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75  .    int regCkNu
120d0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ll = 0;.    int 
120e0 69 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ii;.    assert( 
120f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
12100 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
12110 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
12120 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73   destIfNull!=des
12130 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
12140 20 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71    regCkNull = sq
12150 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12160 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
12170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12180 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72  (v, OP_BitAnd, r
12190 31 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c  1, r1, regCkNull
121a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
121b0 28 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d  (ii=0; ii<pList-
121c0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
121d0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
121e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
121f0 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
12200 69 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f  i].pExpr, &regTo
12210 46 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Free);.      if(
12220 20 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71   regCkNull && sq
12230 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75  lite3ExprCanBeNu
12240 6c 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e  ll(pList->a[ii].
12250 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
12260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12270 4f 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64  Op3(v, OP_BitAnd
12280 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c  , regCkNull, r2,
12290 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
122a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
122b0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
122c0 20 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d   || destIfNull!=
122d0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
122e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
122f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
12300 71 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20  q, r1, labelOk, 
12310 72 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r2,.            
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
12330 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  oid*)pColl, P4_C
12340 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
12350 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
12360 76 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  v, ii<pList->nEx
12370 70 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56  pr-1);.        V
12380 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
12390 20 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70   ii==pList->nExp
123a0 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r-1);.        sq
123b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
123c0 35 28 76 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a  5(v, affinity);.
123d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
123e0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
123f0 74 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46  tIfNull==destIfF
12400 61 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20  alse );.        
12410 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12420 34 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20  4(v, OP_Ne, r1, 
12430 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c  destIfFalse, r2,
12440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12450 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
12460 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
12470 53 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61  SEQ); VdbeCovera
12480 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
12490 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
124a0 50 35 28 76 2c 20 61 66 66 69 6e 69 74 79 20 7c  P5(v, affinity |
124b0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
124c0 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LL);.      }.   
124d0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
124e0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
124f0 20 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20   regToFree);.   
12500 20 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b   }.    if( regCk
12510 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Null ){.      sq
12520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12530 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
12540 67 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e  gCkNull, destIfN
12550 75 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ull); VdbeCovera
12560 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
12570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12580 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
12590 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
125a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
125b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
125c0 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
125d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
125e0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
125f0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  CkNull);.  }else
12600 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  {.  .    /* If t
12610 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20  he LHS is NULL, 
12620 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12630 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20  is either false 
12640 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e  or NULL dependin
12650 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74  g.    ** on whet
12660 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65  her the RHS is e
12670 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73  mpty or not, res
12680 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a  pectively..    *
12690 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
126a0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
126b0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
126c0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 49 66        if( destIf
126d0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
126e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
126f0 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
12700 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
12710 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
12720 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
12730 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
12740 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e same. */.     
12750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12760 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
12770 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c  l, r1, destIfNul
12780 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
12790 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
127a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
127b0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
127c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
127d0 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65  tNull, r1); Vdbe
127e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
127f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
12810 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
12820 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
12830 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
12840 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12860 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
12870 20 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b   0, destIfNull);
12880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12890 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
128a0 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  addr1);.      }.
128b0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
128c0 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
128d0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
128e0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
128f0 20 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20   the RHS is the 
12900 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62  ROWID of table b
12910 2d 74 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20  -tree.      */. 
12920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12930 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
12940 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74  tBeInt, r1, dest
12950 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f  IfFalse); VdbeCo
12960 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12980 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73  p3(v, OP_NotExis
12990 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ts, pExpr->iTabl
129a0 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  e, destIfFalse, 
129b0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
129c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
129d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
129e0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
129f0 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65  e RHS is an inde
12a00 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20  x b-tree..      
12a10 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
12a20 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12a30 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31  _Affinity, r1, 1
12a40 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20  , 0, &affinity, 
12a50 31 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  1);.  .      /* 
12a60 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  If the set membe
12a70 72 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73  rship test fails
12a80 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
12a90 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  t of the .      
12aa0 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20  ** "x IN (...)" 
12ab0 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
12ac0 62 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e  be either 0 or N
12ad0 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a  ULL. If the set.
12ae0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
12af0 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73  s no NULL values
12b00 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
12b10 74 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73  t is 0. If the s
12b20 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  et .      ** con
12b30 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
12b40 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74  e NULL values, t
12b50 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f  hen the result o
12b60 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
12b70 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
12b80 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f  o NULL..      */
12b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
12ba0 65 73 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74  estIfFalse!=dest
12bb0 49 66 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61  IfNull || rRhsHa
12bc0 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  sNull==0 );.    
12bd0 20 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c    if( rRhsHasNul
12be0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
12bf0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
12c00 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f  uns if it is kno
12c10 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  wn at compile ti
12c20 6d 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a  me that the RHS.
12c30 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f          ** canno
12c40 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76  t contain NULL v
12c50 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70  alues. This happ
12c60 65 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c  ens as the resul
12c70 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  t.        ** of 
12c80 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  a "NOT NULL" con
12c90 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64  straint in the d
12ca0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
12cb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
12cc0 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74     ** Also run t
12cd0 68 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55  his branch if NU
12ce0 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  LL is equivalent
12cf0 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20   to FALSE.      
12d00 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61    ** for this pa
12d10 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72  rticular IN oper
12d20 61 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ator..        */
12d30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12d40 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
12d50 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
12d60 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
12d70 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29  tIfFalse, r1, 1)
12d80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
12d90 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12db0 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63  /* In this branc
12dc0 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  h, the RHS of th
12dd0 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61  e IN might conta
12de0 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20  in a NULL and.  
12df0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
12e00 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20  sence of a NULL 
12e10 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73  on the RHS makes
12e20 20 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e   a difference in
12e30 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
12e40 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20  outcome..       
12e50 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
12e60 6a 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f  j1;.  .        /
12e70 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
12e80 20 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20   see if the LHS 
12e90 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
12ea0 74 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c  the RHS.  If so,
12eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
12ec0 20 74 68 65 20 61 6e 73 77 65 72 20 69 73 20 54   the answer is T
12ed0 52 55 45 20 74 68 65 20 70 72 65 73 65 6e 63 65  RUE the presence
12ee0 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65   of NULLs in the
12ef0 20 52 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20   RHS does.      
12f00 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e    ** not matter.
12f10 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
12f20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
12f30 20 74 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74   the RHS, then t
12f40 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  he.        ** an
12f50 73 77 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20  swer is NULL if 
12f60 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73  the RHS contains
12f70 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61   NULLs and the a
12f80 6e 73 77 65 72 20 69 73 0a 20 20 20 20 20 20 20  nswer is.       
12f90 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65   ** FALSE if the
12fa0 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65   RHS is NULL-fre
12fb0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
12fc0 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
12fd0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
12fe0 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78  v, OP_Found, pEx
12ff0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72  pr->iTable, 0, r
13000 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 1);.        V
13010 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13040 49 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e  IsNull, rRhsHasN
13050 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
13060 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
13070 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13090 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
130a0 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29   0, destIfFalse)
130b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
130c0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
130d0 20 6a 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j1);.      }.  
130e0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
130f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
13100 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73  pParse, r1);.  s
13110 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
13120 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64  op(pParse);.  Vd
13130 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
13140 6e 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d  nd IN expr"));.}
13150 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
13160 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
13170 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63  */../*.** Duplic
13180 61 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61  ate an 8-byte va
13190 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  lue.*/.static ch
131a0 61 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64  ar *dup8bytes(Vd
131b0 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
131c0 72 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a  r *in){.  char *
131d0 6f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  out = sqlite3DbM
131e0 61 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33  allocRaw(sqlite3
131f0 56 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20  VdbeDb(v), 8);. 
13200 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
13210 6d 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20  memcpy(out, in, 
13220 38 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  8);.  }.  return
13230 20 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   out;.}..#ifndef
13240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
13250 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a  ATING_POINT./*.*
13260 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
13270 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
13280 69 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61  ill put the floa
13290 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
132a0 6c 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79  lue described by
132b0 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20   z[0..n-1] into 
132c0 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a  register iMem..*
132d0 2a 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72  *.** The z[] str
132e0 69 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c  ing will probabl
132f0 79 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65  y not be zero-te
13300 72 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74  rminated.  But t
13310 68 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72  he .** z[n] char
13320 61 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74  acter is guarant
13330 65 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68  eed to be someth
13340 69 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ing that does no
13350 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74  t look.** like t
13360 68 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  he continuation 
13370 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a  of the number..*
13380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
13390 64 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20  deReal(Vdbe *v, 
133a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
133b0 6e 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69  nt negateFlag, i
133c0 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20  nt iMem){.  if( 
133d0 41 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a  ALWAYS(z!=0) ){.
133e0 20 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65      double value
133f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a  ;.    char *zV;.
13400 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28      sqlite3AtoF(
13410 7a 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74  z, &value, sqlit
13420 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
13430 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
13440 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
13450 33 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b  3IsNaN(value) );
13460 20 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46   /* The new AtoF
13470 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e   never returns N
13480 61 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65  aN */.    if( ne
13490 67 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65  gateFlag ) value
134a0 20 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a   = -value;.    z
134b0 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
134c0 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
134d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
134e0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61  AddOp4(v, OP_Rea
134f0 6c 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  l, 0, iMem, 0, z
13500 56 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d  V, P4_REAL);.  }
13510 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
13520 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
13530 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
13540 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
13550 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
13560 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
13570 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
13580 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72  iMem..**.** Expr
13590 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77  .u.zToken is alw
135a0 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72  ays UTF8 and zer
135b0 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f  o-terminated..*/
135c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
135d0 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a  eInteger(Parse *
135e0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
135f0 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67  xpr, int negFlag
13600 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56  , int iMem){.  V
13610 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
13620 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45  >pVdbe;.  if( pE
13630 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  xpr->flags & EP_
13640 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
13650 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75  int i = pExpr->u
13660 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73  .iValue;.    ass
13670 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
13680 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69   if( negFlag ) i
13690 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74   = -i;.    sqlit
136a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
136b0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69  OP_Integer, i, i
136c0 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Mem);.  }else{. 
136d0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36     int c;.    i6
136e0 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e  4 value;.    con
136f0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78  st char *z = pEx
13700 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
13710 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29    assert( z!=0 )
13720 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65  ;.    c = sqlite
13730 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
13740 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69  , &value);.    i
13750 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32  f( c==0 || (c==2
13760 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a   && negFlag) ){.
13770 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a        char *zV;.
13780 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61        if( negFla
13790 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d  g ){ value = c==
137a0 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54  2 ? SMALLEST_INT
137b0 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20  64 : -value; }. 
137c0 20 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79       zV = dup8by
137d0 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76  tes(v, (char*)&v
137e0 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  alue);.      sql
137f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13800 2c 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69  , OP_Int64, 0, i
13810 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49  Mem, 0, zV, P4_I
13820 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NT64);.    }else
13830 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
13840 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
13850 49 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65  INT.      sqlite
13860 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13870 2c 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74  , "oversized int
13880 65 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67  eger: %s%s", neg
13890 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c  Flag ? "-" : "",
138a0 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64   z);.#else.#ifnd
138b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48  ef SQLITE_OMIT_H
138c0 45 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20  EX_INTEGER.     
138d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
138e0 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d  nicmp(z,"0x",2)=
138f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13900 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13910 61 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72  arse, "hex liter
13920 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c  al too big: %s",
13930 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   z);.      }else
13940 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
13950 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
13960 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20  (v, z, negFlag, 
13970 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  iMem);.      }.#
13980 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
13990 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
139a0 20 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f   cache entry..*/
139b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
139c0 68 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72  heEntryClear(Par
139d0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
139e0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29  ct yColCache *p)
139f0 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52  {.  if( p->tempR
13a00 65 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  eg ){.    if( pP
13a10 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
13a20 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
13a30 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
13a40 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
13a50 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
13a60 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52  mpReg++] = p->iR
13a70 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  eg;.    }.    p-
13a80 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
13a90 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  }.}.../*.** Reco
13aa0 72 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  rd in the column
13ab0 20 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61   cache that a pa
13ac0 72 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20  rticular column 
13ad0 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63  from a.** partic
13ae0 75 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74  ular table is st
13af0 6f 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63  ored in a partic
13b00 75 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a  ular register..*
13b10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
13b20 70 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72  prCacheStore(Par
13b30 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
13b40 69 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20  iTab, int iCol, 
13b50 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
13b60 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75   i;.  int minLru
13b70 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a  ;.  int idxLru;.
13b80 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13b90 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  he *p;..  /* Unl
13ba0 65 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73  ess an error has
13bb0 20 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73   occurred, regis
13bc0 74 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  ter numbers are 
13bd0 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e  always positive.
13be0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52   */.  assert( iR
13bf0 65 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  eg>0 || pParse->
13c00 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
13c10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
13c30 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33  ol>=-1 && iCol<3
13c40 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69  2768 );  /* Fini
13c50 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  te column number
13c60 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53  s */..  /* The S
13c70 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
13c80 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20  e flag disables 
13c90 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13ca0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  .  This is used.
13cb0 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67    ** for testing
13cc0 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66   only - to verif
13cd0 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c  y that SQLite al
13ce0 77 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61  ways gets the sa
13cf0 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77  me answer.  ** w
13d00 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20  ith and without 
13d10 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13d20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74  ..  */.  if( Opt
13d30 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
13d40 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51  d(pParse->db, SQ
13d50 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
13d60 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
13d70 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20  * First replace 
13d80 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74  any existing ent
13d90 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ry..  **.  ** Ac
13da0 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20  tually, the way 
13db0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13dc0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73   is currently us
13dd0 65 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61  ed, we are guara
13de0 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  nteed.  ** that 
13df0 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  the object will 
13e00 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65  never already be
13e10 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69   in cache.  Veri
13e20 66 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  fy this guarante
13e30 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  e..  */.#ifndef 
13e40 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  NDEBUG.  for(i=0
13e50 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13e60 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13e70 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13e80 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   p++){.    asser
13e90 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c  t( p->iReg==0 ||
13ea0 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62   p->iTable!=iTab
13eb0 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   || p->iColumn!=
13ec0 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  iCol );.  }.#end
13ed0 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e  if..  /* Find an
13ee0 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20   empty slot and 
13ef0 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20  replace it */.  
13f00 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
13f10 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
13f20 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
13f30 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
13f40 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30    if( p->iReg==0
13f50 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65   ){.      p->iLe
13f60 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  vel = pParse->iC
13f70 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20  acheLevel;.     
13f80 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
13f90 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  b;.      p->iCol
13fa0 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  umn = iCol;.    
13fb0 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
13fc0 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52  ;.      p->tempR
13fd0 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  eg = 0;.      p-
13fe0 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
13ff0 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
14000 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
14010 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63    }..  /* Replac
14020 65 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e  e the last recen
14030 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69  tly used */.  mi
14040 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66  nLru = 0x7ffffff
14050 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31  f;.  idxLru = -1
14060 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
14070 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
14080 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
14090 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
140a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75  {.    if( p->lru
140b0 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20  <minLru ){.     
140c0 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20   idxLru = i;.   
140d0 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c     minLru = p->l
140e0 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ru;.    }.  }.  
140f0 69 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72  if( ALWAYS(idxLr
14100 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d  u>=0) ){.    p =
14110 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61   &pParse->aColCa
14120 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20  che[idxLru];.   
14130 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61   p->iLevel = pPa
14140 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14150 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
14160 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69  = iTab;.    p->i
14170 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
14180 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65     p->iReg = iRe
14190 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  g;.    p->tempRe
141a0 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72  g = 0;.    p->lr
141b0 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  u = pParse->iCac
141c0 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  heCnt++;.    ret
141d0 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  urn;.  }.}../*.*
141e0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
141f0 72 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65  registers betwee
14200 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65  n iReg..iReg+nRe
14210 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76  g-1 are being ov
14220 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75  erwritten..** Pu
14230 72 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  rge the range of
14240 20 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20   registers from 
14250 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
14260 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14270 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
14280 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14290 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52  int iReg, int nR
142a0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
142b0 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67  int iLast = iReg
142c0 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73   + nReg - 1;.  s
142d0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
142e0 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
142f0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
14300 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
14310 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
14320 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20  +){.    int r = 
14330 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28  p->iReg;.    if(
14340 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69   r>=iReg && r<=i
14350 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61  Last ){.      ca
14360 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50  cheEntryClear(pP
14370 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
14380 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20  p->iReg = 0;.   
14390 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
143a0 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72  Remember the cur
143b0 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  rent column cach
143c0 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20  e context.  Any 
143d0 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65  new entries adde
143e0 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68  d.** added to th
143f0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
14400 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61  fter this call a
14410 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20  re removed when 
14420 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
14430 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e  ding pop occurs.
14440 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14450 45 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61  ExprCachePush(Pa
14460 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14470 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14480 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51  vel++;.#ifdef SQ
14490 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
144a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
144b0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
144c0 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
144d0 20 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74    printf("PUSH t
144e0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
144f0 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
14500 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
14510 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74  ** Remove from t
14520 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
14530 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74  any entries that
14540 20 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63   were added sinc
14550 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65  e the.** the pre
14560 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70  vious sqlite3Exp
14570 72 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61  rCachePush opera
14580 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20  tion.  In other 
14590 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a  words, restore.*
145a0 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  * the cache to t
145b0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
145c0 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73  in prior the mos
145d0 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a  t recent Push..*
145e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
145f0 70 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65  prCachePop(Parse
14600 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
14610 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
14620 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73  lCache *p;.  ass
14630 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61  ert( pParse->iCa
14640 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20  cheLevel>=1 );. 
14650 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
14660 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53  evel--;.#ifdef S
14670 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
14680 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c  ( pParse->db->fl
14690 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
146a0 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
146b0 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20     printf("POP  
146c0 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65  to %d\n", pParse
146d0 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a  ->iCacheLevel);.
146e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
146f0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14700 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14710 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
14720 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14730 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d  f( p->iReg && p-
14740 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
14750 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20  iCacheLevel ){. 
14760 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
14770 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
14780 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
14790 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
147a0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61  ./*.** When a ca
147b0 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72  ched column is r
147c0 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65  eused, make sure
147d0 20 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74   that its regist
147e0 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67  er is.** no long
147f0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  er available as 
14800 61 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e  a temp register.
14810 20 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20    ticket #3879: 
14820 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65   that same.** re
14830 67 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20  gister might be 
14840 69 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20  in the cache in 
14850 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c  multiple places,
14860 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a   so be sure to.*
14870 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a  * get them all..
14880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
14890 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
148a0 69 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65  inRegister(Parse
148b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
148c0 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
148d0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
148e0 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   *p;.  for(i=0, 
148f0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14900 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14910 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14920 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14930 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
14940 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
14950 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
14960 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14970 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
14980 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
14990 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
149a0 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  of a table..*/.v
149b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
149c0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
149d0 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ble(.  Vdbe *v, 
149e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
149f0 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  BE under constru
14a00 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  ction */.  Table
14a10 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68   *pTab,    /* Th
14a20 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
14a30 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a  ng the value */.
14a40 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20    int iTabCur,  
14a50 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63    /* The table c
14a60 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50  ursor.  Or the P
14a70 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54  K cursor for WIT
14a80 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20  HOUT ROWID */.  
14a90 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
14aa0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
14ab0 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  column to extrac
14ac0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  t */.  int regOu
14ad0 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63  t      /* Extrac
14ae0 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f  t the value into
14af0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
14b00 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c  /.){.  if( iCol<
14b10 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  0 || iCol==pTab-
14b20 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  >iPKey ){.    sq
14b30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14b40 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61  v, OP_Rowid, iTa
14b50 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20  bCur, regOut);. 
14b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
14b70 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70  op = IsVirtual(p
14b80 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d  Tab) ? OP_VColum
14b90 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20  n : OP_Column;. 
14ba0 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b     int x = iCol;
14bb0 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
14bc0 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
14bd0 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c    x = sqlite3Col
14be0 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74  umnOfIndex(sqlit
14bf0 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
14c00 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a  x(pTab), iCol);.
14c10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14c20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
14c30 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72  p, iTabCur, x, r
14c40 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66  egOut);.  }.  if
14c50 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
14c60 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65   sqlite3ColumnDe
14c70 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69  fault(v, pTab, i
14c80 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Col, regOut);.  
14c90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
14ca0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
14cb0 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69  ll extract the i
14cc0 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e  Column-th column
14cd0 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70   from.** table p
14ce0 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68  Tab and store th
14cf0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
14d00 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41  n a register.  A
14d10 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d  n effort.** is m
14d20 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ade to store the
14d30 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
14d40 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20   register iReg, 
14d50 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e  but this is.** n
14d60 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20  ot guaranteed.  
14d70 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
14d80 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
14d90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14da0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
14db0 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
14dc0 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
14dd0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
14de0 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
14df0 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
14e00 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
14e10 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
14e20 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
14e30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
14e40 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
14e50 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
14e60 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
14e70 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
14e80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
14e90 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
14ea0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
14eb0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
14ec0 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
14ed0 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
14ee0 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
14ef0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
14f00 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
14f10 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
14f20 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
14f30 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
14f40 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
14f50 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
14f60 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
14f70 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
14f80 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
14f90 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b   OP_Column */.){
14fa0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14fb0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
14fc0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
14fd0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
14fe0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
14ff0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
15000 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
15010 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
15020 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
15030 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
15040 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
15050 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
15060 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
15070 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
15080 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15090 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
150a0 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
150b0 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
150c0 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
150d0 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
150e0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
150f0 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
15100 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
15110 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
15120 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
15130 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
15140 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15150 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
15160 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
15170 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
15180 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
15190 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
151a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
151b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
151c0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68   all column cach
151d0 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f  e entries..*/.vo
151e0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
151f0 63 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a  cheClear(Parse *
15200 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
15210 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
15220 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51  ache *p;..#if SQ
15230 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
15240 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
15250 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
15260 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
15270 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c    printf("CLEAR\
15280 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
15290 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
152a0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
152b0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
152c0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
152d0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20      if( p->iReg 
152e0 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
152f0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
15300 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
15310 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
15320 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  }.}../*.** Recor
15330 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
15340 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e  an affinity chan
15350 67 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  ge has occurred 
15360 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67  on iCount.** reg
15370 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
15380 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a  with iStart..*/.
15390 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
153a0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
153b0 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
153c0 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  e, int iStart, i
153d0 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71  nt iCount){.  sq
153e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
153f0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74  move(pParse, iSt
15400 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a  art, iCount);.}.
15410 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
15420 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e  code to move con
15430 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74  tent from regist
15440 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f  ers iFrom...iFro
15450 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72  m+nReg-1.** over
15460 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65   to iTo..iTo+nRe
15470 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f  g-1. Keep the co
15480 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f  lumn cache up-to
15490 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  -date..*/.void s
154a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
154b0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
154c0 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74  , int iFrom, int
154d0 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b   iTo, int nReg){
154e0 0a 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d  .  assert( iFrom
154f0 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46  >=iTo+nReg || iF
15500 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b  rom+nReg<=iTo );
15510 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15520 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp3(pParse->pVd
15530 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72  be, OP_Move, iFr
15540 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a  om, iTo, nReg);.
15550 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
15560 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
15570 20 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d   iFrom, nReg);.}
15580 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
15590 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
155a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
155b0 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a  VERAGE_TEST)./*.
155c0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
155d0 66 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69  f any register i
155e0 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f  n the range iFro
155f0 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76  m..iTo (inclusiv
15600 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73  e).** is used as
15610 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c   part of the col
15620 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  umn cache..**.**
15630 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
15640 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73   used within ass
15650 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
15660 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79  se() macros only
15670 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  .** and does not
15680 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72   appear in a nor
15690 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  mal build..*/.st
156a0 61 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43  atic int usedAsC
156b0 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65  olumnCache(Parse
156c0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46   *pParse, int iF
156d0 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20  rom, int iTo){. 
156e0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
156f0 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
15700 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
15710 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
15720 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
15730 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
15740 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
15750 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
15760 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29  From && r<=iTo )
15770 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a   return 1;    /*
15780 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20  NO_TEST*/.  }.  
15790 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
157a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
157b0 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56  UG || SQLITE_COV
157c0 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f  ERAGE_TEST */../
157d0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
157e0 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
157f0 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
15800 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15810 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
15820 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67  xpr *p, int iReg
15830 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d  ){.  p->op2 = p-
15840 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  >op;.  p->op = T
15850 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d  K_REGISTER;.  p-
15860 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a  >iTable = iReg;.
15870 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
15880 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b  rty(p, EP_Skip);
15890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
158a0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
158b0 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
158c0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
158d0 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
158e0 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
158f0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
15900 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
15910 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
15920 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
15930 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
15940 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
15950 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
15960 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
15970 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
15980 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
15990 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
159a0 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
159b0 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
159c0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
159d0 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
159e0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
159f0 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
15a00 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
15a10 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
15a20 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
15a30 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
15a40 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
15a50 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
15a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15a70 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
15a80 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
15a90 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
15aa0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
15ab0 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
15ac0 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
15ad0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
15ae0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
15af0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
15b00 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
15b10 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
15b20 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
15b30 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
15b40 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
15b50 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
15b60 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
15b70 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
15b80 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
15b90 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
15ba0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
15bb0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
15bc0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
15bd0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
15be0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
15bf0 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
15c00 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
15c10 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
15c20 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
15c30 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
15c40 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
15c50 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
15c60 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c80 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
15c90 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a  ession node */..
15ca0 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
15cb0 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
15cc0 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
15cd0 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
15ce0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
15cf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15d00 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
15d10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
15d20 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
15d30 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
15d40 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
15d50 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
15d60 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
15d70 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
15d80 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
15d90 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
15da0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
15db0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
15dc0 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
15dd0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
15de0 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
15df0 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
15e00 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
15e10 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
15e20 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
15e30 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
15e40 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
15e50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15e60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
15e70 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
15e80 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
15e90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ea0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
15eb0 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
15ec0 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
15ef0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
15f00 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
15f10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15f20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
15f30 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
15f40 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
15f50 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
15f60 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
15f70 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
15f80 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
15f90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
15fa0 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
15fb0 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  f( pParse->ckBas
15fc0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
15fd0 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
15fe0 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
15ff0 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
16000 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
16010 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
16020 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
16030 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
16040 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  kBase;.         
16050 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16070 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72 6f   /* Deleting fro
16080 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  m a partial inde
16090 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  x */.          i
160a0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 50  Tab = pParse->iP
160b0 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20 20  artIdxTab;.     
160c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
160d0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
160e0 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
160f0 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  umn(pParse, pExp
16100 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20  r->pTab,.       
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
16130 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61  Column, iTab, ta
16140 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  rget,.          
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29       pExpr->op2)
16170 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16180 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
16190 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
161a0 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50    codeInteger(pP
161b0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
161c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
161d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
161e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
161f0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
16200 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
16210 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
16220 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
16230 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
16240 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
16250 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70  codeReal(v, pExp
16260 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20  r->u.zToken, 0, 
16270 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
16280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16290 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
162a0 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61  TRING: {.      a
162b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
162c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
162d0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
162e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
162f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72  AddOp4(v, OP_Str
16300 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c  ing8, 0, target,
16310 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
16320 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  ken, 0);.      b
16330 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16340 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
16350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16360 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
16370 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
16380 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16390 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
163a0 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
163b0 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  RAL.    case TK_
163c0 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e  BLOB: {.      in
163d0 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t n;.      const
163e0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
163f0 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20  char *zBlob;.   
16400 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
16410 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
16420 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
16430 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16440 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16450 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70  [0]=='x' || pExp
16460 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
16470 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'X' );.      ass
16480 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
16490 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b  oken[1]=='\'' );
164a0 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70  .      z = &pExp
164b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a  r->u.zToken[2];.
164c0 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
164d0 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31  3Strlen30(z) - 1
164e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
164f0 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20  z[n]=='\'' );.  
16500 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69      zBlob = sqli
16510 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c  te3HexToBlob(sql
16520 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a  ite3VdbeDb(v), z
16530 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , n);.      sqli
16540 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16550 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74   OP_Blob, n/2, t
16560 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c  arget, 0, zBlob,
16570 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
16580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16590 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
165a0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
165b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
165c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
165d0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
165e0 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e) );.      asse
165f0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
16600 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ken!=0 );.      
16610 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16620 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b  .zToken[0]!=0 );
16630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16640 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56  beAddOp2(v, OP_V
16650 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
16660 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  iColumn, target)
16670 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
16680 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d  r->u.zToken[1]!=
16690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
166a0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
166b0 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20  oken[0]=='?' .  
166c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74             || st
166d0 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54  rcmp(pExpr->u.zT
166e0 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a  oken, pParse->az
166f0 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  Var[pExpr->iColu
16700 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20  mn-1])==0 );.   
16710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16720 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
16730 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45  pParse->azVar[pE
16740 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c  xpr->iColumn-1],
16750 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
16760 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
16770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16780 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a   TK_REGISTER: {.
16790 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45        inReg = pE
167a0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
167b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
167c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20      case TK_AS: 
167d0 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
167e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
167f0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
16800 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67  xpr->pLeft, targ
16810 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
16820 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
16830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
16840 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
16850 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  T: {.      /* Ex
16860 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65  pressions of the
16870 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c   form:   CAST(pL
16880 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f  eft AS token) */
16890 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
168a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
168b0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
168c0 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
168d0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  t);.      if( in
168e0 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20  Reg!=target ){. 
168f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16900 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
16910 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
16920 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  get);.        in
16930 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20  Reg = target;.  
16940 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
16950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16960 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74   OP_Cast, target
16970 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16980 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16990 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45  3AffinityType(pE
169a0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
169b0 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ));.      testca
169c0 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  se( usedAsColumn
169d0 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e  Cache(pParse, in
169e0 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20  Reg, inReg) );. 
169f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
16a00 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
16a10 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  nge(pParse, inRe
16a20 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  g, 1);.      bre
16a30 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16a40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16a50 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65  CAST */.    case
16a60 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
16a70 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
16a80 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
16a90 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
16aa0 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
16ab0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
16ac0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
16ad0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16ae0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
16af0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
16b00 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16b10 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16b20 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
16b30 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
16b40 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
16b50 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16b60 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
16b70 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
16b80 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
16b90 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f  , inReg, SQLITE_
16ba0 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20  STOREP2);.      
16bb0 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
16bc0 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
16bd0 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
16be0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
16bf0 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
16c00 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
16c10 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
16c20 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
16c30 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
16c40 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
16c50 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
16c60 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
16c70 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
16c80 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
16c90 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
16ca0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
16cb0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
16cc0 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
16cd0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
16ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
16cf0 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
16d00 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
16d10 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
16d20 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
16d30 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
16d40 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
16d50 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
16d60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16d70 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
16d80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16d90 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
16da0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16db0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16dc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16dd0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
16de0 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
16df0 3a 20 7b 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 20 29 3b  se( op==TK_IS );
16e10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16e20 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b   op==TK_ISNOT );
16e30 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
16e40 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16e50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16e60 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
16e70 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
16e80 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16e90 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16ea0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
16eb0 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
16ec0 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f  op==TK_IS) ? TK_
16ed0 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20  EQ : TK_NE;.    
16ee0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16ef0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16f00 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
16f10 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
16f20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16f30 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
16f40 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f  TOREP2 | SQLITE_
16f50 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56  NULLEQ);.      V
16f60 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16f70 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20   op==TK_EQ);.   
16f80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
16f90 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b  f(v, op==TK_NE);
16fa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16fb0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16fd0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
16fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ff0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
17000 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
17010 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
17020 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
17030 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
17040 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
17050 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
17060 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
17070 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
17080 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
17090 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
170a0 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
170b0 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20  e TK_RSHIFT: .  
170c0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
170d0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
170e0 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64  ( TK_AND==OP_And
170f0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74   );            t
17100 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17110 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
17120 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f  ert( TK_OR==OP_O
17130 72 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  r );            
17140 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17150 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  TK_OR );.      a
17160 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d  ssert( TK_PLUS==
17170 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20  OP_Add );       
17180 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17190 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20  ==TK_PLUS );.   
171a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
171b0 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
171c0 20 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65   );     testcase
171d0 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29  ( op==TK_MINUS )
171e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
171f0 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69  TK_REM==OP_Remai
17200 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73  nder );      tes
17210 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45  tcase( op==TK_RE
17220 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
17230 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
17240 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20  _BitAnd );      
17250 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17260 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20  _BITAND );.     
17270 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
17280 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20  R==OP_BitOr );  
17290 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
172a0 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a  op==TK_BITOR );.
172b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
172c0 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
172d0 65 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63  e );       testc
172e0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53  ase( op==TK_SLAS
172f0 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  H );.      asser
17300 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
17310 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20  _ShiftLeft );   
17320 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17330 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20  _LSHIFT );.     
17340 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49   assert( TK_RSHI
17350 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68  FT==OP_ShiftRigh
17360 74 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20  t );  testcase( 
17370 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b  op==TK_RSHIFT );
17380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17390 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
173a0 63 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74  cat );      test
173b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e  case( op==TK_CON
173c0 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  CAT );.      r1 
173d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
173e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
173f0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
17400 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
17410 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
17420 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
17430 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
17440 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
17450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17460 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c  3(v, op, r2, r1,
17470 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17480 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17490 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
174a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
174b0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
174c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
174d0 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
174e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
174f0 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
17500 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
17510 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20   pLeft );.      
17520 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
17530 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  K_INTEGER ){.   
17540 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
17550 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
17560 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e  1, target);.#ifn
17570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17580 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
17590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
175a0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
175b0 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  AT ){.        as
175c0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
175d0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
175e0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
175f0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
17600 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  , pLeft->u.zToke
17610 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23  n, 1, target);.#
17620 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
17630 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  e{.        tempX
17640 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52  .op = TK_INTEGER
17650 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
17660 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61  flags = EP_IntVa
17670 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  lue|EP_TokenOnly
17680 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  ;.        tempX.
17690 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20  u.iValue = 0;.  
176a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
176b0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
176c0 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26  Parse, &tempX, &
176d0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
176e0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
176f0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17700 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17710 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
17720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17730 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75  eAddOp3(v, OP_Su
17740 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20  btract, r2, r1, 
17750 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
17760 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17770 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
17780 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
17790 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72  target;.      br
177a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
177b0 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
177c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
177d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
177e0 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
177f0 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61  tNot );   testca
17800 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f  se( op==TK_BITNO
17810 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
17820 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f  t( TK_NOT==OP_No
17830 74 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73  t );         tes
17840 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
17850 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
17860 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
17870 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
17880 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
17890 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ee1);.      test
178a0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
178b0 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67  0 );.      inReg
178c0 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20   = target;.     
178d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
178e0 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e  p2(v, op, r1, in
178f0 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Reg);.      brea
17900 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17910 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
17920 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
17930 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
17940 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dr;.      assert
17950 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
17960 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
17970 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
17980 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
17990 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
179a0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
179b0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
179c0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
179d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
179e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
179f0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
17a00 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
17a10 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17a20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17a30 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
17a40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17a50 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
17a60 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
17a70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17a80 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56  op, r1);.      V
17a90 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17aa0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
17ab0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
17ac0 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
17ad0 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
17ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17af0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17b00 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
17b10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17b20 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
17b30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17b40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
17b50 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
17b60 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
17b70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41  Info = pExpr->pA
17b80 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66  ggInfo;.      if
17b90 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  ( pInfo==0 ){.  
17ba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
17bb0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
17bc0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
17bd0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e) );.        sq
17be0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17bf0 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
17c00 20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29   aggregate: %s()
17c10 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
17c20 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
17c30 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  {.        inReg 
17c40 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70  = pInfo->aFunc[p
17c50 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d  Expr->iAgg].iMem
17c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17c70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17c80 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
17c90 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
17ca0 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20  ist *pFarg;     
17cb0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e    /* List of fun
17cc0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
17cd0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61  */.      int nFa
17ce0 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
17cf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e  /* Number of fun
17d00 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
17d10 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
17d20 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
17d30 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
17d40 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63  definition objec
17d50 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
17d60 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
17d70 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
17d80 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
17d90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
17da0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17db0 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Id;       /* The
17dc0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
17dd0 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73  /.      u32 cons
17de0 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f  tMask = 0;     /
17df0 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69  * Mask of functi
17e00 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  on arguments tha
17e10 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a  t are constant *
17e20 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  /.      int i;  
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
17e50 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
17e60 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f   ENC(db);      /
17e70 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64  * The text encod
17e80 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73  ing used by this
17e90 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
17ea0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
17eb0 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63  l = 0;    /* A c
17ec0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
17ed0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
17ee0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
17ef0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
17f00 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
17f10 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
17f20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
17f30 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
17f40 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
17f50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17f60 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
17f70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
17f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61       }.      nFa
17f90 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61  rg = pFarg ? pFa
17fa0 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  rg->nExpr : 0;. 
17fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
17fc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17fd0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
17fe0 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
17ff0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
18000 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71  ;.      nId = sq
18010 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
18020 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
18030 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
18040 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49  tion(db, zId, nI
18050 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
18060 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
18070 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46  f==0 || pDef->xF
18080 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
18090 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
180a0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
180b0 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a  wn function: %.*
180c0 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  s()", nId, zId);
180d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
180e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
180f0 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65  * Attempt a dire
18100 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ct implementatio
18110 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69  n of the built-i
18120 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64  n COALESCE() and
18130 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c  .      ** IFNULL
18140 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  () functions.  T
18150 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63  his avoids unnec
18160 65 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f  essary evaluatio
18170 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72  n of.      ** ar
18180 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65  guments past the
18190 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20   first non-NULL 
181a0 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
181b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
181c0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
181d0 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45  QLITE_FUNC_COALE
181e0 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  SCE ){.        i
181f0 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d  nt endCoalesce =
18200 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
18210 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
18220 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e    assert( nFarg>
18230 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
18240 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
18250 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30  arse, pFarg->a[0
18260 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
18270 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
18280 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  1; i<nFarg; i++)
18290 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
182a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
182b0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72   OP_NotNull, tar
182c0 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65  get, endCoalesce
182d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
182e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
182f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18300 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
18310 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31  Parse, target, 1
18320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18330 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
18340 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
18350 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18360 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
18370 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  rg->a[i].pExpr, 
18380 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
18390 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
183a0 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
183b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
183c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
183d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
183e0 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20  Coalesce);.     
183f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18400 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
18410 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74  UNLIKELY() funct
18420 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
18430 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74   The result is t
18440 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
18450 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61  * of the first a
18460 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
18470 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
18480 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18490 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
184a0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  LY ){.        as
184b0 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29  sert( nFarg>=1 )
184c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
184d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
184e0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
184f0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
18500 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18510 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
18520 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b  i=0; i<nFarg; i+
18530 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
18540 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45  i<32 && sqlite3E
18550 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46  xprIsConstant(pF
18560 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
18570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
18580 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b  stcase( i==31 );
18590 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
185a0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33  Mask |= MASKBIT3
185b0 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  2(i);.        }.
185c0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
185d0 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
185e0 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
185f0 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c  OLL)!=0 && !pCol
18600 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
18610 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
18620 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
18630 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45  , pFarg->a[i].pE
18640 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
18650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18660 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20  ( pFarg ){.     
18670 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b     if( constMask
18680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31   ){.          r1
18690 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
186a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
186b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61  rse->nMem += nFa
186c0 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rg;.        }els
186d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  e{.          r1 
186e0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
186f0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46  Range(pParse, nF
18700 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  arg);.        }.
18710 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
18720 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70  length() and typ
18730 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  eof() functions 
18740 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72  with a column ar
18750 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  gument,.        
18760 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61  ** set the P5 pa
18770 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f  rameter to the O
18780 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20  P_Column opcode 
18790 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  to OPFLAG_LENGTH
187a0 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ARG.        ** o
187b0 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41  r OPFLAG_TYPEOFA
187c0 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  RG respectively,
187d0 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65   to avoid unnece
187e0 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20  ssary data.     
187f0 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20     ** loading.. 
18800 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18810 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
18820 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
18830 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c  _FUNC_LENGTH|SQL
18840 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29  ITE_FUNC_TYPEOF)
18850 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18860 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20    u8 exprOp;.   
18870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
18880 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Farg==1 );.     
18890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61       assert( pFa
188a0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  rg->a[0].pExpr!=
188b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65  0 );.          e
188c0 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61  xprOp = pFarg->a
188d0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  [0].pExpr->op;. 
188e0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70           if( exp
188f0 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  rOp==TK_COLUMN |
18900 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47  | exprOp==TK_AGG
18910 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
18920 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
18930 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
18940 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48  H==OPFLAG_LENGTH
18950 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
18960 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
18970 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f  E_FUNC_TYPEOF==O
18980 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20  PFLAG_TYPEOFARG 
18990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
189a0 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66  estcase( pDef->f
189b0 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41  uncFlags & OPFLA
189c0 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
189d0 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67             pFarg
189e0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
189f0 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 = .           
18a00 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e         pDef->fun
18a10 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47  cFlags & (OPFLAG
18a20 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41  _LENGTHARG|OPFLA
18a30 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
18a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18a50 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c    }..        sql
18a60 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
18a70 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  h(pParse);     /
18a80 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35  * Ticket 2ea2425
18a90 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20  d34be */.       
18aa0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18ab0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
18ac0 20 70 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20   pFarg, r1,.    
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18af0 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49  TE_ECEL_DUP|SQLI
18b00 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b  TE_ECEL_FACTOR);
18b10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18b20 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
18b30 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69  rse);      /* Ti
18b40 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
18b50 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  e */.      }else
18b60 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30  {.        r1 = 0
18b70 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
18b80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18b90 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
18ba0 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65   /* Possibly ove
18bb0 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69  rload the functi
18bc0 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20  on if the first 
18bd0 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20  argument is.    
18be0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74    ** a virtual t
18bf0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20  able column..   
18c00 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
18c10 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  or infix functio
18c20 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20  ns (LIKE, GLOB, 
18c30 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43  REGEXP, and MATC
18c40 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  H) use the.     
18c50 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d   ** second argum
18c60 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72  ent, not the fir
18c70 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d  st, as the argum
18c80 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20  ent to test to. 
18c90 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69       ** see if i
18ca0 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
18cb0 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
18cc0 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  .  This is done 
18cd0 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
18ce0 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
18cf0 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74  d of infix funct
18d00 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e  ions (the operan
18d10 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20  d we want to.   
18d20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76     ** control ov
18d30 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20  erloading) ends 
18d40 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  up as the second
18d50 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
18d60 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
18d70 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  on.  The express
18d80 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69  ion "A glob B" i
18d90 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
18da0 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28  .      ** "glob(
18db0 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74  B,A).  We want t
18dc0 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22  o use the A in "
18dd0 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73  A glob B" to tes
18de0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66  t.      ** for f
18df0 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64  unction overload
18e00 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65  ing.  But we use
18e10 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22   the B term in "
18e20 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20  glob(B,A)"..    
18e30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
18e40 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70  Farg>=2 && (pExp
18e50 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
18e60 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  fixFunc) ){.    
18e70 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
18e80 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75  e3VtabOverloadFu
18e90 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c  nction(db, pDef,
18ea0 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61   nFarg, pFarg->a
18eb0 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
18ec0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72    }else if( nFar
18ed0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
18ee0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
18ef0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
18f00 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
18f10 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  g, pFarg->a[0].p
18f20 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  Expr);.      }.#
18f30 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
18f40 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
18f50 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
18f60 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
18f70 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
18f80 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
18f90 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73  Coll; .        s
18fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
18fb0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
18fc0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  0, 0, 0, (char *
18fd0 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
18fe0 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
18ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19000 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74  dOp4(v, OP_Funct
19010 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20  ion, constMask, 
19020 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20  r1, target,.    
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19040 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c      (char*)pDef,
19050 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
19060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19070 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
19080 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  Farg);.      if(
19090 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d   nFarg && constM
190a0 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ask==0 ){.      
190b0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
190c0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
190d0 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20  , r1, nFarg);.  
190e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
190f0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
19100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
19110 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
19120 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
19130 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
19140 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19150 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
19160 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19170 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
19180 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  ;.      inReg = 
19190 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
191a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
191b0 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  pr, 0, 0);.     
191c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
191d0 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
191e0 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
191f0 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
19200 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19210 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
19220 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  fNull = sqlite3V
19230 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19250 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
19260 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
19270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
19280 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
19290 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
192a0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
192b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
192c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
192d0 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67  Integer, 1, targ
192e0 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
192f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19300 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
19310 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
19320 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19330 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74  P_AddImm, target
19340 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
19350 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
19360 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
19370 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
19380 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
19390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
193a0 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f  QUERY */...    /
193b0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45  *.    **    x BE
193c0 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20  TWEEN y AND z.  
193d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
193e0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
193f0 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  o.    **.    ** 
19400 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
19410 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
19420 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
19430 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20  xpr->pLeft..    
19440 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69  ** Y is stored i
19450 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
19460 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[0].pExpr..    
19470 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69  ** Z is stored i
19480 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  n pExpr->pList->
19490 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20  a[1].pExpr..    
194a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  */.    case TK_B
194b0 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
194c0 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
194d0 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
194e0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
194f0 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d  t_item *pLItem =
19500 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
19510 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
19520 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
19530 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72  >pExpr;..      r
19540 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
19550 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
19560 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
19570 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
19580 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
19590 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  p(pParse, pRight
195a0 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
195b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
195c0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
195d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
195e0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
195f0 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65    r3 = sqlite3Ge
19600 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
19610 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c  ;.      r4 = sql
19620 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
19630 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f  Parse);.      co
19640 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
19650 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
19660 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20   OP_Ge,.        
19670 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
19680 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f  , r3, SQLITE_STO
19690 52 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65  REP2);  VdbeCove
196a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70  rage(v);.      p
196b0 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
196c0 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
196d0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
196e0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
196f0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
19700 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee2);.      r2 =
19710 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
19720 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69  Temp(pParse, pRi
19730 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
19740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19750 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
19760 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
19770 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
19780 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
19790 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49  r1, r2, r4, SQLI
197a0 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20  TE_STOREP2);.   
197b0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
197c0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
197d0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
197e0 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74  P_And, r3, r4, t
197f0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
19800 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19810 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b  Reg(pParse, r3);
19820 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
19830 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
19840 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20  rse, r4);.      
19850 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19860 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45   case TK_COLLATE
19870 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  : .    case TK_U
19880 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  PLUS: {.      in
19890 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
198a0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
198b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
198c0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
198d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
198e0 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
198f0 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
19900 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
19910 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
19920 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
19930 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
19940 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
19950 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
19960 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
19970 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
19980 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
19990 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
199a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
199b0 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
199c0 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
199d0 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
199e0 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
199f0 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
19a00 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
19a10 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
19a20 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
19a30 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
19a40 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
19a50 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
19a60 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
19a70 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
19a80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19a90 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
19aa0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
19ab0 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20  ing an OP_Param 
19ac0 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20  opcode. The p1. 
19ad0 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65       ** paramete
19ae0 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f  r is set to 0 fo
19af0 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72  r an old.rowid r
19b00 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20  eference, or to 
19b10 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74  (i+1).      ** t
19b20 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74  o reference anot
19b30 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  her column of th
19b40 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
19b50 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20  able, where .   
19b60 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69     ** i is the i
19b70 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
19b80 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f  mn. For a new.ro
19b90 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70  wid reference, p
19ba0 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65  1 is.      ** se
19bb0 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72  t to (n+1), wher
19bc0 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e n is the numbe
19bd0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
19be0 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c  each pseudo-tabl
19bf0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  e..      ** For 
19c00 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
19c10 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20  ny other column 
19c20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65  in the new.* pse
19c30 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20  udo-table, p1.  
19c40 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f      ** is set to
19c50 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20   (n+2+i), where 
19c60 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64  n and i are as d
19c70 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c  efined previousl
19c80 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20  y. For.      ** 
19c90 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
19ca0 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74  table on which t
19cb0 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e  riggers are bein
19cc0 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20  g fired is.     
19cd0 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a   ** declared as:
19ce0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19cf0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
19d00 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
19d10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
19d20 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72  en p1 is interpr
19d30 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
19d40 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19d50 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20  **   p1==0   -> 
19d60 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20     old.rowid    
19d70 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e   p1==3   ->    n
19d80 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a  ew.rowid.      *
19d90 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20  *   p1==1   ->  
19da0 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20    old.a         
19db0 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65  p1==4   ->    ne
19dc0 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  w.a.      **   p
19dd0 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==2   ->    old
19de0 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35  .b         p1==5
19df0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20     ->    new.b  
19e00 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20       .      */. 
19e10 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
19e20 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
19e30 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70        int p1 = p
19e40 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28  Expr->iTable * (
19e50 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20  pTab->nCol+1) + 
19e60 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  1 + pExpr->iColu
19e70 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  mn;..      asser
19e80 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t( pExpr->iTable
19e90 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  ==0 || pExpr->iT
19ea0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
19eb0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
19ec0 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70  iColumn>=-1 && p
19ed0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54  Expr->iColumn<pT
19ee0 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  ab->nCol );.    
19ef0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
19f00 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72  iPKey<0 || pExpr
19f10 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d  ->iColumn!=pTab-
19f20 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  >iPKey );.      
19f30 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26  assert( p1>=0 &&
19f40 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a   p1<(pTab->nCol*
19f50 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73  2+2) );..      s
19f60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19f70 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31  (v, OP_Param, p1
19f80 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
19f90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
19fa0 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c   "%s.%s -> $%d",
19fb0 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d  .        (pExpr-
19fc0 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20  >iTable ? "new" 
19fd0 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20  : "old"),.      
19fe0 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d    (pExpr->iColum
19ff0 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20  n<0 ? "rowid" : 
1a000 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f  pExpr->pTab->aCo
1a010 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  l[pExpr->iColumn
1a020 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ].zName),.      
1a030 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29    target.      )
1a040 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1a050 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1a060 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20  _POINT.      /* 
1a070 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  If the column ha
1a080 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  s REAL affinity,
1a090 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c   it may currentl
1a0a0 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
1a0b0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  n.      ** integ
1a0c0 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41  er. Use OP_RealA
1a0d0 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  ffinity to make 
1a0e0 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c  sure it is reall
1a0f0 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  y real..      **
1a100 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
1a110 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35  CE-OF: R-60985-5
1a120 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c  7662 SQLite will
1a130 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c   convert the val
1a140 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20  ue back to.     
1a150 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69   ** floating poi
1a160 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69  nt when extracti
1a170 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72  ng it from the r
1a180 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20  ecord.  */.     
1a190 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
1a1a0 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
1a1b0 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  & pTab->aCol[pEx
1a1c0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66  pr->iColumn].aff
1a1d0 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
1a1e0 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a  F_REAL.      ){.
1a1f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1a200 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1a210 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61  RealAffinity, ta
1a220 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  rget);.      }.#
1a230 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1a240 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1a250 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a  *.    ** Form A:
1a260 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78  .    **   CASE x
1a270 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31   WHEN e1 THEN r1
1a280 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32   WHEN e2 THEN r2
1a290 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45   ... WHEN eN THE
1a2a0 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a  N rN ELSE y END.
1a2b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f      **.    ** Fo
1a2c0 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43  rm B:.    **   C
1a2d0 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e  ASE WHEN e1 THEN
1a2e0 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e   r1 WHEN e2 THEN
1a2f0 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20   r2 ... WHEN eN 
1a300 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45  THEN rN ELSE y E
1a310 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ND.    **.    **
1a320 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62   Form A is can b
1a330 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  e transformed in
1a340 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  to the equivalen
1a350 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c  t form B as foll
1a360 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  ows:.    **   CA
1a370 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45  SE WHEN x=e1 THE
1a380 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54  N r1 WHEN x=e2 T
1a390 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a  HEN r2 ....    *
1a3a0 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d  *        WHEN x=
1a3b0 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20  eN THEN rN ELSE 
1a3c0 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20  y END.    **.   
1a3d0 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69   ** X (if it exi
1a3e0 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72  sts) is in pExpr
1a3f0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
1a400 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74  Y is in the last
1a410 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70   element of pExp
1a420 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45  r->x.pList if pE
1a430 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
1a440 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64  xpr is.    ** od
1a450 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73  d.  The Y is als
1a460 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20  o optional.  If 
1a470 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1a480 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73  ements in x.pLis
1a490 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e  t.    ** is even
1a4a0 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74  , then Y is omit
1a4b0 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68  ted and the "oth
1a4c0 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69  erwise" result i
1a4d0 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45  s NULL..    ** E
1a4e0 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70  i is in pExpr->p
1a4f0 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64  List->a[i*2] and
1a500 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c   Ri is pExpr->pL
1a510 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20  ist->a[i*2+1].. 
1a520 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1a530 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65   result of the e
1a540 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
1a550 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73   Ri for the firs
1a560 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20  t matching Ei,. 
1a570 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72     ** or if ther
1a580 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67  e is no matching
1a590 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65   Ei, the ELSE te
1a5a0 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72  rm Y, or if ther
1a5b0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45  e is.    ** no E
1a5c0 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a  LSE term, NULL..
1a5d0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
1a5e0 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  lt: assert( op==
1a5f0 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20  TK_CASE ); {.   
1a600 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b     int endLabel;
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
1a630 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41  el for end of CA
1a640 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20  SE stmt */.     
1a650 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20   int nextCase;  
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
1a680 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63   for next WHEN c
1a690 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
1a6a0 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20  nt nExpr;       
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66   /* 2x number of
1a6d0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
1a6e0 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1a710 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
1a720 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
1a730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a740 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45    /* List of WHE
1a750 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1a760 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a770 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d  _item *aListelem
1a780 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57  ;  /* Array of W
1a790 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
1a7a0 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72     Expr opCompar
1a7b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45       /* The X==E
1a7d0 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  i expression */.
1a7e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58          /* The X
1a810 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1a820 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74       Expr *pTest
1a830 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1a840 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20         /* X==Ei 
1a850 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74  (form A) or just
1a860 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a   Ei (form B) */.
1a870 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20        VVA_ONLY( 
1a880 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20  int iCacheLevel 
1a890 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
1a8a0 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20  Level; )..      
1a8b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1a8c0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1a8d0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26  EP_xIsSelect) &&
1a8e0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
1a8f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a900 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1a910 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
1a920 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
1a930 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
1a940 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c   aListelem = pEL
1a950 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45  ist->a;.      nE
1a960 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  xpr = pEList->nE
1a970 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61  xpr;.      endLa
1a980 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
1a990 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1a9a0 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70       if( (pX = p
1a9b0 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20  Expr->pLeft)!=0 
1a9c0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58  ){.        tempX
1a9d0 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20   = *pX;.        
1a9e0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70  testcase( pX->op
1a9f0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
1aa00 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67         exprToReg
1aa10 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71  ister(&tempX, sq
1aa20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1aa30 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72  p(pParse, pX, &r
1aa40 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20  egFree1));.     
1aa50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1aa60 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1aa70 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70      opCompare.op
1aa80 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20   = TK_EQ;.      
1aa90 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66    opCompare.pLef
1aaa0 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20  t = &tempX;.    
1aab0 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43      pTest = &opC
1aac0 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20  ompare;.        
1aad0 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39  /* Ticket b351d9
1aae0 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62  5f9cd5ef17e9d9db
1aaf0 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30  ae18f5ca86111900
1ab00 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  01:.        ** T
1ab10 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46  he value in regF
1ab20 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53  ree1 might get S
1ab30 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65  Copy-ed into the
1ab40 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20   file result..  
1ab50 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65        ** So make
1ab60 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
1ab70 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72  egFree1 register
1ab80 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66   is not reused f
1ab90 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20  or other.       
1aba0 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64   ** purposes and
1abb0 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72   possibly overwr
1abc0 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20  itten.  */.     
1abd0 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b     regFree1 = 0;
1abe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1abf0 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d  or(i=0; i<nExpr-
1ac00 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20  1; i=i+2){.     
1ac10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ac20 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1ac30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20  .        if( pX 
1ac40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1ac50 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b  ert( pTest!=0 );
1ac60 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d  .          opCom
1ac70 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c  pare.pRight = aL
1ac80 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
1ac90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1aca0 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74  .          pTest
1acb0 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e   = aListelem[i].
1acc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d  pExpr;.        }
1acd0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73  .        nextCas
1ace0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
1acf0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1ad00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1ad10 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Test->op==TK_COL
1ad20 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
1ad30 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1ad40 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c  e(pParse, pTest,
1ad50 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54   nextCase, SQLIT
1ad60 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1ad70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ad80 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e   aListelem[i+1].
1ad90 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1ada0 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
1adb0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1adc0 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
1add0 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61  m[i+1].pExpr, ta
1ade0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73  rget);.        s
1adf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ae00 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1ae10 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
1ae20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1ae30 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1ae40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ae50 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ae60 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
1ae70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ae80 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
1ae90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1aea0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1aeb0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
1aec0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1aed0 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
1aee0 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20  nExpr-1].pExpr, 
1aef0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1af00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1af10 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1af20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1af30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1af40 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1af50 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1af60 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1af70 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1af80 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
1af90 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20  Err>0 .         
1afa0 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61    || pParse->iCa
1afb0 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65  cheLevel==iCache
1afc0 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73  Level );.      s
1afd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1afe0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62  eLabel(v, endLab
1aff0 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
1b000 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1b010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1b020 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1b030 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61  RAISE: {.      a
1b040 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
1b050 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
1b060 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
1b070 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
1b080 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20  ty==OE_Abort.   
1b090 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
1b0a0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46  ->affinity==OE_F
1b0b0 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ail.           |
1b0c0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1b0d0 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  y==OE_Ignore.   
1b0e0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
1b0f0 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
1b100 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
1b110 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1b120 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b140 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
1b150 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
1b160 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
1b170 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
1b180 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1b190 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1b1a0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
1b1b0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
1b1c0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
1b1d0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
1b1e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1b1f0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1b200 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1b210 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1b220 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1b230 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
1b240 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b250 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
1b260 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
1b270 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
1b280 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
1b290 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
1b2a0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1b2b0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
1b2c0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1b2d0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
1b2e0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1b2f0 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
1b300 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
1b330 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
1b340 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  en, 0, 0);.     
1b350 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
1b360 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1b370 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1b380 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1b390 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1b3a0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1b3b0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1b3c0 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
1b3d0 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
1b3e0 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20   Factor out the 
1b3f0 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65  code of the give
1b400 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1b410 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1b420 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1b430 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1b440 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  it(.  Parse *pPa
1b450 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1b460 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1b470 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1b480 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1b490 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e  ion to code when
1b4a0 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61   the VDBE initia
1b4b0 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  lizes */.  int r
1b4c0 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  egDest,      /* 
1b4d0 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
1b4e0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1b4f0 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c   */.  u8 reusabl
1b500 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  e       /* True 
1b510 69 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69  if this expressi
1b520 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a  on is reusable *
1b530 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
1b540 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
1b550 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1b560 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
1b570 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
1b580 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
1b590 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
1b5a0 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
1b5b0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1b5c0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1b5d0 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
1b5e0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1b5f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1b600 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1b610 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
1b620 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
1b630 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
1b640 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74  egDest;.     pIt
1b650 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
1b660 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70  eusable;.  }.  p
1b670 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1b680 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = p;.}../*.** 
1b690 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b6a0 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
1b6b0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
1b6c0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1b6d0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
1b6e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1b6f0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
1b700 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
1b710 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
1b720 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
1b730 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1b740 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
1b750 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
1b760 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
1b770 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
1b780 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
1b790 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
1b7a0 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
1b7b0 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
1b7c0 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
1b7d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
1b7e0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20   is a constant, 
1b7f0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1b800 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65  e might generate
1b810 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f   this.** code to
1b820 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74   fill the regist
1b830 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61  er in the initia
1b840 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e  lization section
1b850 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   of the.** VDBE 
1b860 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65  program, in orde
1b870 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f  r to factor it o
1b880 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61  ut of the evalua
1b890 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e  tion loop..*/.in
1b8a0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1b8b0 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
1b8c0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1b8d0 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
1b8e0 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20  int r2;.  pExpr 
1b8f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1b900 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
1b910 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74  .  if( ConstFact
1b920 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20  orOk(pParse).   
1b930 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
1b940 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20  _REGISTER.   && 
1b950 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1b960 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
1b970 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  pr).  ){.    Exp
1b980 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73  rList *p = pPars
1b990 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
1b9a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70     int i;.    *p
1b9b0 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66  Reg  = 0;.    if
1b9c0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ( p ){.      str
1b9d0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1b9e0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
1b9f0 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
1ba00 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
1ba10 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
1ba20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1ba30 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73  m->reusable && s
1ba40 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1ba50 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  e(pItem->pExpr,p
1ba60 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
1ba70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ba80 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
1ba90 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20  xprReg;.        
1baa0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bab0 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73      r2 = ++pPars
1bac0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1bad0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1bae0 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1baf0 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  , r2, 1);.  }els
1bb00 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
1bb10 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1bb20 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
1bb30 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1bb40 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1bb50 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
1bb60 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
1bb70 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
1bb80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bb90 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1bba0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1bbb0 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
1bbc0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
1bbd0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
1bbe0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1bbf0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1bc00 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1bc10 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1bc20 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1bc30 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
1bc40 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1bc50 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
1bc60 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
1bc70 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1bc80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1bc90 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
1bca0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1bcb0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1bcc0 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
1bcd0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1bce0 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
1bcf0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
1bd00 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
1bd10 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
1bd20 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
1bd30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1bd40 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1bd50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
1bd60 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
1bd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
1bd80 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1bd90 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1bda0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
1bdb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1bdc0 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70  arse->pVdbe || p
1bdd0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1bde0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
1bdf0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1be00 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
1be10 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1be20 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1be30 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
1be40 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1be50 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
1be60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1be70 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1be80 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
1be90 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
1bea0 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
1beb0 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1bec0 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1bed0 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
1bee0 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
1bef0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1bf00 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70  get.  If the exp
1bf10 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
1bf20 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ant, then this r
1bf30 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
1bf40 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74  choose to code t
1bf50 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  he expression at
1bf60 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1bf70 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1bf80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63  lite3ExprCodeFac
1bf90 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70  torable(Parse *p
1bfa0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1bfb0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1bfc0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
1bfd0 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20  kConstFactor && 
1bfe0 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1bff0 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
1c000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1c010 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65  odeAtInit(pParse
1c020 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c  , pExpr, target,
1c030 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
1c040 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c050 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
1c060 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a   target);.  }.}.
1c070 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c080 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
1c090 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78  tes the given ex
1c0a0 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74  pression and put
1c0b0 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
1c0c0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1c0d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d  et..**.** Also m
1c0e0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
1c0f0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73  e expression res
1c100 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65  ults into anothe
1c110 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74  r "cache" regist
1c120 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79  er.** and modify
1c130 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1c140 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
1c150 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c   time it is eval
1c160 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65  uated,.** the re
1c170 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f  sult is a copy o
1c180 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69  f the cache regi
1c190 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ster..**.** This
1c1a0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1c1b0 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73   for expressions
1c1c0 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d   that are used m
1c1d0 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65  ultiple .** time
1c1e0 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61  s.  They are eva
1c1f0 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20  luated once and 
1c200 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
1c210 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
1c220 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a   are reused..*/.
1c230 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1c240 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
1c250 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1c260 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1c270 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  get){.  Vdbe *v 
1c280 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1c290 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20  .  int iMem;..  
1c2a0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1c2b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1c2c0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49  xpr->op!=TK_REGI
1c2d0 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65  STER );.  sqlite
1c2e0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1c2f0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
1c300 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  ;.  iMem = ++pPa
1c310 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
1c320 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1c330 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65  , OP_Copy, targe
1c340 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72  t, iMem);.  expr
1c350 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72  ToRegister(pExpr
1c360 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 64  , iMem);.}..#ifd
1c370 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c380 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1c390 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
1c3a0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
1c3b0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1c3c0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1c3d0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 54  e3TreeViewExpr(T
1c3e0 72 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20  reeView *pView, 
1c3f0 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70  const Expr *pExp
1c400 72 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c  r, u8 moreToFoll
1c410 6f 77 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ow){.  const cha
1c420 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20  r *zBinOp = 0;  
1c430 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61   /* Binary opera
1c440 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tor */.  const c
1c450 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b  har *zUniOp = 0;
1c460 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72     /* Unary oper
1c470 61 74 6f 72 20 2a 2f 0a 20 20 70 56 69 65 77 20  ator */.  pView 
1c480 3d 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65  = sqlite3TreeVie
1c490 77 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72  wPush(pView, mor
1c4a0 65 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66  eToFollow);.  if
1c4b0 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ( pExpr==0 ){.  
1c4c0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1c4d0 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 6e 69  wLine(pView, "ni
1c4e0 6c 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  l");.    sqlite3
1c4f0 54 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65  TreeViewPop(pVie
1c500 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  w);.    return;.
1c510 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
1c520 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
1c530 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
1c540 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
1c550 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c560 56 69 65 77 2c 20 22 41 47 47 7b 25 64 3a 25 64  View, "AGG{%d:%d
1c570 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  }",.            
1c580 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70  pExpr->iTable, p
1c590 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a  Expr->iColumn);.
1c5a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c5b0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
1c5c0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
1c5d0 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
1c5e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
1c5f0 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
1c600 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63  ns when coding c
1c610 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73  heck constraints
1c620 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
1c630 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1c640 70 56 69 65 77 2c 20 22 43 4f 4c 55 4d 4e 28 25  pView, "COLUMN(%
1c650 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  d)", pExpr->iCol
1c660 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
1c670 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1c680 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c690 56 69 65 77 2c 20 22 7b 25 64 3a 25 64 7d 22 2c  View, "{%d:%d}",
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1c6c0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
1c6d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1c6e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1c6f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c700 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
1c710 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1c720 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
1c730 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  alue ){.        
1c740 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1c750 69 6e 65 28 70 56 69 65 77 2c 20 22 25 64 22 2c  ine(pView, "%d",
1c760 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
1c770 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1c780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
1c790 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1c7a0 77 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e  w, "%s", pExpr->
1c7b0 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1c7c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
1c7d0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1c7e0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
1c7f0 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73  NG_POINT.    cas
1c800 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20  e TK_FLOAT: {.  
1c810 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1c820 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 25  iewLine(pView,"%
1c830 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  s", pExpr->u.zTo
1c840 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
1c850 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1c860 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
1c870 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG: {.      sqli
1c880 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1c890 70 56 69 65 77 2c 22 25 51 22 2c 20 70 45 78 70  pView,"%Q", pExp
1c8a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c8b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c8c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
1c8d0 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
1c8e0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c8f0 56 69 65 77 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  View,"NULL");.  
1c900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c920 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
1c930 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
1c940 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OB: {.      sqli
1c950 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1c960 70 56 69 65 77 2c 22 25 73 22 2c 20 70 45 78 70  pView,"%s", pExp
1c970 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c990 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1c9a0 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
1c9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1c9c0 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1c9d0 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29  "VARIABLE(%s,%d)
1c9e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1ca00 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45  pr->u.zToken, pE
1ca10 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1ca20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ca30 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
1ca40 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
1ca50 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1ca60 69 6e 65 28 70 56 69 65 77 2c 22 52 45 47 49 53  ine(pView,"REGIS
1ca70 54 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d  TER(%d)", pExpr-
1ca80 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
1ca90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1caa0 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20   case TK_AS: {. 
1cab0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1cac0 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
1cad0 41 53 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  AS %Q", pExpr->u
1cae0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1caf0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1cb00 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72  xpr(pView, pExpr
1cb10 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
1cb20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cb30 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
1cb40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
1cb50 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1cb60 77 2c 22 49 44 20 25 51 22 2c 20 70 45 78 70 72  w,"ID %Q", pExpr
1cb70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1cb80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cb90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cba0 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73  MIT_CAST.    cas
1cbb0 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20  e TK_CAST: {.   
1cbc0 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
1cbd0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
1cbe0 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74   CAST(pLeft AS t
1cbf0 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73  oken) */.      s
1cc00 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1cc10 6e 65 28 70 56 69 65 77 2c 22 43 41 53 54 20 25  ne(pView,"CAST %
1cc20 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1cc30 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
1cc40 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1cc50 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
1cc60 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  eft, 0);.      b
1cc70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1cc80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1cc90 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1cca0 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
1ccb0 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20  BinOp = "LT";   
1ccc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1ccd0 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42  e TK_LE:      zB
1cce0 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20  inOp = "LE";    
1ccf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cd00 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69   TK_GT:      zBi
1cd10 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  nOp = "GT";     
1cd20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cd30 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GE:      zBin
1cd40 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62  Op = "GE";     b
1cd50 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1cd60 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_NE:      zBinO
1cd70 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72  p = "NE";     br
1cd80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1cd90 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _EQ:      zBinOp
1cda0 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65   = "EQ";     bre
1cdb0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1cdc0 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  IS:      zBinOp 
1cdd0 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61  = "IS";     brea
1cde0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1cdf0 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  SNOT:   zBinOp =
1ce00 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b   "ISNOT";  break
1ce10 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
1ce20 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  D:     zBinOp = 
1ce30 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "AND";    break;
1ce40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1ce50 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1ce60 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OR";     break;.
1ce70 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1ce80 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41  :    zBinOp = "A
1ce90 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  DD";    break;. 
1cea0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1ceb0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55      zBinOp = "MU
1cec0 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
1ced0 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1cee0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42     zBinOp = "SUB
1cef0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1cf00 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
1cf10 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22    zBinOp = "REM"
1cf20 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1cf30 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
1cf40 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e   zBinOp = "BITAN
1cf50 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
1cf60 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
1cf70 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22  zBinOp = "BITOR"
1cf80 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1cf90 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
1cfa0 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20  BinOp = "DIV";  
1cfb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cfc0 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42  e TK_LSHIFT:  zB
1cfd0 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b  inOp = "LSHIFT";
1cfe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cff0 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69   TK_RSHIFT:  zBi
1d000 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  nOp = "RSHIFT"; 
1d010 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d020 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e  TK_CONCAT:  zBin
1d030 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62  Op = "CONCAT"; b
1d040 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1d050 4b 5f 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f  K_DOT:     zBinO
1d060 70 20 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72  p = "DOT";    br
1d070 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
1d080 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f  K_UMINUS:  zUniO
1d090 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72  p = "UMINUS"; br
1d0a0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1d0b0 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70  _UPLUS:   zUniOp
1d0c0 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65   = "UPLUS";  bre
1d0d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d0e0 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20  BITNOT:  zUniOp 
1d0f0 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61  = "BITNOT"; brea
1d100 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
1d110 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d  OT:     zUniOp =
1d120 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b   "NOT";    break
1d130 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1d140 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  NULL:  zUniOp = 
1d150 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  "ISNULL"; break;
1d160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
1d170 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22  NULL: zUniOp = "
1d180 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b  NOTNULL"; break;
1d190 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ..    case TK_CO
1d1a0 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73  LLATE: {.      s
1d1b0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1d1c0 6e 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 4c 41  ne(pView, "COLLA
1d1d0 54 45 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  TE %Q", pExpr->u
1d1e0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1d1f0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1d200 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72  xpr(pView, pExpr
1d210 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
1d220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
1d240 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
1d250 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
1d260 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
1d270 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
1d280 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
1d290 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
1d2a0 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1d2b0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d2c0 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
1d2d0 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
1d2e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
1d2f0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
1d300 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d310 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1d320 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1d330 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1d340 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d350 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d360 56 69 65 77 2c 20 22 41 47 47 5f 46 55 4e 43 54  View, "AGG_FUNCT
1d370 49 4f 4e 25 64 20 25 51 22 2c 0a 20 20 20 20 20  ION%d %Q",.     
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
1d3a0 70 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  p2, pExpr->u.zTo
1d3b0 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
1d3c0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1d3d0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d3e0 56 69 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e 20  View, "FUNCTION 
1d3f0 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
1d400 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oken);.      }. 
1d410 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29       if( pFarg )
1d420 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d430 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73  3TreeViewExprLis
1d440 74 28 70 56 69 65 77 2c 20 70 46 61 72 67 2c 20  t(pView, pFarg, 
1d450 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
1d460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d470 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1d480 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1d490 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
1d4a0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
1d4b0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d4c0 56 69 65 77 2c 20 22 45 58 49 53 54 53 2d 65 78  View, "EXISTS-ex
1d4d0 70 72 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pr");.      sqli
1d4e0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
1d4f0 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  t(pView, pExpr->
1d500 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  x.pSelect, 0);. 
1d510 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d520 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  }.    case TK_SE
1d530 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  LECT: {.      sq
1d540 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d550 65 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54  e(pView, "SELECT
1d560 2d 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 73  -expr");.      s
1d570 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
1d580 6c 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70  lect(pView, pExp
1d590 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29  r->x.pSelect, 0)
1d5a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d5b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1d5c0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _IN: {.      sql
1d5d0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1d5e0 28 70 56 69 65 77 2c 20 22 49 4e 22 29 3b 0a 20  (pView, "IN");. 
1d5f0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d600 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1d610 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29  pExpr->pLeft, 1)
1d620 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
1d630 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1d640 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1d650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d660 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
1d670 74 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e  t(pView, pExpr->
1d680 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  x.pSelect, 0);. 
1d690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d6a0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d6b0 69 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65  iewExprList(pVie
1d6c0 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
1d6d0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1d6e0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1d6f0 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
1d700 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1d710 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ERY */..    /*. 
1d720 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45     **    x BETWE
1d730 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a  EN y AND z.    *
1d740 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  *.    ** This is
1d750 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
1d760 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d770 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20  x>=y AND x<=z.  
1d780 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73    **.    ** X is
1d790 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1d7a0 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20  ->pLeft..    ** 
1d7b0 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Y is stored in p
1d7c0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
1d7d0 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20  ].pExpr..    ** 
1d7e0 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  Z is stored in p
1d7f0 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
1d800 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a  ].pExpr..    */.
1d810 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
1d820 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
1d830 72 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70  r *pX = pExpr->p
1d840 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
1d850 20 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pY = pExpr->x.
1d860 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1d870 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
1d880 5a 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Z = pExpr->x.pLi
1d890 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1d8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1d8b0 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1d8c0 20 22 42 45 54 57 45 45 4e 22 29 3b 0a 20 20 20   "BETWEEN");.   
1d8d0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d8e0 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 58  ewExpr(pView, pX
1d8f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
1d900 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1d910 70 56 69 65 77 2c 20 70 59 2c 20 31 29 3b 0a 20  pView, pY, 1);. 
1d920 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d930 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1d940 70 5a 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  pZ, 0);.      br
1d950 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d960 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
1d970 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d980 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
1d990 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
1d9a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
1d9b0 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
1d9c0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
1d9d0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
1d9e0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1d9f0 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
1da00 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
1da10 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
1da20 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
1da30 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
1da40 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
1da50 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
1da60 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
1da70 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
1da80 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
1da90 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
1daa0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
1dab0 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
1dac0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
1dad0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
1dae0 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
1daf0 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
1db00 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1db10 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1db20 65 77 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20  ew, "%s(%d)", . 
1db30 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1db40 69 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a  iTable ? "NEW" :
1db50 20 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69   "OLD", pExpr->i
1db60 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
1db70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1db80 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
1db90 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1dba0 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c  eViewLine(pView,
1dbb0 20 22 43 41 53 45 22 29 3b 0a 20 20 20 20 20 20   "CASE");.      
1dbc0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1dbd0 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72  xpr(pView, pExpr
1dbe0 2d 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20  ->pLeft, 1);.   
1dbf0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1dc00 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
1dc10 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1dc20 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
1dc30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1dc40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1dc50 54 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65  TRIGGER.    case
1dc60 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
1dc70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1dc80 54 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20  Type = "unk";.  
1dc90 20 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70      switch( pExp
1dca0 72 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  r->affinity ){. 
1dcb0 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52         case OE_R
1dcc0 6f 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65  ollback:   zType
1dcd0 20 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20   = "rollback";  
1dce0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1dcf0 61 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20  ase OE_Abort:   
1dd00 20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72     zType = "abor
1dd10 74 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  t";     break;. 
1dd20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46         case OE_F
1dd30 61 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65  ail:       zType
1dd40 20 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20   = "fail";      
1dd50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1dd60 61 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20  ase OE_Ignore:  
1dd70 20 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f     zType = "igno
1dd80 72 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  re";    break;. 
1dd90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1dda0 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1ddb0 28 70 56 69 65 77 2c 20 22 52 41 49 53 45 20 25  (pView, "RAISE %
1ddc0 73 28 25 51 29 22 2c 20 7a 54 79 70 65 2c 20 70  s(%Q)", zType, p
1ddd0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1dde0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ddf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1de00 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1de10 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1de20 69 6e 65 28 70 56 69 65 77 2c 20 22 6f 70 3d 25  ine(pView, "op=%
1de30 64 22 2c 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a  d", pExpr->op);.
1de40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1de50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69   }.  }.  if( zBi
1de60 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nOp ){.    sqlit
1de70 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1de80 56 69 65 77 2c 20 22 25 73 22 2c 20 7a 42 69 6e  View, "%s", zBin
1de90 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
1dea0 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
1deb0 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ew, pExpr->pLeft
1dec0 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
1ded0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56  3TreeViewExpr(pV
1dee0 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  iew, pExpr->pRig
1def0 68 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  ht, 0);.  }else 
1df00 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20  if( zUniOp ){.  
1df10 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1df20 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73  wLine(pView, "%s
1df30 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20  ", zUniOp);.    
1df40 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1df50 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72  xpr(pView, pExpr
1df60 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 7d  ->pLeft, 0);.  }
1df70 0a 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69  .  sqlite3TreeVi
1df80 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a  ewPop(pView);.}.
1df90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1dfa0 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  _DEBUG */..#ifde
1dfb0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1dfc0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1dfd0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
1dfe0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  xplanation of an
1dff0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1e000 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e010 33 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73  3TreeViewExprLis
1e020 74 28 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70  t(.  TreeView *p
1e030 56 69 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78  View,.  const Ex
1e040 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20  prList *pList,. 
1e050 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77   u8 moreToFollow
1e060 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1e070 7a 4c 61 62 65 6c 0a 29 7b 0a 20 20 69 6e 74 20  zLabel.){.  int 
1e080 69 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c  i;.  pView = sql
1e090 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68  ite3TreeViewPush
1e0a0 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f  (pView, moreToFo
1e0b0 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 7a 4c 61  llow);.  if( zLa
1e0c0 62 65 6c 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c  bel==0 || zLabel
1e0d0 5b 30 5d 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20  [0]==0 ) zLabel 
1e0e0 3d 20 22 4c 49 53 54 22 3b 0a 20 20 69 66 28 20  = "LIST";.  if( 
1e0f0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1e100 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1e110 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 20 28  ine(pView, "%s (
1e120 65 6d 70 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29  empty)", zLabel)
1e130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1e140 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1e150 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20  ne(pView, "%s", 
1e160 7a 4c 61 62 65 6c 29 3b 0a 20 20 20 20 66 6f 72  zLabel);.    for
1e170 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1e180 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1e190 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1e1a0 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69  wExpr(pView, pLi
1e1b0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
1e1c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
1e1d0 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 69 66  );.#if 0.     if
1e1e0 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1e1f0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
1e200 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1e210 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25  ntf(pOut, " AS %
1e220 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  s", pList->a[i].
1e230 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
1e240 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1e250 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62  >a[i].bSpanIsTab
1e260 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e270 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1e280 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20  (pOut, " (%s)", 
1e290 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1e2a0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  n);.      }.#end
1e2b0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  if.    }.  }.  s
1e2c0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1e2d0 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64  p(pView);.}.#end
1e2e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1e2f0 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  UG */../*.** Gen
1e300 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1e310 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
1e320 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
1e330 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
1e340 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1e350 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
1e360 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
1e370 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
1e380 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
1e390 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1e3a0 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
1e3b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
1e3c0 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
1e3d0 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
1e3e0 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
1e3f0 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
1e400 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
1e410 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
1e420 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
1e430 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
1e440 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
1e450 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
1e460 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
1e470 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
1e480 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
1e490 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a  zation code..*/.
1e4a0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1e4b0 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
1e4c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e4d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1e4e0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
1e4f0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
1e500 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
1e510 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
1e520 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
1e530 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1e540 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
1e550 73 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  s */.  u8 flags 
1e560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
1e570 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
1e580 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1e590 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1e5a0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
1e5b0 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20  ;.  u8 copyOp = 
1e5c0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1e5d0 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43  ECEL_DUP) ? OP_C
1e5e0 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a  opy : OP_SCopy;.
1e5f0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1e600 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1e610 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
1e620 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
1e630 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
1e640 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
1e650 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
1e660 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
1e670 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
1e680 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
1e690 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
1e6a0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
1e6b0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
1e6c0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
1e6d0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1e6e0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1e6f0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
1e700 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1e710 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1e720 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65  OR)!=0 && sqlite
1e730 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
1e740 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1e750 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1e760 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1e770 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30  xpr, target+i, 0
1e780 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e790 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
1e7a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e7b0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1e7c0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
1e7d0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1e7e0 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
1e7f0 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
1e800 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  ;.        Vdbe *
1e810 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1e820 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
1e830 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
1e840 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
1e850 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
1e860 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
1e870 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
1e880 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
1e890 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
1e8a0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
1e8b0 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
1e8c0 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
1e8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
1e8e0 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
1e8f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e910 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
1e920 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
1e930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1e950 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1e960 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1e970 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
1e980 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
1e990 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1e9a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
1e9b0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1e9c0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
1e9d0 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
1e9e0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
1e9f0 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
1ea00 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
1ea10 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
1ea20 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
1ea30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ea40 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1ea50 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1ea60 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1ea70 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1ea80 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1ea90 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1eaa0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
1eab0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
1eac0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1ead0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1eae0 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20   if the jump is 
1eaf0 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a  taken */.  int j
1eb00 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20  umpIfTrue,   /* 
1eb10 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1eb20 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1eb30 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  true */.  int ju
1eb40 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
1eb50 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1eb60 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
1eb70 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
1eb80 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
1eb90 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
1eba0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
1ebb0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
1ebc0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
1ebd0 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
1ebe0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
1ebf0 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
1ec00 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
1ec10 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
1ec20 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
1ec30 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1ec40 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1ec50 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
1ec60 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
1ec70 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1ec80 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ec90 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1eca0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1ecb0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1ecc0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1ecd0 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
1ece0 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
1ecf0 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
1ed00 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
1ed10 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
1ed20 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
1ed30 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1ed40 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
1ed50 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1ed60 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1ed70 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
1ed80 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
1ed90 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
1eda0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
1edb0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1edc0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1edd0 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
1ede0 73 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c  ster(&exprX, sql
1edf0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1ee00 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
1ee10 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
1ee20 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29  if( jumpIfTrue )
1ee30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1ee40 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1ee50 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1ee60 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1ee70 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1ee80 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1ee90 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1eea0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1eeb0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
1eec0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1eed0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1eee0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
1eef0 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
1ef00 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
1ef10 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1ef20 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1ef30 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1ef40 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1ef50 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1ef60 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1ef70 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1ef80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1ef90 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1efa0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1efb0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1efc0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1efd0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1efe0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1eff0 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1f000 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1f010 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1f020 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1f030 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1f040 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1f050 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1f060 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1f070 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1f080 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1f090 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1f0a0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1f0b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1f0c0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1f0d0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1f0e0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1f0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1f100 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1f110 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1f120 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1f130 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1f140 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1f150 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1f160 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
1f170 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1f180 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1f190 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1f1a0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
1f1b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1f1c0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1f1d0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1f1e0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1f1f0 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
1f200 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1f210 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
1f220 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1f230 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
1f240 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
1f250 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
1f260 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
1f270 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
1f280 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
1f290 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
1f2a0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
1f2b0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
1f2c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1f2d0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
1f2e0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
1f2f0 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
1f300 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
1f310 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
1f320 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
1f330 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
1f340 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
1f350 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
1f360 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
1f370 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
1f380 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
1f390 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
1f3a0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1f3b0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1f3c0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1f3d0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1f3e0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1f3f0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1f400 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1f410 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1f420 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1f430 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1f440 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1f450 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1f460 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1f470 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1f480 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1f490 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
1f4a0 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
1f4b0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1f4c0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1f4d0 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
1f4e0 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
1f4f0 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
1f500 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
1f510 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1f520 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1f530 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f540 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1f550 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1f560 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1f570 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f580 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1f590 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1f5a0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1f5b0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
1f5c0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1f5d0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1f5e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f5f0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1f600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f610 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1f620 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f630 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f640 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f650 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1f660 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1f670 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f680 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1f690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f6a0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1f6b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f6c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f6d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f6e0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1f6f0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f700 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f720 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1f730 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1f740 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1f750 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1f760 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1f770 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1f780 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f790 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1f7a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f7b0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1f7c0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1f7d0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1f7e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f7f0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f800 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f810 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f820 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1f830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f840 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1f850 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1f860 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1f870 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1f880 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1f890 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1f8a0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f8b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f8c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f8d0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f8e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f8f0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f900 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1f910 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1f920 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f930 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1f940 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1f950 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f960 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1f970 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1f980 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1f990 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1f9a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1f9b0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1f9c0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1f9d0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1f9e0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1f9f0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1fa00 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1fa10 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1fa20 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1fa30 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1fa40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1fa50 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1fa60 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1fa70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1fa80 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1fa90 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1faa0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1fab0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1fac0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fad0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1fae0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1faf0 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1fb00 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1fb10 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fb20 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1fb30 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1fb40 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1fb50 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1fb60 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fb70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1fb80 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fb90 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1fba0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fbb0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1fbc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fbd0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1fbe0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
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 20 29 3b 0a 20 20 20  op==TK_IS );.   
1fc10 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1fc20 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1fc30 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fc40 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fc50 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fc60 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fc70 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1fc80 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1fc90 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1fca0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1fcb0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1fcc0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1fcd0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1fce0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1fcf0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1fd00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1fd10 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1fd20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1fd30 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1fd40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1fd50 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1fd60 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  K_EQ);.      Vdb
1fd70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1fd80 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20  p==TK_NE);.     
1fd90 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fda0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1fdb0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fdc0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1fdd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fde0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1fdf0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1fe00 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1fe10 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1fe20 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
1fe30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fe40 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1fe50 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1fe60 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1fe70 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
1fe80 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1fe90 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1fea0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1feb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fec0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1fed0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fee0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1fef0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
1ff00 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ff10 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
1ff20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1ff30 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1ff40 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
1ff50 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1ff60 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1ff70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ff80 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1ff90 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ffa0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1ffb0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
1ffc0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1ffd0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31  , pExpr, dest, 1
1ffe0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1fff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20000 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
20010 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
20020 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
20030 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
20040 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
20050 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20060 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
20070 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
20080 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
20090 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
200a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
200b0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
200c0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
200d0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
200e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
200f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
20100 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
20110 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
20120 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
20130 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
20140 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
20150 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
20160 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
20170 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
20180 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20190 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
201a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
201b0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
201c0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
201d0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
201e0 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a        /* No-op *
201f0 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
20200 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
20210 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20220 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
20230 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
20240 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20250 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
20260 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
20270 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
20280 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
20290 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
202a0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
202b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
202c0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
202d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
202e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
202f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
20300 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
20310 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
20320 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
20330 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
20340 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
20350 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
20360 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
20370 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
20380 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
20390 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
203a0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
203b0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
203c0 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
203d0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
203e0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
203f0 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
20400 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
20410 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
20420 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
20430 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
20440 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
20450 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
20460 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
20470 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
20480 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
20490 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
204a0 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
204b0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
204c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
204d0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
204e0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
204f0 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
20500 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
20510 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
20520 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
20530 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
20540 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
20550 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
20560 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
20570 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
20580 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
20590 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
205a0 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
205b0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
205c0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
205d0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
205e0 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65  pExpr==0 )    re
205f0 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
20600 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
20610 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
20620 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
20630 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
20640 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
20650 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
20660 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
20670 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
20680 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
20690 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
206a0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
206b0 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
206c0 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
206d0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
206e0 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
206f0 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
20700 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
20710 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
20720 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
20730 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
20740 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
20760 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
20770 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
20780 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
20790 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
207a0 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
207b0 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
207c0 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
207d0 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
207e0 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
207f0 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
20800 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
20810 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
20820 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
20830 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
20840 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
20850 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
20860 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
20870 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
20880 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
20890 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
208a0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
208b0 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
208c0 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
208d0 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
208e0 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
208f0 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
20900 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
20910 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
20920 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
20930 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
20940 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
20950 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
20960 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
20970 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
20980 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
20990 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
209a0 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
209b0 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
209c0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
209d0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
209e0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
209f0 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
20a00 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
20a10 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
20a20 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
20a30 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
20a40 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
20a50 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
20a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20a70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
20a80 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
20a90 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
20aa0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
20ab0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
20ac0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
20ad0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
20ae0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
20af0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
20b00 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
20b10 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
20b30 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
20b40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20b50 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
20b60 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
20b70 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
20b80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20b90 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
20ba0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
20bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20bc0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
20bd0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
20be0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20bf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20c00 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20c20 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
20c30 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
20c40 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
20c50 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
20c60 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
20c70 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
20c80 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
20c90 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
20ca0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20cb0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
20cc0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20cd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20ce0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
20cf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20d00 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20d10 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
20d20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20d30 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
20d40 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
20d50 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
20d60 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
20d70 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
20d80 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
20d90 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
20da0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20db0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
20dc0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
20dd0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
20de0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
20df0 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
20e00 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
20e10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20e20 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20e30 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
20e40 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20e50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20e60 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
20e70 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
20e80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20e90 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20ea0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
20eb0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
20ec0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
20ed0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
20ee0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
20f10 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
20f20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
20f30 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
20f40 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
20f50 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
20f60 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
20f70 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
20f80 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
20f90 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
20fa0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
20fb0 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
20fc0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
20fd0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
20fe0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
20ff0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
21000 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
21010 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
21020 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
21030 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
21040 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
21050 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
21060 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
21070 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
21080 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
21090 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
210a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
210b0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
210c0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
210d0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
210e0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
210f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21100 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
21110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21120 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
21130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21140 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
21150 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
21160 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
21170 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21180 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
21190 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
211a0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
211b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
211c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
211d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
211e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
211f0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
21200 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
21210 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
21220 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
21230 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
21240 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
21250 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
21260 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  EQ;.      codeCo
21270 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
21280 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
21290 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212b0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
212c0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
212d0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
212e0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
212f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
21300 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
21310 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
21320 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
21330 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
21340 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
21350 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
21360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
21370 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
21380 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
21390 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
213a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
213b0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
213c0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
213d0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
213e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
213f0 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
21400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
21410 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
21420 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21430 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
21440 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21450 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
21460 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
21470 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
21480 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
21490 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
214a0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
214b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
214c0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
214d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
214e0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
214f0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
21500 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
21510 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
21520 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
21530 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21540 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21550 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
21560 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
21570 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
21580 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
21590 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
215a0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
215b0 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
215c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
215d0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
215e0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
215f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
21600 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
21610 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
21620 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
21630 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
21640 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
21650 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
21660 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
21670 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
21690 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
216a0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
216b0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
216c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
216d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
216e0 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
216f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
21700 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
21710 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
21720 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
21730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21740 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
21750 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
21760 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
21770 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
21780 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21790 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
217a0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
217b0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
217c0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
217d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
217e0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
217f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21800 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
21810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21820 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
21830 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
21840 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
21850 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
21860 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
21870 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
21880 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
21890 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
218a0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
218b0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
218c0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
218d0 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
218e0 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
218f0 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
21900 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
21910 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
21920 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
21930 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
21940 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
21950 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
21960 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
21970 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
21980 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
21990 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
219a0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
219b0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
219c0 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
219d0 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
219e0 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
219f0 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
21a00 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
21a10 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
21a20 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
21a30 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
21a40 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
21a50 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
21a60 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
21a70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
21a80 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
21a90 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
21aa0 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
21ab0 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
21ac0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
21ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
21ae0 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
21af0 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
21b00 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
21b10 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
21b20 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
21b30 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
21b40 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
21b50 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
21b60 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
21b70 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
21b80 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
21b90 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
21ba0 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
21bb0 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
21bc0 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
21bd0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
21be0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
21bf0 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
21c00 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
21c10 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
21c20 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
21c30 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
21c40 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
21c50 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
21c60 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
21c70 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
21c80 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
21c90 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
21ca0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
21cb0 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
21cc0 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
21cd0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
21ce0 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
21cf0 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
21d00 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
21d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
21d20 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
21d30 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
21d40 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63  t iTab){.  u32 c
21d50 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20  ombinedFlags;.  
21d60 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
21d70 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
21d80 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
21d90 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46  .  }.  combinedF
21da0 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73  lags = pA->flags
21db0 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20   | pB->flags;.  
21dc0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
21dd0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
21de0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e  ){.    if( (pA->
21df0 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26  flags&pB->flags&
21e00 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
21e10 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d  && pA->u.iValue=
21e20 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
21e30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21e40 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21e50 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
21e60 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b  A->op!=pB->op ){
21e70 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
21e80 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
21e90 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21ea0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c  e(pA->pLeft, pB,
21eb0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
21ec0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21ed0 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
21ee0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
21ef0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21f00 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74  re(pA, pB->pLeft
21f10 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
21f20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21f30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
21f40 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
21f50 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
21f60 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54  ALWAYS(pA->op!=T
21f70 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
21f80 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
21f90 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
21fa0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
21fb0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
21fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
21fd0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
21fe0 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
21ff0 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
22000 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
22010 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
22020 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
22030 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
22040 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
22050 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
22060 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
22070 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
22080 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
22090 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
220a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
220b0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
220c0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
220d0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
220e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
220f0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
22100 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
22110 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ght, iTab) ) ret
22120 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
22130 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
22140 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
22150 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20  t, pB->x.pList, 
22160 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
22170 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
22180 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
22190 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  & EP_Reduced)==0
221a0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
221b0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
221c0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
221d0 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
221e0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
221f0 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
22200 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
22210 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
22220 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
22230 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
22240 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22250 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
22260 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
22270 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
22280 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
22290 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
222a0 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
222b0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
222c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
222d0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
222e0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
222f0 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
22300 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
22310 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
22320 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
22330 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
22340 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
22350 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22360 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
22370 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
22380 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
22390 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
223a0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
223b0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
223c0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
223d0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
223e0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
223f0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
22400 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
22410 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
22420 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
22430 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
22440 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
22450 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
22460 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
22470 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
22480 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
22490 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
224a0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
224b0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
224c0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
224d0 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
224e0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
224f0 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
22500 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
22510 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
22520 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
22530 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
22540 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
22550 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
22560 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
22570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
22580 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
22590 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
225a0 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
225b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
225c0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
225d0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
225e0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
225f0 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
22600 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
22610 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
22620 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
22630 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
22640 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
22650 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22660 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
22670 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
22680 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
22690 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
226a0 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
226b0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
226c0 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
226d0 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
226e0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
226f0 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
22700 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
22710 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
22720 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
22730 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
22740 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
22750 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
22760 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
22770 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
22780 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
22790 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
227a0 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
227b0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
227c0 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
227d0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
227e0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
227f0 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
22800 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
22810 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
22820 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
22830 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
22840 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
22850 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
22860 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
22870 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
22880 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
22890 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
228a0 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
228b0 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
228c0 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
228d0 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
228e0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
228f0 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
22900 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
22910 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
22920 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20  ..**.** When in 
22930 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61  doubt, return fa
22940 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  lse.  Returning 
22950 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20  true might give 
22960 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  a performance.**
22970 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52   improvement.  R
22980 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d  eturning false m
22990 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72  ight cause a per
229a0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
229b0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69  on, but.** it wi
229c0 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74  ll always give t
229d0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
229e0 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61  r and is hence a
229f0 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69  lways safe..*/.i
22a00 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
22a10 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a  pliesExpr(Expr *
22a20 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20  pE1, Expr *pE2, 
22a30 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28  int iTab){.  if(
22a40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
22a50 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54  are(pE1, pE2, iT
22a60 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
22a70 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
22a80 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
22a90 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
22aa0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
22ab0 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  E1, pE2->pLeft, 
22ac0 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20  iTab).          
22ad0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
22ae0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
22af0 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
22b00 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
22b10 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
22b20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
22b30 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71  NOTNULL.   && sq
22b40 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
22b50 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32  (pE1->pLeft, pE2
22b60 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
22b70 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70  0.   && (pE1->op
22b80 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70  !=TK_ISNULL && p
22b90 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20  E1->op!=TK_IS). 
22ba0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
22bb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
22bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
22bd0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
22be0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
22bf0 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
22c00 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
22c10 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
22c20 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
22c30 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
22c40 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
22c50 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
22c60 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
22c70 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
22c80 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
22c90 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
22ca0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
22cb0 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
22cc0 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
22cd0 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
22ce0 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
22cf0 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
22d00 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
22d10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
22d20 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
22d30 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
22d40 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
22d50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22d60 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22d70 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
22d80 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
22d90 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
22da0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
22db0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
22dc0 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
22dd0 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
22de0 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
22df0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
22e00 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
22e10 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
22e20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
22e30 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
22e40 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
22e50 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
22e60 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
22e70 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
22e80 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
22e90 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
22ea0 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
22eb0 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
22ec0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
22ed0 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
22ee0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
22ef0 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
22f00 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
22f10 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
22f20 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
22f30 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
22f40 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
22f50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
22f60 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
22f70 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
22f80 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
22f90 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
22fa0 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
22fb0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
22fc0 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
22fd0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
22fe0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d  ;.    int nSrc =
22ff0 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53   pSrc ? pSrc->nS
23000 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  rc : 0;.    for(
23010 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
23020 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
23030 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
23040 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
23050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
23060 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a    if( i<nSrc ){.
23070 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b        p->nThis++
23080 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23090 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a     p->nOther++;.
230a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
230b0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
230c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
230d0 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ine if any of th
230e0 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74  e arguments to t
230f0 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f  he pExpr Functio
23100 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70  n reference.** p
23110 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e  SrcList.  Return
23120 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f   true if they do
23130 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  .  Also return t
23140 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74  rue if the funct
23150 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72  ion.** has no ar
23160 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f  guments or has o
23170 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67  nly constant arg
23180 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20  uments.  Return 
23190 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a  false if pExpr.*
231a0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c  * references col
231b0 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c  umns but not col
231c0 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66  umns of tables f
231d0 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74  ound in pSrcList
231e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
231f0 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
23200 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c  Src(Expr *pExpr,
23210 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
23220 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  st){.  Walker w;
23230 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75  .  struct SrcCou
23240 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74  nt cnt;.  assert
23250 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
23260 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
23270 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
23280 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
23290 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
232a0 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20  exprSrcCount;.  
232b0 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20  w.u.pSrcCount = 
232c0 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63  &cnt;.  cnt.pSrc
232d0 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63   = pSrcList;.  c
232e0 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt.nThis = 0;.  
232f0 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a  cnt.nOther = 0;.
23300 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
23310 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d  rList(&w, pExpr-
23320 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  >x.pList);.  ret
23330 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20  urn cnt.nThis>0 
23340 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30  || cnt.nOther==0
23350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
23360 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
23370 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43  the pAggInfo->aC
23380 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  ol[] array.  Ret
23390 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
233a0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
233b0 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
233c0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
233d0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
233e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
233f0 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73  dAggInfoColumn(s
23400 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
23410 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
23420 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
23430 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72  Col = sqlite3Arr
23440 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
23450 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49     db,.       pI
23460 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20  nfo->aCol,.     
23470 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
23480 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20  aCol[0]),.      
23490 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e   &pInfo->nColumn
234a0 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
234b0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
234c0 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20    ../*.** Add a 
234d0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
234e0 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  he pAggInfo->aFu
234f0 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74  nc[] array.  Ret
23500 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66  urn the index of
23510 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  .** the new elem
23520 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e  ent.  Return a n
23530 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69  egative number i
23540 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a  f malloc fails..
23550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
23560 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c  dAggInfoFunc(sql
23570 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66  ite3 *db, AggInf
23580 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  o *pInfo){.  int
23590 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75   i;.  pInfo->aFu
235a0 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  nc = sqlite3Arra
235b0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
235c0 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49    db, .       pI
235d0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20  nfo->aFunc,.    
235e0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
235f0 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20  >aFunc[0]),.    
23600 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63     &pInfo->nFunc
23610 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b  ,.       &i.  );
23620 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20  .  return i;.}  
23630 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
23640 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62  s the xExprCallb
23650 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77  ack for a tree w
23660 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73  alker.  It is us
23670 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ed to.** impleme
23680 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
23690 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
236a0 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  ).  See sqlite3E
236b0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
236c0 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69  ates.** for addi
236d0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
236e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
236f0 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
23700 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  te(Walker *pWalk
23710 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
23720 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  {.  int i;.  Nam
23730 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
23740 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
23750 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
23760 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
23770 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
23780 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
23790 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70  st;.  AggInfo *p
237a0 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70  AggInfo = pNC->p
237b0 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74  AggInfo;..  swit
237c0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
237d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
237e0 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
237f0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
23800 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
23810 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
23820 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
23830 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
23840 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
23850 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  );.      /* Chec
23860 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
23870 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65  column is in one
23880 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
23890 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20  n the FROM.     
238a0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
238b0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
238c0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  y */.      if( A
238d0 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d  LWAYS(pSrcList!=
238e0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  0) ){.        st
238f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
23900 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c  m *pItem = pSrcL
23910 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  ist->a;.        
23920 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c  for(i=0; i<pSrcL
23930 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
23940 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23950 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
23960 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20  fo_col *pCol;.  
23970 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23980 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23990 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e  (pExpr, EP_Token
239a0 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29  Only|EP_Reduced)
239b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
239c0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
239d0 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  =pItem->iCursor 
239e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
239f0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
23a00 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
23a10 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65  ns that pExpr re
23a20 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a  fers to a table.
23a30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
23a40 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52  hat is in the FR
23a50 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
23a60 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
23a70 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
23a80 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  **.            *
23a90 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20  * Make an entry 
23aa0 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  for the column i
23ab0 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  n pAggInfo->aCol
23ac0 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  [] if there.    
23ad0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f          ** is no
23ae0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65  t an entry there
23af0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20   already..      
23b00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23b10 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
23b20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70          pCol = p
23b30 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20  AggInfo->aCol;. 
23b40 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b             for(k
23b50 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; k<pAggInfo->
23b60 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43  nColumn; k++, pC
23b70 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
23b80 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
23b90 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54  Table==pExpr->iT
23ba0 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20  able &&.        
23bb0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23bc0 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
23bd0 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
23be0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
23bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23c00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
23c10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23c20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  (k>=pAggInfo->nC
23c30 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20  olumn).         
23c40 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41      && (k = addA
23c50 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61  ggInfoColumn(pPa
23c60 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
23c70 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  o))>=0 .        
23c80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
23c90 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67       pCol = &pAg
23ca0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a  gInfo->aCol[k];.
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23cc0 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ol->pTab = pExpr
23cd0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
23ce0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62        pCol->iTab
23cf0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  le = pExpr->iTab
23d00 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  le;.            
23d10 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20    pCol->iColumn 
23d20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
23d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23d40 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  pCol->iMem = ++p
23d50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23d60 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23d70 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
23d80 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
23d90 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d     pCol->pExpr =
23da0 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
23db0 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e        if( pAggIn
23dc0 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a  fo->pGroupBy ){.
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23de0 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20  int j, n;.      
23df0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
23e00 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e  st *pGB = pAggIn
23e10 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20  fo->pGroupBy;.  
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
23e30 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23e40 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d  em *pTerm = pGB-
23e50 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >a;.            
23e60 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78      n = pGB->nEx
23e70 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
23e80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
23e90 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
23ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23eb0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
23ec0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23ee0 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ( pE->op==TK_COL
23ef0 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c  UMN && pE->iTabl
23f00 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
23f10 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
23f20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43            pE->iC
23f30 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43  olumn==pExpr->iC
23f40 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
23f60 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
23f70 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   = j;.          
23f80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23fa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23fd0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
23fe0 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29  SorterColumn<0 )
23ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24000 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43    pCol->iSorterC
24010 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f  olumn = pAggInfo
24020 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  ->nSortingColumn
24030 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
24040 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
24050 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  }.            /*
24060 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e   There is now an
24070 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72   entry for pExpr
24080 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
24090 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20  ol[] (either.   
240a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61           ** beca
240b0 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65  use it was there
240c0 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75   before or becau
240d0 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74  se we just creat
240e0 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20  ed it)..        
240f0 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74      ** Convert t
24100 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61  he pExpr to be a
24110 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72   TK_AGG_COLUMN r
24120 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74  eferring to that
24130 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24140 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d  pAggInfo->aCol[]
24150 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20   entry..        
24160 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
24170 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
24180 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24190 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
241a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
241b0 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
241c0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  o;.            p
241d0 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
241e0 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  G_COLUMN;.      
241f0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
24200 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20  g = (i16)k;.    
24210 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24220 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
24230 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  dif pExpr->iTabl
24240 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
24250 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f  r */.        } /
24260 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * end loop over 
24270 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20  pSrcList */.    
24280 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
24290 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
242a0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
242b0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
242c0 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
242d0 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67  Flags & NC_InAgg
242e0 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20  Func)==0.       
242f0 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b  && pWalker->walk
24300 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e  erDepth==pExpr->
24310 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  op2.      ){.   
24320 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
24330 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73   see if pExpr is
24340 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
24350 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74  another aggregat
24360 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  e .        ** fu
24370 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61  nction that is a
24380 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41  lready in the pA
24390 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
243a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
243b0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
243c0 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d  fo_func *pItem =
243d0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
243e0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
243f0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
24400 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Func; i++, pItem
24410 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
24420 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
24430 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78  mpare(pItem->pEx
24440 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d  pr, pExpr, -1)==
24450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24460 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24470 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
24480 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67        if( i>=pAg
24490 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a  gInfo->nFunc ){.
244a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78            /* pEx
244b0 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20  pr is original. 
244c0 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72   Make a new entr
244d0 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  y in pAggInfo->a
244e0 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20  Func[].         
244f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
24500 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
24510 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  e->db);.        
24520 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f    i = addAggInfo
24530 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  Func(pParse->db,
24540 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20   pAggInfo);.    
24550 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29        if( i>=0 )
24560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
24570 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
24580 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24590 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
245a0 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
245b0 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46   = &pAggInfo->aF
245c0 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  unc[i];.        
245d0 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
245e0 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
245f0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65        pItem->iMe
24600 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
24610 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  em;.            
24620 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
24630 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
24640 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
24650 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
24660 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74  m->pFunc = sqlit
24670 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
24680 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20  Parse->db,.     
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
246a0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73  xpr->u.zToken, s
246b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
246c0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c  Expr->u.zToken),
246d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
246e0 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69      pExpr->x.pLi
246f0 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st ? pExpr->x.pL
24700 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
24710 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
24720 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
24730 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69  flags & EP_Disti
24740 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nct ){.         
24750 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73       pItem->iDis
24760 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
24770 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
24780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24790 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
247a0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
247b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
247c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
247d0 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    }.        /* M
247e0 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20  ake pExpr point 
247f0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
24800 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  te pAggInfo->aFu
24810 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20  nc[] entry.     
24820 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
24830 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
24840 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24850 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
24860 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
24870 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
24880 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
24890 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
248a0 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
248b0 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20  (i16)i;.        
248c0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
248d0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
248e0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
248f0 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rune;.      }els
24900 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
24910 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
24920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24930 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
24940 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
24950 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
24960 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28  regatesInSelect(
24970 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24980 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
24990 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
249a0 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a  METER(pWalker);.
249b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
249c0 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72  ER(pSelect);.  r
249d0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
249e0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  ue;.}../*.** Ana
249f0 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65  lyze the pExpr e
24a00 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e  xpression lookin
24a10 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  g for aggregate 
24a20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  functions and.**
24a30 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74   for variables t
24a40 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61  hat need to be a
24a50 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20  dded to AggInfo 
24a60 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d  object that pNC-
24a70 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69  >pAggInfo.** poi
24a80 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f  nts to.  Additio
24a90 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20  nal entries are 
24aa0 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49  made on the AggI
24ab0 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a  nfo object as.**
24ac0 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a   necessary..**.*
24ad0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
24ae0 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
24af0 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65  lled after the e
24b00 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65  xpression has be
24b10 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62  en.** analyzed b
24b20 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  y sqlite3Resolve
24b30 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a  ExprNames()..*/.
24b40 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
24b50 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
24b60 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  s(NameContext *p
24b70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  NC, Expr *pExpr)
24b80 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
24b90 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
24ba0 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
24bb0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e  xprCallback = an
24bc0 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a  alyzeAggregate;.
24bd0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
24be0 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67  ack = analyzeAgg
24bf0 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b  regatesInSelect;
24c00 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43  .  w.u.pNC = pNC
24c10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
24c20 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
24c30 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
24c40 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  r(&w, pExpr);.}.
24c50 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69  ./*.** Call sqli
24c60 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
24c70 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65  gregates() for e
24c80 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  very expression 
24c90 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73  in an.** express
24ca0 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ion list.  Retur
24cb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
24cc0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  errors..**.** If
24cd0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75   an error is fou
24ce0 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73  nd, the analysis
24cf0 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a   is cut short..*
24d00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
24d10 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
24d20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
24d30 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  C, ExprList *pLi
24d40 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  st){.  struct Ex
24d50 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
24d60 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
24d70 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
24d80 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
24d90 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74  >a, i=0; i<pList
24da0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
24db0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  tem++){.      sq
24dc0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
24dd0 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20  Aggregates(pNC, 
24de0 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
24df0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
24e00 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e  * Allocate a sin
24e10 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72  gle new register
24e20 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64   for use to hold
24e30 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61   some intermedia
24e40 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e  te result..*/.in
24e50 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
24e60 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
24e70 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
24e80 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b  ->nTempReg==0 ){
24e90 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50  .    return ++pP
24ea0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a  arse->nMem;.  }.
24eb0 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
24ec0 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72  >aTempReg[--pPar
24ed0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d  se->nTempReg];.}
24ee0 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
24ef0 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d  te a register, m
24f00 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20  aking available 
24f10 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f  for reuse for so
24f20 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70  me other.** purp
24f30 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ose..**.** If a 
24f40 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72  register is curr
24f50 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64  ently being used
24f60 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   by the column c
24f70 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  ache, then.** th
24f80 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  e deallocation i
24f90 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
24fa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
24fb0 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73  e line that uses
24fc0 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72  .** the register
24fd0 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a   becomes stale..
24fe0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
24ff0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61  eleaseTempReg(Pa
25000 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
25010 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52   iReg){.  if( iR
25020 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  eg && pParse->nT
25030 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65  empReg<ArraySize
25040 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65  (pParse->aTempRe
25050 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  g) ){.    int i;
25060 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c  .    struct yCol
25070 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f  Cache *p;.    fo
25080 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
25090 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
250a0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
250b0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
250c0 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69    if( p->iReg==i
250d0 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Reg ){.        p
250e0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20  ->tempReg = 1;. 
250f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
25100 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
25110 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65   pParse->aTempRe
25120 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  g[pParse->nTempR
25130 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20  eg++] = iReg;.  
25140 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
25150 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  ate or deallocat
25160 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65  e a block of nRe
25170 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65  g consecutive re
25180 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73  gisters.*/.int s
25190 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
251a0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
251b0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69  , int nReg){.  i
251c0 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70  nt i, n;.  i = p
251d0 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
251e0 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  n = pParse->
251f0 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28  nRangeReg;.  if(
25200 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20   nReg<=n ){.    
25210 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43  assert( !usedAsC
25220 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73  olumnCache(pPars
25230 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a  e, i, i+n-1) );.
25240 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
25250 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20  geReg += nReg;. 
25260 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67     pParse->nRang
25270 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20  eReg -= nReg;.  
25280 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70  }else{.    i = p
25290 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
252a0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
252b0 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72  += nReg;.  }.  r
252c0 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20  eturn i;.}.void 
252d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
252e0 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70  mpRange(Parse *p
252f0 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c  Parse, int iReg,
25300 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71   int nReg){.  sq
25310 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
25320 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65  move(pParse, iRe
25330 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20  g, nReg);.  if( 
25340 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61  nReg>pParse->nRa
25350 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50  ngeReg ){.    pP
25360 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
25370 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72  = nReg;.    pPar
25380 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20  se->iRangeReg = 
25390 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
253a0 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70  ** Mark all temp
253b0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
253c0 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c  as being unavail
253d0 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a  able for reuse..
253e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
253f0 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
25400 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
25410 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  .  pParse->nTemp
25420 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Reg = 0;.  pPars
25430 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30  e->nRangeReg = 0
25440 3b 0a 7d 0a                                      ;.}.