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

Artifact c329d581e5d631153456369684d7d4bcd94c907d:


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 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0b60: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0b70: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0b80: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b90: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0ba0: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0bc0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0bd0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ATE operators an
0be0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0bf0: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c10: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c20: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c40: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c50: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c60: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c80: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ca0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cb0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cc0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0ce0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0cf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d00: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d40: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d80: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d90: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
0da0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0db0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0dc0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0dd0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0de0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0df0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e00: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0e10: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e30: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e40: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e70: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e80: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e90: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0ea0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0eb0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ec0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ef0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0f00: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0f10: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f20: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f30: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f40: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f50: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0fa0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0fb0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fc0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fe0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0ff0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
1000: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1010: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1020: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1030: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1040: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1060: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1070: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1080: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1090: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
10b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10d0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1100: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
1110: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1120: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1130: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1140: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1150: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1160: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1170: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1180: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1190: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
11a0: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
11b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11c0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11d0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11e0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11f0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
1200: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1210: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1220: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1230: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1240: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1250: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1260: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1270: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1280: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1290: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
12a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
12f0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1300: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1310: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1320: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1340: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1350: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
1370: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
1380: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
1390: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
13a0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
13b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
13c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
13d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13e0: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
13f0: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1400: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1410: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1420: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1430: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
1440: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
1450: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
1460: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
1470: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
1480: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
1490: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
14a0: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
14b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14c0: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
14d0: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
14e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
14f0: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1520: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1530: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
1540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1550: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1560: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
1570: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
1580: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
1590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
15a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
15b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1630: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
1640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1650: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
1660: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
1670: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1680: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1690: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
16a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
16b0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
16c0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
16d0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
16e0: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
16f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1700: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
1710: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
1720: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
1730: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1740: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
1750: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1760: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
1770: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
1780: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
1790: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
17a0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
17b0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
17c0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
17d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
17f0: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1800: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1810: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1820: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1830: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1840: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1850: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1860: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1870: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1880: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
1890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18a0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
18b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
18d0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  B;.    }.  }else
18e0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
18f0: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1900: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1920: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1930: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1940: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1950: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1960: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
1970: 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
1980: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
1990: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
19a0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
19b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
19c0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
19d0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
19e0: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
19f0: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1a00: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1a10: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1a30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1a40: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1a50: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1a60: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1a70: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
1a80: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
1a90: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
1aa0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
1ab0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1ac0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
1ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ae0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1af0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1b00: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b10: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1b20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1b30: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1b40: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1b50: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b70: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
1b80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
1b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1ba0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
1bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
1bc0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
1bd0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1bf0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1c00: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1c10: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1c20: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1c30: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1c40: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c60: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c70: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
1c80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1c90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
1ca0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1cb0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
1cc0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1cd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1ce0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
1cf0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1d00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1d10: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1d20: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1d30: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1d40: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1d50: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1d60: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1d70: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1d80: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
1d90: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
1da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
1db0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dc0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1dd0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1e00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1e10: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1e20: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1e30: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1e40: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1e50: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1e60: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
1e70: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
1e80: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
1e90: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
1ea0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
1eb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1ec0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1ed0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1ee0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1ef0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1f00: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f20: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1f30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1f40: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1f50: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1f60: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1f70: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1f80: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
1f90: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
1fa0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
1fb0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
1fc0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1fd0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1fe0: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1ff0: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
2000: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
2010: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
2020: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2030: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
2040: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
2050: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2070: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2080: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2090: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
20a0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
20b0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
20c0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
20d0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
20e0: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
20f0: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
2110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2120: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
2130: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
2140: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
2150: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
2160: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
2170: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
2180: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
2190: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
21a0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
21b0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
21c0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
21d0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
21e0: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
21f0: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
2200: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
2210: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
2220: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2230: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
2240: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
2250: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
2260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2270: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
2280: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
2290: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
22b0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
22c0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
22d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
22e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
22f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2300: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
2310: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
2320: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2330: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
2340: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2350: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2360: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2380: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2390: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23a0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
23b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
23c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23e0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
2410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2420: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
2430: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
2440: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
2450: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2460: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
2470: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
2480: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
2490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
24b0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
24c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
24d0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
24e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
24f0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
2500: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
2510: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
2520: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
2530: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
2540: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
2550: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
2560: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2570: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
2580: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
2590: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
25a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
25b0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
25c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
25d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
25e0: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
25f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2620: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2630: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2650: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2670: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2680: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2690: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
26c0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
26d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e0: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
26f0: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2700: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
2710: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
2720: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
2730: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
2740: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
2750: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2760: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2770: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
2780: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
2790: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
27a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
27b0: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
27c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27d0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
27e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
27f0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
2800: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2810: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
2820: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
2830: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2840: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
2850: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
2860: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
2870: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2880: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
2890: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
28a0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
28b0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
28c0: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
28d0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
28e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
28f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2900: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
2910: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
2930: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2940: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
2950: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
2960: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2970: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2980: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
2990: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
29a0: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
29b0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
29c0: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
29d0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
29e0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
29f0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2a00: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
2a10: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
2a20: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
2a30: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
2a40: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
2a50: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
2a60: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
2a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
2a80: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
2a90: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2aa0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2ab0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
2ac0: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
2ad0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
2ae0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
2af0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2b00: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2b10: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
2b20: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2b30: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2b40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2b50: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2b60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
2b70: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
2b80: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
2b90: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2ba0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2bb0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
2bc0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
2bd0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2be0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
2bf0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
2c00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2c10: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
2c20: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
2c30: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2c40: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
2c50: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c60: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
2c70: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
2c80: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c90: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
2ca0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2cb0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2cc0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
2cd0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2ce0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2cf0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
2d00: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2d10: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
2d20: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
2d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
2d40: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
2d50: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
2d60: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2d70: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
2d80: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
2d90: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
2da0: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
2db0: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
2dc0: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
2dd0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
2de0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
2df0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
2e00: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
2e10: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2e20: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
2e30: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
2e40: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
2e50: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
2e60: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
2e70: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
2e80: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
2e90: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
2ea0: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
2ec0: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
2ed0: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
2ee0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
2ef0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
2f00: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
2f20: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
2f30: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2f40: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2f50: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
2f60: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
2f70: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2f80: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2f90: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
2fa0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2fb0: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
2fc0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
2fd0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
2fe0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
2ff0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3000: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
3010: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
3020: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
3030: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
3040: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
3050: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
3060: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
3070: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
3080: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
3090: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
30a0: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
30b0: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
30c0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
30d0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
30e0: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
30f0: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
3100: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
3110: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
3120: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
3130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3140: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
3150: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
3160: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
3170: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
3180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
3190: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
31a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
31b0: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
31c0: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
31d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
31e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
31f0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
3200: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
3210: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
3220: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
3230: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
3240: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
3250: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
3260: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
3270: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
3280: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
3290: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
32a0: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
32b0: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
32c0: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
32d0: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
32e0: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
3300: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
3310: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
3320: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
3330: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
3340: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
3350: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
3360: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
3370: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
3380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
3390: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
33a0: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
33b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
33c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
33d0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
33e0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
33f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3400: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
3410: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
3420: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
3430: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
3440: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
3450: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
3460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
3470: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
3480: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
3490: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
34a0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
34b0: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
34c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
34d0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
34e0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
34f0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
3500: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
3510: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
3520: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
3530: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
3540: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
3550: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
3560: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
3570: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
3580: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
3590: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
35a0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
35b0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
35c0: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
35d0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
35e0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
35f0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
3600: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
3610: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
3620: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3630: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3640: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3650: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3660: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3670: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3680: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3690: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
36a0: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
36b0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
36c0: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
36d0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
36e0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
36f0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
3700: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
3710: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
3720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3730: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3740: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3750: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3760: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3770: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3780: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3790: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
37a0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
37b0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
37c0: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
37d0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
37e0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
37f0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
3800: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
3810: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
3820: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3830: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3840: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3850: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3860: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3880: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3890: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
38a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
38b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
38c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
38d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
38e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
38f0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
3900: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
3910: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
3920: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3940: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3950: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3960: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3970: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3980: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
3990: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
39a0: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
39b0: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
39c0: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
39d0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
39e0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
39f0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
3a00: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
3a10: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
3a20: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
3a30: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
3a50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3a60: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
3a70: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3a80: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3a90: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
3aa0: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
3ab0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
3ac0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3ad0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3ae0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3af0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3b00: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3b10: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3b20: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3b30: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3b40: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b60: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3b70: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3b80: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3b90: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3ba0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3bb0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3bc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3bd0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3be0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3bf0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3c00: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3c10: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3c20: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3c30: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3c40: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3c50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3c60: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3c70: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3c80: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3c90: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3cb0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3cc0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3cd0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3cf0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3d10: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3d20: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3d30: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3d40: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d60: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3d70: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3d80: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3d90: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3da0: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3db0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dc0: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3dd0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3de0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3e00: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3e10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3e20: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3e30: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e50: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3e70: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3e80: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3e90: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3ea0: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3eb0: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3ec0: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3ed0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3ee0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3ef0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3f00: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3f10: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3f20: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3f30: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3f40: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3f50: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3f60: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3f70: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3f80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3f90: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3fa0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3fb0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3fc0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3fd0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3ff0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
4000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4010: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
4020: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
4030: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
4040: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
4050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4080: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
40a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
40b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
40c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
40d0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
40e0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
40f0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
4100: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
4110: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
4120: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
4130: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
4140: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
4150: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
4160: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
4170: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
4180: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
4190: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
41a0: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
41b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
41c0: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
41d0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
41e0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
41f0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
4200: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
4210: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
4220: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4230: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
4240: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
4250: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
4260: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
4270: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4280: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
4290: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
42a0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
42b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
42c0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
42d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
42e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4310: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
4320: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
4330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
4340: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
4350: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
4360: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
4370: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
4380: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
4390: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
43a0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
43b0: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
43c0: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
43d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
4400: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
4410: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
4420: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4430: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4450: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4460: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4470: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4480: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54  arse->db, op & T
4490: 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65  KFLG_MASK, pToke
44a0: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
44b0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
44c0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
44d0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
44e0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
44f0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
4500: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
4510: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
4520: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4530: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   p;.}../*.** If 
4540: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
4550: 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
4560: 54 52 55 45 20 6f 72 20 46 41 4c 53 45 20 28 72  TRUE or FALSE (r
4570: 65 73 70 65 63 74 69 76 65 6c 79 29 2c 0a 2a 2a  espectively),.**
4580: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 31 2e 20   then return 1. 
4590: 20 49 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 64   If one cannot d
45a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 74 72 75  etermine the tru
45b0: 74 68 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  th value of the.
45c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74  ** expression at
45d0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 72 65   compile-time re
45e0: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  turn 0..**.** Th
45f0: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
4600: 61 74 69 6f 6e 2e 20 20 49 66 20 69 73 20 4f 4b  ation.  If is OK
4610: 20 74 6f 20 72 65 74 75 72 6e 20 30 20 68 65 72   to return 0 her
4620: 65 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  e even if.** the
4630: 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 61 6c   expression real
4640: 6c 79 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c  ly is always fal
4650: 73 65 20 6f 72 20 66 61 6c 73 65 20 28 61 20 66  se or false (a f
4660: 61 6c 73 65 20 6e 65 67 61 74 69 76 65 29 2e 0a  alse negative)..
4670: 2a 2a 20 42 75 74 20 69 74 20 69 73 20 61 20 62  ** But it is a b
4680: 75 67 20 74 6f 20 72 65 74 75 72 6e 20 31 20 69  ug to return 1 i
4690: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
46a0: 20 6d 69 67 68 74 20 68 61 76 65 20 64 69 66 66   might have diff
46b0: 65 72 65 6e 74 0a 2a 2a 20 62 6f 6f 6c 65 61 6e  erent.** boolean
46c0: 20 76 61 6c 75 65 73 20 69 6e 20 64 69 66 66 65   values in diffe
46d0: 72 65 6e 74 20 63 69 72 63 75 6d 73 74 61 6e 63  rent circumstanc
46e0: 65 73 20 28 61 20 66 61 6c 73 65 20 70 6f 73 69  es (a false posi
46f0: 74 69 76 65 2e 29 0a 2a 2a 0a 2a 2a 20 4e 6f 74  tive.).**.** Not
4700: 65 20 74 68 61 74 20 69 66 20 74 68 65 20 65 78  e that if the ex
4710: 70 72 65 73 73 69 6f 6e 20 69 73 20 70 61 72 74  pression is part
4720: 20 6f 66 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20   of conditional 
4730: 66 6f 72 20 61 0a 2a 2a 20 4c 45 46 54 20 4a 4f  for a.** LEFT JO
4740: 49 4e 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 6e  IN, then we cann
4750: 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 61 74 20  ot determine at 
4760: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
4770: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 69  ther or not.** i
4780: 73 20 69 74 20 74 72 75 65 20 6f 72 20 66 61 6c  s it true or fal
4790: 73 65 2c 20 73 6f 20 61 6c 77 61 79 73 20 72 65  se, so always re
47a0: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
47b0: 63 20 69 6e 74 20 65 78 70 72 41 6c 77 61 79 73  c int exprAlways
47c0: 54 72 75 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  True(Expr *p){. 
47d0: 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 69 66   int v = 0;.  if
47e0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
47f0: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
4800: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
4810: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
4820: 49 73 49 6e 74 65 67 65 72 28 70 2c 20 26 76 29  IsInteger(p, &v)
4830: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
4840: 65 74 75 72 6e 20 76 21 3d 30 3b 0a 7d 0a 73 74  eturn v!=0;.}.st
4850: 61 74 69 63 20 69 6e 74 20 65 78 70 72 41 6c 77  atic int exprAlw
4860: 61 79 73 46 61 6c 73 65 28 45 78 70 72 20 2a 70  aysFalse(Expr *p
4870: 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a  ){.  int v = 0;.
4880: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4890: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
48a0: 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
48b0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
48c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2c  ExprIsInteger(p,
48d0: 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30 3b   &v) ) return 0;
48e0: 0a 20 20 72 65 74 75 72 6e 20 76 3d 3d 30 3b 0a  .  return v==0;.
48f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
4900: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
4910: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
4920: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
4930: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
4940: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
4950: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
4960: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  r expression..**
4970: 0a 2a 2a 20 49 66 20 6f 6e 65 20 73 69 64 65 20  .** If one side 
4980: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
4990: 74 68 65 20 41 4e 44 20 69 73 20 6b 6e 6f 77 6e  the AND is known
49a0: 20 74 6f 20 62 65 20 66 61 6c 73 65 2c 20 74 68   to be false, th
49b0: 65 6e 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66  en instead.** of
49c0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 41 4e   returning an AN
49d0: 44 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6a 75  D expression, ju
49e0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 6e 73  st return a cons
49f0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
4a00: 77 69 74 68 0a 2a 2a 20 61 20 76 61 6c 75 65 20  with.** a value 
4a10: 6f 66 20 66 61 6c 73 65 2e 0a 2a 2f 0a 45 78 70  of false..*/.Exp
4a20: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e  r *sqlite3ExprAn
4a30: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  d(sqlite3 *db, E
4a40: 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72  xpr *pLeft, Expr
4a50: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28   *pRight){.  if(
4a60: 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20   pLeft==0 ){.   
4a70: 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a   return pRight;.
4a80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
4a90: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ht==0 ){.    ret
4aa0: 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c  urn pLeft;.  }el
4ab0: 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
4ac0: 73 46 61 6c 73 65 28 70 4c 65 66 74 29 20 7c 7c  sFalse(pLeft) ||
4ad0: 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
4ae0: 28 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  (pRight) ){.    
4af0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4b00: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
4b10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4b20: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
4b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
4b40: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
4b50: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
4b60: 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30  lite3IntTokens[0
4b70: 5d 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ], 0);.  }else{.
4b80: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
4b90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4ba0: 63 28 64 62 2c 20 54 4b 5f 41 4e 44 2c 20 30 2c  c(db, TK_AND, 0,
4bb0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
4bc0: 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72 65  ExprAttachSubtre
4bd0: 65 73 28 64 62 2c 20 70 4e 65 77 2c 20 70 4c 65  es(db, pNew, pLe
4be0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
4bf0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
4c00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
4c10: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
4c20: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61  ssion node for a
4c30: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d   function with m
4c40: 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d  ultiple.** argum
4c50: 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ents..*/.Expr *s
4c60: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
4c70: 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
4c80: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4c90: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
4ca0: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
4cb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
4cc0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
4cd0: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 20 29 3b  ssert( pToken );
4ce0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
4cf0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4d00: 4b 5f 46 55 4e 43 54 49 4f 4e 2c 20 70 54 6f 6b  K_FUNCTION, pTok
4d10: 65 6e 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  en, 1);.  if( pN
4d20: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
4d30: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4d40: 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 20 2f  te(db, pList); /
4d50: 2a 20 41 76 6f 69 64 20 6d 65 6d 6f 72 79 20 6c  * Avoid memory l
4d60: 65 61 6b 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20  eak when malloc 
4d70: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74  fails */.    ret
4d80: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  urn 0;.  }.  pNe
4d90: 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69  w->x.pList = pLi
4da0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45  st;.  assert( !E
4db0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4dc0: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
4dd0: 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  t) );.  sqlite3E
4de0: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4df0: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 4e 65  lags(pParse, pNe
4e00: 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  w);.  return pNe
4e10: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
4e20: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
4e30: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
4e40: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
4e50: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
4e60: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
4e70: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
4e80: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
4e90: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
4ea0: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
4eb0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
4ec0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
4ed0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
4ee0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
4ef0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
4f00: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
4f10: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
4f20: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
4f30: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
4f40: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
4f50: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
4f60: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
4f70: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
4f80: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
4f90: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
4fa0: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
4fb0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
4fc0: 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61 22  m ":aaa", "@aaa"
4fd0: 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20  , or "$aaa" are 
4fe0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d  assigned the sam
4ff0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74  e number.** as t
5000: 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74  he previous inst
5010: 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65  ance of the same
5020: 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69   wildcard.  Or i
5030: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
5040: 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  rst.** instance 
5050: 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c  of the wildcard,
5060: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
5070: 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  tial variable nu
5080: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
5090: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
50a0: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
50b0: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
50c0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
50d0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
50e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
50f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5100: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
5110: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
5120: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
5130: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5140: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
5150: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
5160: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
5170: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
5180: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
5190: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
51a0: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
51b0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
51c0: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
51d0: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
51e0: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
51f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
5200: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
5210: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
5220: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
5230: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
5240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
5250: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
5260: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
5270: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
5280: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
5290: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
52a0: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
52b0: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
52c0: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
52d0: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
52e0: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
52f0: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
5300: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
5310: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
5320: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
5330: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
5340: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
5350: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5360: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
5370: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
5380: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
5390: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
53a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
53b0: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
53c0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
53d0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
53e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
53f0: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
5400: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
5410: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
5420: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
5430: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
5440: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5450: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5460: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
5470: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5480: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
5490: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
54a0: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
54b0: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
54c0: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
54d0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
54e0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
54f0: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
5500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5510: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
5520: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
5530: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
5540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5550: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
5560: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
5570: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
5580: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
5590: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
55a0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
55b0: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
55c0: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
55d0: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
55e0: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
55f0: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
5600: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
5610: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5620: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
5630: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
5640: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
5650: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
5660: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
5670: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
5680: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
5690: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
56a0: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
56b0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
56c0: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
56d0: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
56e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
56f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5700: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
5710: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
5720: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
5730: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
5740: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
5750: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
5760: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
5770: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
5780: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
5790: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
57a0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
57b0: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
57c0: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b       if( a==0 ){
57d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
57e0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
57f0: 6c 65 64 20 29 3b 20 2f 2a 20 45 72 72 6f 72 20  led ); /* Error 
5800: 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75 67 68  reported through
5810: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 2a 2f   mallocFailed */
5820: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5830: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
5840: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56       pParse->azV
5850: 61 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  ar = a;.        
5860: 6d 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65  memset(&a[pParse
5870: 2d 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d  ->nzVar], 0, (x-
5880: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73  pParse->nzVar)*s
5890: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
58a0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a        pParse->nz
58b0: 56 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d  Var = x;.      }
58c0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21  .      if( z[0]!
58d0: 3d 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ='?' || pParse->
58e0: 61 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b  azVar[x-1]==0 ){
58f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5900: 44 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73  DbFree(db, pPars
5910: 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a  e->azVar[x-1]);.
5920: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5930: 61 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c  azVar[x-1] = sql
5940: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
5950: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
5960: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66  .    }.  } .  if
5970: 28 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  ( !pParse->nErr 
5980: 26 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  && pParse->nVar>
5990: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
59a0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
59b0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
59c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
59d0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
59e0: 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22  y SQL variables"
59f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5a00: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
5a10: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
5a20: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
5a30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5a40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
5a50: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
5a60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f  =0 ) return;.  /
5a70: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20  * Sanity check: 
5a80: 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
5a90: 49 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  IntValue is non-
5aa0: 6e 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65  negative if it e
5ab0: 78 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72  xists */.  asser
5ac0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5ad0: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
5ae0: 75 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c  ue) || p->u.iVal
5af0: 75 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ue>=0 );.  if( !
5b00: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5b10: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
5b20: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45   ){.    /* The E
5b30: 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e  xpr.x union is n
5b40: 65 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65  ever used at the
5b50: 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78   same time as Ex
5b60: 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  pr.pRight */.   
5b70: 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c   assert( p->x.pL
5b80: 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  ist==0 || p->pRi
5b90: 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  ght==0 );.    sq
5ba0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5bb0: 64 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  db, p->pLeft);. 
5bc0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
5bd0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67  lete(db, p->pRig
5be0: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  ht);.    if( Exp
5bf0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5c00: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73  EP_MemToken) ) s
5c10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5c20: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20   p->u.zToken);. 
5c30: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5c40: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
5c50: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
5c60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
5c70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53  lete(db, p->x.pS
5c80: 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73  elect);.    }els
5c90: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
5ca0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
5cb0: 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  b, p->x.pList);.
5cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5cd0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5ce0: 28 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29  (p, EP_Static) )
5cf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5d00: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
5d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5d20: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
5d30: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  tes allocated fo
5d40: 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
5d50: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70   structure .** p
5d60: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5d70: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  st argument. Thi
5d80: 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  s is always one 
5d90: 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45  of EXPR_FULLSIZE
5da0: 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45  ,.** EXPR_REDUCE
5db0: 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f  DSIZE or EXPR_TO
5dc0: 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a  KENONLYSIZE..*/.
5dd0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53  static int exprS
5de0: 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a  tructSize(Expr *
5df0: 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61  p){.  if( ExprHa
5e00: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5e10: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74  TokenOnly) ) ret
5e20: 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e  urn EXPR_TOKENON
5e30: 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78  LYSIZE;.  if( Ex
5e40: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5e50: 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72   EP_Reduced) ) r
5e60: 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43  eturn EXPR_REDUC
5e70: 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  EDSIZE;.  return
5e80: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70  }../*.** The dup
5ea0: 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f  edExpr*Size() ro
5eb0: 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75  utines each retu
5ec0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5ed0: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a   bytes required.
5ee0: 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f  ** to store a co
5ef0: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
5f00: 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f  ion or expressio
5f10: 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69  n tree.  They di
5f20: 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d  ffer in.** how m
5f30: 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  uch of the tree 
5f40: 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a  is measured..**.
5f50: 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72  **     dupedExpr
5f60: 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20  StructSize()    
5f70: 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68   Size of only th
5f80: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
5f90: 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78   .**     dupedEx
5fa0: 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20  prNodeSize()    
5fb0: 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20     Size of Expr 
5fc0: 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65  + space for toke
5fd0: 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78  n.**     dupedEx
5fe0: 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20  prSize()        
5ff0: 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20     Expr + token 
6000: 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e  + subtree compon
6010: 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ents.**.********
6020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6060: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75  ***.**.** The du
6070: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
6080: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  e() function ret
6090: 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20  urns two values 
60a0: 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20  OR-ed together: 
60b0: 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61   .** (1) the spa
60c0: 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ce required for 
60d0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
60e0: 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c  pr structure onl
60f0: 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68  y and .** (2) th
6100: 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74  e EP_xxx flags t
6110: 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61  hat indicate wha
6120: 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  t the structure 
6130: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a  size should be..
6140: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
6150: 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f  lues is always o
6160: 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
6170: 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a    EXPR_FULLSIZE.
6180: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44  **      EXPR_RED
6190: 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f  UCEDSIZE   | EP_
61a0: 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20  Reduced.**      
61b0: 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49  EXPR_TOKENONLYSI
61c0: 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  ZE | EP_TokenOnl
61d0: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  y.**.** The size
61e0: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
61f0: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62  e can be found b
6200: 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65  y masking the re
6210: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66  turn value.** of
6220: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
6230: 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66  th 0xfff.  The f
6240: 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  lags can be foun
6250: 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65  d by masking the
6260: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
6270: 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64   with EP_Reduced
6280: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a  |EP_TokenOnly..*
6290: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
62a0: 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44  ith flags==EXPRD
62b0: 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20  UP_REDUCE, this 
62c0: 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f  routines works o
62d0: 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28  n full-size.** (
62e0: 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20  unreduced) Expr 
62f0: 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20  objects as they 
6300: 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f  or originally co
6310: 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65  nstructed by the
6320: 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69   parser..** Duri
6330: 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ng expression an
6340: 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e  alysis, extra in
6350: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d  formation is com
6360: 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20  puted and moved 
6370: 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61  into.** later pa
6380: 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20  rts of teh Expr 
6390: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20  object and that 
63a0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
63b0: 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70  n might get chop
63c0: 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68  ped.** off if th
63d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
63e0: 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61  reduced.  Note a
63f0: 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73  lso that it does
6400: 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20   not work to.** 
6410: 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f  make an EXPRDUP_
6420: 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61  REDUCE copy of a
6430: 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73   reduced express
6440: 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ion.  It is only
6450: 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64   legal.** to red
6460: 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65  uce a pristine e
6470: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66  xpression tree f
6480: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20  rom the parser. 
6490: 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
64a0: 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45  ion.** of dupedE
64b0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20  xprStructSize() 
64c0: 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65  contain multiple
64d0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
64e0: 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70  ents that attemp
64f0: 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20  t.** to enforce 
6500: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
6510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6520: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6530: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6540: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53  flags){.  int nS
6550: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ize;.  assert( f
6560: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
6570: 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30  DUCE || flags==0
6580: 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20   ); /* Only one 
6590: 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77  flag value allow
65a0: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
65b0: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30  EXPR_FULLSIZE<=0
65c0: 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74  xfff );.  assert
65d0: 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52  ( (0xfff & (EP_R
65e0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
65f0: 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66  nly))==0 );.  if
6600: 28 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52  ( 0==(flags&EXPR
6610: 44 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20  DUP_REDUCE) ){. 
6620: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
6630: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
6640: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
6650: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6660: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
6670: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
6680: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6690: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66a0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
66b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
66c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
66d0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
66e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
66f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6700: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
6710: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
6720: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
6730: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
6740: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6750: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
6760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6770: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
6780: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
6790: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
67a0: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
67b0: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
67c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
67d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
67e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
67f0: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
6800: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
6810: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
6820: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
6830: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
6840: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
6850: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
6860: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
6870: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
6880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6890: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
68a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
68b0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
68c0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
68d0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
68e0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
68f0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6900: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6910: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
6920: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
6930: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6940: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6950: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6960: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6970: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6980: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6990: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
69a0: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
69b0: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
69c0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
69d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
69e0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
69f0: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
6a00: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
6a10: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
6a20: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
6a30: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6a40: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6a50: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6a60: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6a70: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6a80: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6a90: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
6aa0: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
6ab0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6ac0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6ad0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6ae0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
6af0: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6b00: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6b10: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6b20: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6b30: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6b40: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6b50: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6b60: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6b70: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6b80: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6b90: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
6ba0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
6bb0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
6bc0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
6bd0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
6be0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6bf0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6c00: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6c10: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6c20: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6c30: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6c40: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6c50: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6c60: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6c70: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6c80: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6c90: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
6ca0: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
6cb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6cc0: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
6cd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ce0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
6cf0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6d00: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6d10: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6d20: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6d30: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6d40: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6d50: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6d60: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6d70: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6d80: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6d90: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
6da0: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
6db0: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
6dc0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
6dd0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
6de0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
6df0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
6e00: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
6e10: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
6e20: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
6e30: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
6e40: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
6e50: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
6e60: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
6e80: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
6e90: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
6ea0: 69 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a  int flags, u8 **
6eb0: 70 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70  pzBuffer){.  Exp
6ec0: 72 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *pNew = 0;    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
6ef0: 74 75 72 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  turn */.  assert
6f00: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
6f10: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6f20: 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UCE );.  assert(
6f30: 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20   db!=0 );.  if( 
6f40: 70 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  p ){.    const i
6f50: 6e 74 20 69 73 52 65 64 75 63 65 64 20 3d 20 28  nt isReduced = (
6f60: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6f70: 44 55 43 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a  DUCE);.    u8 *z
6f80: 41 6c 6c 6f 63 3b 0a 20 20 20 20 75 33 32 20 73  Alloc;.    u32 s
6f90: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a  taticFlag = 0;..
6fa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 42 75      assert( pzBu
6fb0: 66 66 65 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64  ffer==0 || isRed
6fc0: 75 63 65 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  uced );..    /* 
6fd0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72 65  Figure out where
6fe0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6e 65   to write the ne
6ff0: 77 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  w Expr structure
7000: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 7a 42  . */.    if( pzB
7010: 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 7a  uffer ){.      z
7020: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
7030: 72 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 46  r;.      staticF
7040: 6c 61 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b  lag = EP_Static;
7050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7060: 20 20 7a 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74    zAlloc = sqlit
7070: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
7080: 64 62 2c 20 64 75 70 65 64 45 78 70 72 53 69 7a  db, dupedExprSiz
7090: 65 28 70 2c 20 66 6c 61 67 73 29 29 3b 0a 20 20  e(p, flags));.  
70a0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 28    }.    pNew = (
70b0: 45 78 70 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a  Expr *)zAlloc;..
70c0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
70d0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6e 4e 65        /* Set nNe
70e0: 77 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  wSize to the siz
70f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
7100: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f  the structure po
7110: 69 6e 74 65 64 20 74 6f 0a 20 20 20 20 20 20 2a  inted to.      *
7120: 2a 20 62 79 20 70 4e 65 77 2e 20 54 68 69 73 20  * by pNew. This 
7130: 69 73 20 65 69 74 68 65 72 20 45 58 50 52 5f 46  is either EXPR_F
7140: 55 4c 4c 53 49 5a 45 2c 20 45 58 50 52 5f 52 45  ULLSIZE, EXPR_RE
7150: 44 55 43 45 44 53 49 5a 45 20 6f 72 0a 20 20 20  DUCEDSIZE or.   
7160: 20 20 20 2a 2a 20 45 58 50 52 5f 54 4f 4b 45 4e     ** EXPR_TOKEN
7170: 4f 4e 4c 59 53 49 5a 45 2e 20 6e 54 6f 6b 65 6e  ONLYSIZE. nToken
7180: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
7190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 63  umber of bytes c
71a0: 6f 6e 73 75 6d 65 64 0a 20 20 20 20 20 20 2a 2a  onsumed.      **
71b0: 20 62 79 20 74 68 65 20 63 6f 70 79 20 6f 66 20   by the copy of 
71c0: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
71d0: 73 74 72 69 6e 67 20 28 69 66 20 61 6e 79 29 2e  string (if any).
71e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
71f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e  const unsigned n
7200: 53 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70  StructSize = dup
7210: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
7220: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
7230: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
7240: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
7250: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
7260: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20    int nToken;.  
7270: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
7280: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49  Property(p, EP_I
7290: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75  ntValue) && p->u
72a0: 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20  .zToken ){.     
72b0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 73 71 6c 69     nToken = sqli
72c0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
72d0: 2e 7a 54 6f 6b 65 6e 29 20 2b 20 31 3b 0a 20 20  .zToken) + 1;.  
72e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
72f0: 20 20 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 0a 20     nToken = 0;. 
7300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7310: 20 69 73 52 65 64 75 63 65 64 20 29 7b 0a 20 20   isReduced ){.  
7320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
7330: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7340: 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20   EP_Reduced)==0 
7350: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
7360: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65  y(zAlloc, p, nNe
7370: 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
7380: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32  lse{.        u32
7390: 20 6e 53 69 7a 65 20 3d 20 28 75 33 32 29 65 78   nSize = (u32)ex
73a0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 29 3b  prStructSize(p);
73b0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
73c0: 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69 7a 65  zAlloc, p, nSize
73d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
73e0: 53 69 7a 65 3c 45 58 50 52 5f 46 55 4c 4c 53 49  Size<EXPR_FULLSI
73f0: 5a 45 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ZE ){ .         
7400: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7410: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7420: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7430: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7440: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
7450: 20 74 68 65 20 45 50 5f 52 65 64 75 63 65 64 2c   the EP_Reduced,
7460: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61   EP_TokenOnly, a
7470: 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61  nd EP_Static fla
7480: 67 73 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  gs appropriately
7490: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
74a0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50 5f 52  >flags &= ~(EP_R
74b0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
74c0: 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c 45 50  nly|EP_Static|EP
74d0: 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  _MemToken);.    
74e0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
74f0: 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20 28   nStructSize & (
7500: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
7510: 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  kenOnly);.      
7520: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 73  pNew->flags |= s
7530: 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20 20 20  taticFlag;..    
7540: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 2d    /* Copy the p-
7550: 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  >u.zToken string
7560: 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
7570: 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20 29 7b     if( nToken ){
7580: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
7590: 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75 2e  Token = pNew->u.
75a0: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
75b0: 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a 65  &zAlloc[nNewSize
75c0: 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ];.        memcp
75d0: 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a  y(zToken, p->u.z
75e0: 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
75f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
7600: 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61 67 73  f( 0==((p->flags
7610: 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20 26 20  |pNew->flags) & 
7620: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
7630: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c  .        /* Fill
7640: 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e 78 2e   in the pNew->x.
7650: 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65 77 2d  pSelect or pNew-
7660: 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65 72 2e  >x.pList member.
7670: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
7680: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7690: 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  p, EP_xIsSelect)
76a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
76b0: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  ew->x.pSelect = 
76c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
76d0: 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  (db, p->x.pSelec
76e0: 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20  t, isReduced);. 
76f0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7700: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
7710: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
7720: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
7730: 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52 65 64  ->x.pList, isRed
7740: 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  uced);.        }
7750: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7760: 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65 77 2d  /* Fill in pNew-
7770: 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65 77 2d  >pLeft and pNew-
7780: 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  >pRight. */.    
7790: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
77a0: 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52  perty(pNew, EP_R
77b0: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
77c0: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
77d0: 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65 64 45  zAlloc += dupedE
77e0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66  xprNodeSize(p, f
77f0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 69  lags);.        i
7800: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
7810: 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65 64 75  ty(pNew, EP_Redu
7820: 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ced) ){.        
7830: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
7840: 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  exprDup(db, p->p
7850: 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f 52 45  Left, EXPRDUP_RE
7860: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7870: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7880: 70 52 69 67 68 74 20 3d 20 65 78 70 72 44 75 70  pRight = exprDup
7890: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
78a0: 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c 20  EXPRDUP_REDUCE, 
78b0: 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  &zAlloc);.      
78c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
78d0: 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20  pzBuffer ){.    
78e0: 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65 72 20        *pzBuffer 
78f0: 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  = zAlloc;.      
7900: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
7910: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 45 78  .        if( !Ex
7920: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
7930: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
7940: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
7950: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7960: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7970: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7980: 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68       pNew->pRigh
7990: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
79a0: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
79b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
79c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20        }..    }. 
79d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
79f0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  e and return a d
7a00: 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68 65 20  eep copy of the 
7a10: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
7a20: 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
7a30: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61 6e 20  argument. If an 
7a40: 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  OOM condition is
7a50: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 4e 55   encountered, NU
7a60: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
7a70: 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e 6d 61  * and the db->ma
7a80: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
7a90: 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  set..*/.#ifndef 
7aa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7ab0: 73 74 61 74 69 63 20 57 69 74 68 20 2a 77 69 74  static With *wit
7ac0: 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  hDup(sqlite3 *db
7ad0: 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20 57 69  , With *p){.  Wi
7ae0: 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  th *pRet = 0;.  
7af0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
7b00: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
7b10: 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70 2d 3e  *p) + sizeof(p->
7b20: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43 74 65  a[0]) * (p->nCte
7b30: 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  -1);.    pRet = 
7b40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7b50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
7b60: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
7b70: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7b80: 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20 3d 20     pRet->nCte = 
7b90: 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20 20 66  p->nCte;.      f
7ba0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
7bb0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
7bc0: 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53 65 6c   pRet->a[i].pSel
7bd0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7be0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b  ectDup(db, p->a[
7bf0: 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  i].pSelect, 0);.
7c00: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b          pRet->a[
7c10: 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c 69 74  i].pCols = sqlit
7c20: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
7c30: 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 2c  , p->a[i].pCols,
7c40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65   0);.        pRe
7c50: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
7c60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
7c70: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  db, p->a[i].zNam
7c80: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7c90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7ca0: 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Ret;.}.#else.# d
7cb0: 65 66 69 6e 65 20 77 69 74 68 44 75 70 28 78 2c  efine withDup(x,
7cc0: 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y) 0.#endif../*.
7cd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
7ce0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
7cf0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
7d00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
7d10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
7d20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
7d30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
7d40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
7d50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
7d60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
7d70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
7d80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
7d90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
7da0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
7db0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
7dc0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
7dd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7de0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
7df0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
7e00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7e10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
7e20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
7e30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
7e40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
7e50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
7e60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
7e70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
7e80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
7e90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
7ea0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
7eb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
7ec0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
7ed0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
7ee0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
7ef0: 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
7f00: 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ns a combination
7f10: 20 6f 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   of the EXPRDUP_
7f20: 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20 49 66  XXX flags..** If
7f30: 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44   the EXPRDUP_RED
7f40: 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  UCE flag is set,
7f50: 20 74 68 65 6e 20 74 68 65 20 73 74 72 75 63 74   then the struct
7f60: 75 72 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  ure returned is 
7f70: 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 76  a.** truncated v
7f80: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 75 73  ersion of the us
7f90: 75 61 6c 20 45 78 70 72 20 73 74 72 75 63 74 75  ual Expr structu
7fa0: 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  re that will be 
7fb0: 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70 61 72  stored as.** par
7fc0: 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  t of the in-memo
7fd0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
7fe0: 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  n of the databas
7ff0: 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45 78 70  e schema..*/.Exp
8000: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44 75  r *sqlite3ExprDu
8010: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45  p(sqlite3 *db, E
8020: 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  xpr *p, int flag
8030: 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  s){.  assert( fl
8040: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
8050: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
8060: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
8070: 44 75 70 28 64 62 2c 20 70 2c 20 66 6c 61 67 73  Dup(db, p, flags
8080: 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c 69 73 74  , 0);.}.ExprList
8090: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
80a0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
80b0: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69  , ExprList *p, i
80c0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 45 78 70  nt flags){.  Exp
80d0: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
80e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
80f0: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
8100: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
8110: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
8120: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
8130: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
8140: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8150: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
8160: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
8170: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8180: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
8190: 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45  Expr = i = p->nE
81a0: 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  xpr;.  if( (flag
81b0: 73 20 26 20 45 58 50 52 44 55 50 5f 52 45 44 55  s & EXPRDUP_REDU
81c0: 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31  CE)==0 ) for(i=1
81d0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
81e0: 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20  =i){}.  pNew->a 
81f0: 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65  = pItem = sqlite
8200: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
8210: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8220: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8230: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8250: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8260: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8270: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8280: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8290: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
82a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
82b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
82c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
82d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
82e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
82f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8300: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8310: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8320: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8330: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8340: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8350: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8360: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8370: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8380: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8390: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
83a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
83b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
83c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
83d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
83e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
83f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8400: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8410: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8420: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8430: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8440: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8450: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8460: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8470: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8480: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8490: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
84a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
84b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
84c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
84d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
84e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
84f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8500: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8510: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8520: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8530: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8540: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8550: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8560: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8570: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8580: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8590: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
85a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
85b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
85c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
85d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 61 73 73  int nByte;.  ass
85e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
85f0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8600: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
8610: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
8620: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
8630: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
8640: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
8650: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
8660: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
8670: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
8680: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
8690: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
86a0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
86b0: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
86c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
86d0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
86e0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
86f0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
8700: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
8710: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
8720: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
8730: 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  i];.    Table *p
8740: 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  Tab;.    pNewIte
8750: 6d 2d 3e 70 53 63 68 65 6d 61 20 3d 20 70 4f 6c  m->pSchema = pOl
8760: 64 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61 3b 0a  dItem->pSchema;.
8770: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44      pNewItem->zD
8780: 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
8790: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
87a0: 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ldItem->zDatabas
87b0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
87c0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
87d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
87e0: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
87f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41      pNewItem->zA
8800: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 44 62  lias = sqlite3Db
8810: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8820: 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
8830: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67 20 3d    pNewItem->fg =
8840: 20 70 4f 6c 64 49 74 65 6d 2d 3e 66 67 3b 0a 20   pOldItem->fg;. 
8850: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
8860: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
8870: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
8880: 65 77 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c  ewItem->addrFill
8890: 53 75 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Sub = pOldItem->
88a0: 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a 20 20 20  addrFillSub;.   
88b0: 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65 67 52 65   pNewItem->regRe
88c0: 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  turn = pOldItem-
88d0: 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20  >regReturn;.    
88e0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
88f0: 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
8900: 20 20 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e        pNewItem->
8910: 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 20 3d 20  u1.zIndexedBy = 
8920: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8930: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31  db, pOldItem->u1
8940: 2e 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20  .zIndexedBy);.  
8950: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
8960: 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 4f 6c  ->pIBIndex = pOl
8970: 64 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78 3b  dItem->pIBIndex;
8980: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74 65  .    if( pNewIte
8990: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20  m->fg.isTabFunc 
89a0: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74 65  ){.      pNewIte
89b0: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d  m->u1.pFuncArg =
89c0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
89d0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
89e0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e  b, pOldItem->u1.
89f0: 70 46 75 6e 63 41 72 67 2c 20 66 6c 61 67 73 29  pFuncArg, flags)
8a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
8a10: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8a20: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8a30: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8a40: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8a50: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8a60: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8a70: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8a80: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8a90: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
8aa0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
8ab0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
8ac0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
8ad0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
8ae0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
8af0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8b00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8b10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8b20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8b30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8b40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8b50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8b60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8b70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8b80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8b90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8ba0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8bb0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
8bc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
8bd0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
8be0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8bf0: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
8c00: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
8c10: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
8c20: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
8c30: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
8c40: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62  w->a = sqlite3Db
8c50: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
8c60: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
8c70: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
8c80: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20  pNew->a==0 ){.  
8c90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8ca0: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 72  db, pNew);.    r
8cb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
8cc0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 65 63 61  * Note that beca
8cd0: 75 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  use the size of 
8ce0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  the allocation f
8cf0: 6f 72 20 70 2d 3e 61 5b 5d 20 69 73 20 6e 6f 74  or p->a[] is not
8d00: 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c  .  ** necessaril
8d10: 79 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  y a power of two
8d20: 2c 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  , sqlite3IdListA
8d30: 70 70 65 6e 64 28 29 20 6d 61 79 20 6e 6f 74 20  ppend() may not 
8d40: 62 65 20 63 61 6c 6c 65 64 0a 20 20 2a 2a 20 6f  be called.  ** o
8d50: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
8d60: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 20  created by this 
8d70: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  function. */.  f
8d80: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
8d90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
8da0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
8db0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
8dc0: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
8dd0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
8de0: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
8df0: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
8e00: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
8e10: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8e20: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
8e30: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
8e40: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
8e50: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
8e60: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
8e70: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
8e80: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
8e90: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
8ea0: 61 67 73 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a  ags){.  Select *
8eb0: 70 4e 65 77 2c 20 2a 70 50 72 69 6f 72 3b 0a 20  pNew, *pPrior;. 
8ec0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
8ed0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
8ee0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
8ef0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8f00: 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
8f10: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8f20: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8f30: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8f40: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8f50: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
8f60: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
8f70: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
8f80: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
8f90: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
8fa0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
8fb0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8fc0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8fd0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8fe0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8ff0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
9000: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
9010: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
9020: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
9030: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9040: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
9050: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
9060: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
9070: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
9080: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
9090: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
90a0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
90b0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
90c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
90d0: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
90e0: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
90f0: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
9100: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
9110: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
9120: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
9130: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9140: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
9150: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
9160: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
9170: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
9180: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
9190: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
91a0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
91b0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
91c0: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
91d0: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
91e0: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
91f0: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
9200: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
9210: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
9220: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
9230: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
9240: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
9250: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
9260: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
9270: 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  h);.  sqlite3Sel
9280: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
9290: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
92a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
92b0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
92c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
92d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
92e0: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
92f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
9300: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
9310: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
9320: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
9330: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
9340: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
9350: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
9360: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
9370: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
9380: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
9390: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
93a0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
93b0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
93c0: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
93d0: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
93e0: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
93f0: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
9400: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
9410: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
9420: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
9430: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
9440: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
9450: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
9460: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
9470: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
9480: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9490: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
94a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
94b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
94c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
94d0: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
94e0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
94f0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
9500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9510: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
9520: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
9530: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
9540: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9550: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  arse->db;.  asse
9560: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
9570: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
9580: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
9590: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
95a0: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
95b0: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
95c0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
95d0: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
95e0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
95f0: 6e 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 70  nExpr = 0;.    p
9600: 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
9610: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
9620: 62 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  b, sizeof(pList-
9630: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
9640: 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 20 67   pList->a==0 ) g
9650: 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 7d 65  oto no_mem;.  }e
9660: 6c 73 65 20 69 66 28 20 28 70 4c 69 73 74 2d 3e  lse if( (pList->
9670: 6e 45 78 70 72 20 26 20 28 70 4c 69 73 74 2d 3e  nExpr & (pList->
9680: 6e 45 78 70 72 2d 31 29 29 3d 3d 30 20 29 7b 0a  nExpr-1))==0 ){.
9690: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
96a0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 20  ist_item *a;.   
96b0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
96c0: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
96d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
96e0: 6c 6f 63 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  loc(db, pList->a
96f0: 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2a 32  , pList->nExpr*2
9700: 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61  *sizeof(pList->a
9710: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
9720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
9730: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
9740: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 61      pList->a = a
9750: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9760: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
9770: 20 69 66 28 20 31 20 29 7b 0a 20 20 20 20 73 74   if( 1 ){.    st
9780: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9790: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69  em *pItem = &pLi
97a0: 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78  st->a[pList->nEx
97b0: 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  pr++];.    memse
97c0: 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65  t(pItem, 0, size
97d0: 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20  of(*pItem));.   
97e0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20   pItem->pExpr = 
97f0: 70 45 78 70 72 3b 0a 20 20 7d 0a 20 20 72 65 74  pExpr;.  }.  ret
9800: 75 72 6e 20 70 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d  urn pList;..no_m
9810: 65 6d 3a 20 20 20 20 20 0a 20 20 2f 2a 20 41 76  em:     .  /* Av
9820: 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65 6d 6f  oid leaking memo
9830: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 68 61 73  ry if malloc has
9840: 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 20 20 73 71   failed. */.  sq
9850: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9860: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 73 71  db, pExpr);.  sq
9870: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9880: 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
9890: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
98a0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 6f 72  *.** Set the sor
98b0: 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65 20  t order for the 
98c0: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 20 6f 6e 20  last element on 
98d0: 74 68 65 20 67 69 76 65 6e 20 45 78 70 72 4c 69  the given ExprLi
98e0: 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
98f0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
9900: 72 74 4f 72 64 65 72 28 45 78 70 72 4c 69 73 74  rtOrder(ExprList
9910: 20 2a 70 2c 20 69 6e 74 20 69 53 6f 72 74 4f 72   *p, int iSortOr
9920: 64 65 72 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  der){.  if( p==0
9930: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
9940: 65 72 74 28 20 53 51 4c 49 54 45 5f 53 4f 5f 55  ert( SQLITE_SO_U
9950: 4e 44 45 46 49 4e 45 44 3c 30 20 26 26 20 53 51  NDEFINED<0 && SQ
9960: 4c 49 54 45 5f 53 4f 5f 41 53 43 3e 3d 30 20 26  LITE_SO_ASC>=0 &
9970: 26 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  & SQLITE_SO_DESC
9980: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
9990: 70 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  p->nExpr>0 );.  
99a0: 69 66 28 20 69 53 6f 72 74 4f 72 64 65 72 3c 30  if( iSortOrder<0
99b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
99c0: 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d  p->a[p->nExpr-1]
99d0: 2e 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49  .sortOrder==SQLI
99e0: 54 45 5f 53 4f 5f 41 53 43 20 29 3b 0a 20 20 20  TE_SO_ASC );.   
99f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
9a00: 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[p->nExpr-1].
9a10: 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
9a20: 69 53 6f 72 74 4f 72 64 65 72 3b 0a 7d 0a 0a 2f  iSortOrder;.}../
9a30: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
9a40: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20  rList.a[].zName 
9a50: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d  element of the m
9a60: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
9a70: 65 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68  ed item.** on th
9a80: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
9a90: 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d  t..**.** pList m
9aa0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c  ight be NULL fol
9ab0: 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72  lowing an OOM er
9ac0: 72 6f 72 2e 20 20 42 75 74 20 70 4e 61 6d 65 20  ror.  But pName 
9ad0: 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a  should never be.
9ae0: 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d  ** NULL.  If a m
9af0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9b00: 20 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72   fails, the pPar
9b10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9b20: 69 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20  iled flag.** is 
9b30: 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
9b40: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
9b50: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
9b60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
9b70: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9b80: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
9b90: 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f  *pList,        /
9ba0: 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20  * List to which 
9bb0: 74 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e  to add the span.
9bc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
9bd0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
9be0: 20 4e 61 6d 65 20 74 6f 20 62 65 20 61 64 64 65   Name to be adde
9bf0: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f  d */.  int dequo
9c00: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
9c10: 2a 20 54 72 75 65 20 74 6f 20 63 61 75 73 65 20  * True to cause 
9c20: 74 68 65 20 6e 61 6d 65 20 74 6f 20 62 65 20 64  the name to be d
9c30: 65 71 75 6f 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  equoted */.){.  
9c40: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
9c50: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
9c60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20  mallocFailed!=0 
9c70: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
9c80: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9c90: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9ca0: 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  m;.    assert( p
9cb0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
9cc0: 0a 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 4c  .    pItem = &pL
9cd0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
9ce0: 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  xpr-1];.    asse
9cf0: 72 74 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  rt( pItem->zName
9d00: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  ==0 );.    pItem
9d10: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
9d20: 33 44 62 53 74 72 4e 44 75 70 28 70 50 61 72 73  3DbStrNDup(pPars
9d30: 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 2d 3e 7a 2c  e->db, pName->z,
9d40: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
9d50: 69 66 28 20 64 65 71 75 6f 74 65 20 26 26 20 70  if( dequote && p
9d60: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 73 71  Item->zName ) sq
9d70: 6c 69 74 65 33 44 65 71 75 6f 74 65 28 70 49 74  lite3Dequote(pIt
9d80: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
9d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
9da0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53   ExprList.a[].zS
9db0: 70 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  pan element of t
9dc0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9dd0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
9de0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9df0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
9e00: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9e10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9e20: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 53  M error.  But pS
9e30: 70 61 6e 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  pan should never
9e40: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9e50: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9e60: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9e70: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
9e80: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
9e90: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
9ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9eb0: 53 65 74 53 70 61 6e 28 0a 20 20 50 61 72 73 65  SetSpan(.  Parse
9ec0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9ed0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9ee0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9ef0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
9f00: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9f10: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9f20: 70 61 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 53 70  pan. */.  ExprSp
9f30: 61 6e 20 2a 70 53 70 61 6e 20 20 20 20 20 20 20  an *pSpan       
9f40: 20 20 2f 2a 20 54 68 65 20 73 70 61 6e 20 74 6f    /* The span to
9f50: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 29 7b 0a   be added */.){.
9f60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9f70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
9f80: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 7c  sert( pList!=0 |
9f90: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
9fa0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
9fb0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
9fc0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9fd0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74   *pItem = &pList
9fe0: 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->a[pList->nExpr
9ff0: 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
a000: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
a010: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
a020: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a030: 7c 7c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d  || pItem->pExpr=
a040: 3d 70 53 70 61 6e 2d 3e 70 45 78 70 72 20 29 3b  =pSpan->pExpr );
a050: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
a060: 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 53  ee(db, pItem->zS
a070: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
a080: 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
a090: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
a0a0: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
a0b0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53          (int)(pS
a0e0: 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61  pan->zEnd - pSpa
a0f0: 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 7d  n->zStart));.  }
a100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
a110: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a120: 20 70 45 4c 69 73 74 20 63 6f 6e 74 61 69 6e 73   pEList contains
a130: 20 6d 6f 72 65 20 74 68 61 6e 20 69 4c 69 6d 69   more than iLimi
a140: 74 20 65 6c 65 6d 65 6e 74 73 2c 0a 2a 2a 20 6c  t elements,.** l
a150: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
a160: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
a170: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a180: 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e  ExprListCheckLen
a190: 67 74 68 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gth(.  Parse *pP
a1a0: 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73 74  arse,.  ExprList
a1b0: 20 2a 70 45 4c 69 73 74 2c 0a 20 20 63 6f 6e 73   *pEList,.  cons
a1c0: 74 20 63 68 61 72 20 2a 7a 4f 62 6a 65 63 74 0a  t char *zObject.
a1d0: 29 7b 0a 20 20 69 6e 74 20 6d 78 20 3d 20 70 50  ){.  int mx = pP
a1e0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
a1f0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
a200: 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73 74 63 61 73  LUMN];.  testcas
a210: 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  e( pEList && pEL
a220: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 20 29  ist->nExpr==mx )
a230: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
a240: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
a250: 6e 45 78 70 72 3d 3d 6d 78 2b 31 20 29 3b 0a 20  nExpr==mx+1 );. 
a260: 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
a270: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 6d 78 20  EList->nExpr>mx 
a280: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
a290: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a2a0: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
a2b0: 20 69 6e 20 25 73 22 2c 20 7a 4f 62 6a 65 63 74   in %s", zObject
a2c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a2d0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
a2e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a2f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a300: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a310: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
a320: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
a330: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
a340: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a350: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
a360: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
a370: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
a380: 3e 61 21 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e  >a!=0 || pList->
a390: 6e 45 78 70 72 3d 3d 30 20 29 3b 0a 20 20 66 6f  nExpr==0 );.  fo
a3a0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
a3b0: 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
a3c0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
a3d0: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
a3e0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a3f0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
a400: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a410: 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
a420: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
a430: 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
a440: 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 73  >zSpan);.  }.  s
a450: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a460: 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
a470: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a480: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
a490: 20 52 65 74 75 72 6e 20 74 68 65 20 62 69 74 77   Return the bitw
a4a0: 69 73 65 2d 4f 52 20 6f 66 20 61 6c 6c 20 45 78  ise-OR of all Ex
a4b0: 70 72 2e 66 6c 61 67 73 20 66 69 65 6c 64 73 20  pr.flags fields 
a4c0: 69 6e 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  in the given.** 
a4d0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 75 33 32  ExprList..*/.u32
a4e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a4f0: 46 6c 61 67 73 28 63 6f 6e 73 74 20 45 78 70 72  Flags(const Expr
a500: 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
a510: 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 6d 20 3d  int i;.  u32 m =
a520: 20 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   0;.  if( pList 
a530: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
a540: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
a550: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 45 78 70  i++){.       Exp
a560: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
a570: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
a580: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
a590: 70 45 78 70 72 29 20 29 20 6d 20 7c 3d 20 70 45  pExpr) ) m |= pE
a5a0: 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  xpr->flags;.    
a5b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
a5c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  ;.}../*.** These
a5d0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61   routines are Wa
a5e0: 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 75  lker callbacks u
a5f0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65 78 70  sed to check exp
a600: 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73  ressions to.** s
a610: 65 65 20 69 66 20 74 68 65 79 20 61 72 65 20 22  ee if they are "
a620: 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20 73 6f  constant" for so
a630: 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  me definition of
a640: 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a   constant.  The.
a650: 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20  ** Walker.eCode 
a660: 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e 65 73  value determines
a670: 20 74 68 65 20 74 79 70 65 20 6f 66 20 22 63 6f   the type of "co
a680: 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65 20 6c  nstant" we are l
a690: 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a  ooking.** for..*
a6a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62  *.** These callb
a6b0: 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ack routines are
a6c0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
a6d0: 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  nt the following
a6e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69  :.**.**     sqli
a6f0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a700: 74 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  t()             
a710: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
a720: 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71  ode==1.**     sq
a730: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a740: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20  antNotJoin()    
a750: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
a760: 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20  eCode==2.**     
a770: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
a780: 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20  leConstant()    
a790: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
a7a0: 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20  ->eCode==3.**   
a7b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
a7c0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
a7d0: 6e 28 29 20 20 20 20 20 20 20 20 70 57 61 6c 6b  n()        pWalk
a7e0: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
a7f0: 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63  5.**.** In all c
a800: 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c 62 61  ases, the callba
a810: 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72 2e 65  cks set Walker.e
a820: 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f 72 74  Code=0 and abort
a830: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a840: 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74  on.** is found t
a850: 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e 73 74  o not be a const
a860: 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ant..**.** The s
a870: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a880: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
a890: 20 69 73 20 75 73 65 64 20 66 6f 72 20 65 76 61   is used for eva
a8a0: 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73 73 69  luating expressi
a8b0: 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ons.** in a CREA
a8c0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
a8d0: 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65 72 2e  nt.  The Walker.
a8e0: 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73 20 35  eCode value is 5
a8f0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a   when parsing.**
a900: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 63 68   an existing sch
a910: 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e 20 70  ema and 4 when p
a920: 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65 77 20  rocessing a new 
a930: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f  statement.  A bo
a940: 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
a950: 20 72 61 69 73 65 73 20 61 6e 20 65 72 72 6f 72   raises an error
a960: 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65 6d 65   for new stateme
a970: 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69 6c 65  nts, but is sile
a980: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a  ntly converted.*
a990: 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78  * to NULL for ex
a9a0: 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73 2e 20  isting schemas. 
a9b0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c   This allows sql
a9c0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
a9d0: 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61  s that .** conta
a9e0: 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72 61 6d  in a bound param
a9f0: 65 74 65 72 20 62 65 63 61 75 73 65 20 74 68 65  eter because the
aa00: 79 20 77 65 72 65 20 67 65 6e 65 72 61 74 65 64  y were generated
aa10: 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
aa20: 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
aa30: 74 6f 20 62 65 20 70 61 72 73 65 64 20 62 79 20  to be parsed by 
aa40: 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
aa50: 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f 75 74  f SQLite without
aa60: 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61   raising a.** ma
aa70: 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61 20 65  lformed schema e
aa80: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
aa90: 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f  int exprNodeIsCo
aaa0: 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70  nstant(Walker *p
aab0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
aac0: 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70  xpr){..  /* If p
aad0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73  Walker->eCode is
aae0: 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d   2 then any term
aaf0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
ab00: 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72  on that comes fr
ab10: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f  om.  ** the ON o
ab20: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  r USING clauses 
ab30: 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64  of a left join d
ab40: 69 73 71 75 61 6c 69 66 69 65 73 20 74 68 65 20  isqualifies the 
ab50: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
ab60: 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69  from being consi
ab70: 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20  dered constant. 
ab80: 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b 65 72  */.  if( pWalker
ab90: 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20 45 78  ->eCode==2 && Ex
aba0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
abb0: 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
abc0: 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72  ) ){.    pWalker
abd0: 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  ->eCode = 0;.   
abe0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
abf0: 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  t;.  }..  switch
ac00: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ac10: 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66     /* Consider f
ac20: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 63  unctions to be c
ac30: 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c 20 74  onstant if all t
ac40: 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73 20 61  heir arguments a
ac50: 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20  re constant.    
ac60: 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20 70 57  ** and either pW
ac70: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ac80: 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75 6e 63  or 5 or the func
ac90: 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20 20 20  tion has the.   
aca0: 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   ** SQLITE_FUNC_
acb0: 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20  CONST flag. */. 
acc0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
acd0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
ace0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34  Walker->eCode>=4
acf0: 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65   || ExprHasPrope
ad00: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
ad10: 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  stFunc) ){.     
ad20: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
ad30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65  ntinue;.      }e
ad40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 57 61  lse{.        pWa
ad50: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
ad60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ad70: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
ad80: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
ad90: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
ada0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
adb0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
adc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
add0: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74  _COLUMN:.      t
ade0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
adf0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20  op==TK_ID );.   
ae00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ae10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
ae20: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
ae30: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ae40: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
ae50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ae60: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ae70: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
ae80: 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72       if( pWalker
ae90: 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20 70 45  ->eCode==3 && pE
aea0: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61  xpr->iTable==pWa
aeb0: 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a  lker->u.iCur ){.
aec0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
aed0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20  RC_Continue;.   
aee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aef0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
af00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
af10: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
af20: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65        }.    case
af30: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
af40: 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d      if( pWalker-
af50: 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20  >eCode==5 ){.   
af60: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
af70: 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64 20 70   convert bound p
af80: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
af90: 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f 66 20  ppear inside of 
afa0: 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 20 2a  CREATE.        *
afb0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  * statements int
afc0: 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61  o a NULL when pa
afd0: 72 73 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  rsing the CREATE
afe0: 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20   statement text 
aff0: 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  out.        ** o
b000: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
b010: 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ter table */.   
b020: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
b030: 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20   TK_NULL;.      
b040: 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c 6b 65  }else if( pWalke
b050: 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20  r->eCode==4 ){. 
b060: 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e         /* A boun
b070: 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 20 61  d parameter in a
b080: 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
b090: 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65  t that originate
b0a0: 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a  s from.        *
b0b0: 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  * sqlite3_prepar
b0c0: 65 28 29 20 63 61 75 73 65 73 20 61 6e 20 65 72  e() causes an er
b0d0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ror */.        p
b0e0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
b0f0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
b100: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b110: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
b120: 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  ll through */.  
b130: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
b140: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b150: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
b160: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
b170: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
b180: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
b190: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
b1a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
b1b0: 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64   ); /* selectNod
b1c0: 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c  eIsConstant will
b1d0: 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20   disallow */.   
b1e0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f     return WRC_Co
b1f0: 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74  ntinue;.  }.}.st
b200: 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e  atic int selectN
b210: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61  odeIsConstant(Wa
b220: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
b230: 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b  elect *NotUsed){
b240: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
b250: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
b260: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
b270: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
b280: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
b290: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
b2a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
b2b0: 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43 75 72  itFlag, int iCur
b2c0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
b2d0: 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
b2e0: 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65  izeof(w));.  w.e
b2f0: 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b  Code = initFlag;
b300: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
b310: 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73 43  ck = exprNodeIsC
b320: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65  onstant;.  w.xSe
b330: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
b340: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
b350: 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20  ant;.  w.u.iCur 
b360: 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  = iCur;.  sqlite
b370: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29  3WalkExpr(&w, p)
b380: 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43 6f  ;.  return w.eCo
b390: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  de;.}../*.** Wal
b3a0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b3b0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b3c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b3d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b3e0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
b3f0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
b400: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
b410: 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  on calls..**.** 
b420: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
b430: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
b440: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
b450: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
b460: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
b470: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
b480: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
b490: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
b4a0: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
b4b0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
b4c0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
b4d0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
b4e0: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
b4f0: 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b  sConst(p, 1, 0);
b500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
b510: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b520: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
b530: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
b540: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
b550: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
b560: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
b570: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
b580: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
b590: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
b5a0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
b5b0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
b5c0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
b5d0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
b5e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
b5f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
b600: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
b610: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
b620: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
b630: 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a  Const(p, 2, 0);.
b640: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
b650: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
b660: 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  .  Return non-ze
b670: 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ro if the expres
b680: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
b690: 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e 67  .** for any sing
b6a0: 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61  le row of the ta
b6b0: 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72 20  ble with cursor 
b6c0: 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72 20  iCur.  In other 
b6d0: 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78  words, the.** ex
b6e0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f  pression must no
b6f0: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  t refer to any n
b700: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
b710: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e   function nor an
b720: 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65 72  y.** table other
b730: 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69   than iCur..*/.i
b740: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
b750: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78  TableConstant(Ex
b760: 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72 29  pr *p, int iCur)
b770: 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  {.  return exprI
b780: 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43 75  sConst(p, 3, iCu
b790: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  r);.}../*.** Wal
b7a0: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b7b0: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b7c0: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b7d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
b7e0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
b7f0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
b800: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
b810: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
b820: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
b830: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
b840: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
b850: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
b860: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
b870: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
b880: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
b890: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
b8a0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
b8b0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
b8c0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
b8d0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
b8e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b8f0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
b900: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
b910: 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20 20  , u8 isInit){.  
b920: 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d 3d  assert( isInit==
b930: 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29  0 || isInit==1 )
b940: 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49  ;.  return exprI
b950: 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e  sConst(p, 4+isIn
b960: 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65  it, 0);.}..#ifde
b970: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
b980: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
b990: 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65  ** Walk an expre
b9a0: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
b9b0: 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
b9c0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
b9d0: 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 6f   a.** subquery o
b9e0: 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65  f some kind.  Re
b9f0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
ba00: 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72 69 65  are no subquerie
ba10: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ba20: 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53 75 62  3ExprContainsSub
ba30: 71 75 65 72 79 28 45 78 70 72 20 2a 70 29 7b 0a  query(Expr *p){.
ba40: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
ba50: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
ba60: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
ba70: 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72  e = 1;.  w.xExpr
ba80: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
ba90: 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
baa0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
bab0: 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65  ack = selectNode
bac0: 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71  IsConstant;.  sq
bad0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
bae0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
baf0: 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e  .eCode==0;.}.#en
bb00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
bb10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63  e expression p c
bb20: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
bb30: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
bb40: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
bb50: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
bb60: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
bb70: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
bb80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
bb90: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
bba0: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
bbb0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
bbc0: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
bbd0: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
bbe0: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
bbf0: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
bc00: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
bc10: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
bc20: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
bc30: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
bc40: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
bc50: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69  nt *pValue){.  i
bc60: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nt rc = 0;..  /*
bc70: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
bc80: 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  n is an integer 
bc90: 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74  literal that fit
bca0: 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  s in a signed 32
bcb0: 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65  -bit.  ** intege
bcc0: 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49  r, then the EP_I
bcd0: 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c  ntValue flag wil
bce0: 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
bcf0: 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73  een set */.  ass
bd00: 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49  ert( p->op!=TK_I
bd10: 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c  NTEGER || (p->fl
bd20: 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75  ags & EP_IntValu
bd30: 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  e)!=0.          
bd40: 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e   || sqlite3GetIn
bd50: 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  t32(p->u.zToken,
bd60: 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69   &rc)==0 );..  i
bd70: 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50  f( p->flags & EP
bd80: 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
bd90: 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e   *pValue = p->u.
bda0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75  iValue;.    retu
bdb0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74  rn 1;.  }.  swit
bdc0: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
bdd0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
bde0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
bdf0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
be00: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
be10: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
be20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
be30: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
be40: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
be50: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
be60: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
be70: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
be80: 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d     assert( v!=(-
be90: 32 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b  2147483647-1) );
bea0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
beb0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
bec0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
bed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bee0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  }.    default: b
bef0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
bf00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bf10: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
bf20: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
bf30: 63 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ce that the expr
bf40: 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55  ession can be NU
bf50: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  LL..**.** If the
bf60: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68   expression migh
bf70: 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20  t be NULL or if 
bf80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
bf90: 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a  s too complex.**
bfa0: 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20   to tell return 
bfb0: 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  TRUE.  .**.** Th
bfc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
bfd0: 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ed as an optimiz
bfe0: 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f  ation, to skip O
bff0: 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73  P_IsNull opcodes
c000: 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77  .** when we know
c010: 20 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61   that a value ca
c020: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48  nnot be NULL.  H
c030: 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f  ence, a false po
c040: 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72  sitive.** (retur
c050: 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69  ning TRUE when i
c060: 6e 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65  n fact the expre
c070: 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20  ssion can never 
c080: 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a  be NULL) might.*
c090: 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72  * be a small per
c0a0: 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74  formance hit but
c0b0: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61   is otherwise ha
c0c0: 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20  rmless.  On the 
c0d0: 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61  other.** hand, a
c0e0: 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20   false negative 
c0f0: 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45  (returning FALSE
c100: 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
c110: 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a   could be NULL).
c120: 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  ** will likely r
c130: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
c140: 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53  rrect answer.  S
c150: 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c  o when in doubt,
c160: 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e   return.** TRUE.
c170: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
c180: 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e  xprCanBeNull(con
c190: 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75  st Expr *p){.  u
c1a0: 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70  8 op;.  while( p
c1b0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c  ->op==TK_UPLUS |
c1c0: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e  | p->op==TK_UMIN
c1d0: 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65  US ){ p = p->pLe
c1e0: 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e  ft; }.  op = p->
c1f0: 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  op;.  if( op==TK
c200: 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d  _REGISTER ) op =
c210: 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63   p->op2;.  switc
c220: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
c230: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
c240: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
c250: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
c260: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
c270: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
c280: 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20  urn 0;.    case 
c290: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  TK_COLUMN:.     
c2a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62   assert( p->pTab
c2b0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  !=0 );.      ret
c2c0: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
c2d0: 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e  rty(p, EP_CanBeN
c2e0: 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  ull) ||.        
c2f0: 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e       (p->iColumn
c300: 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e  >=0 && p->pTab->
c310: 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d  aCol[p->iColumn]
c320: 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20  .notNull==0);.  
c330: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
c340: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
c350: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
c360: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
c370: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c380: 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63 68 20   constant which 
c390: 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68  would be.** unch
c3a0: 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66 66 69  anged by OP_Affi
c3b0: 6e 69 74 79 20 77 69 74 68 20 74 68 65 20 61 66  nity with the af
c3c0: 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69 6e 20  finity given in 
c3d0: 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
c3e0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
c3f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
c400: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
c410: 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69 6e 69  if the OP_Affini
c420: 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20  ty operation.** 
c430: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  can be omitted. 
c440: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 72   When in doubt r
c450: 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20 41 20  eturn FALSE.  A 
c460: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 0a 2a  false negative.*
c470: 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 20 20  * is harmless.  
c480: 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  A false positive
c490: 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e 20 72  , however, can r
c4a0: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77 72 6f  esult in the wro
c4b0: 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f  ng.** answer..*/
c4c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
c4d0: 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43  NeedsNoAffinityC
c4e0: 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78 70 72  hange(const Expr
c4f0: 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29 7b 0a   *p, char aff){.
c500: 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28 20 61    u8 op;.  if( a
c510: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ff==SQLITE_AFF_B
c520: 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  LOB ) return 1;.
c530: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
c540: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
c550: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
c560: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
c570: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
c580: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
c590: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
c5a0: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
c5b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
c5c0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
c5d0: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
c5e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
c5f0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
c600: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
c610: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
c620: 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  AT: {.      retu
c630: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
c640: 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d  FF_REAL || aff==
c650: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c660: 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  IC;.    }.    ca
c670: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
c680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
c690: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
c6a0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  T;.    }.    cas
c6b0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
c6c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
c6d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
c6e0: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
c6f0: 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62 6c 65  ssert( p->iTable
c700: 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e  >=0 );  /* p can
c710: 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66 20 61  not be part of a
c720: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
c730: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
c740: 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  n p->iColumn<0. 
c750: 20 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66           && (aff
c760: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
c770: 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  EGER || aff==SQL
c780: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
c790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
c7a0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ult: {.      ret
c7b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
c7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c7d0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
c7e0: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
c7f0: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
c800: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
c810: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
c820: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
c830: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
c840: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
c850: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
c860: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c870: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
c880: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
c890: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
c8a0: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
c8b0: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
c8c0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58  n 0;.}../*.** pX
c8d0: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 61   is the RHS of a
c8e0: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  n IN operator.  
c8f0: 49 66 20 70 58 20 69 73 20 61 20 53 45 4c 45 43  If pX is a SELEC
c900: 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
c910: 74 68 61 74 20 63 61 6e 20 62 65 20 73 69 6d 70  that can be simp
c920: 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69 72 65  lified to a dire
c930: 63 74 20 74 61 62 6c 65 20 61 63 63 65 73 73 2c  ct table access,
c940: 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20   then return.** 
c950: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c960: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c970: 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e 6f 74  t.  If pX is not
c980: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
c990: 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  ent,.** or if th
c9a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
c9b0: 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d  nt needs to be m
c9c0: 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f 20 61  anifested into a
c9d0: 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61   transient.** ta
c9e0: 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ble, then return
c9f0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65   NULL..*/.#ifnde
ca00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
ca10: 42 51 55 45 52 59 0a 73 74 61 74 69 63 20 53 65  BQUERY.static Se
ca20: 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64 61 74  lect *isCandidat
ca30: 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72 20 2a  eForInOpt(Expr *
ca40: 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  pX){.  Select *p
ca50: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
ca60: 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  c;.  ExprList *p
ca70: 45 4c 69 73 74 3b 0a 20 20 45 78 70 72 20 2a 70  EList;.  Expr *p
ca80: 52 65 73 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Res;.  Table *pT
ca90: 61 62 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ab;.  if( !ExprH
caa0: 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45  asProperty(pX, E
cab0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 20 72  P_xIsSelect) ) r
cac0: 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74  eturn 0;  /* Not
cad0: 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
cae0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
caf0: 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61 72 53  erty(pX, EP_VarS
cb00: 65 6c 65 63 74 29 20 20 29 20 72 65 74 75 72 6e  elect)  ) return
cb10: 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74   0;  /* Correlat
cb20: 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d  ed subq */.  p =
cb30: 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a   pX->x.pSelect;.
cb40: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
cb50: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
cb70: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
cb80: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65  T */.  if( p->se
cb90: 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
cba0: 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
cbb0: 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63  te) ){.    testc
cbc0: 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ase( (p->selFlag
cbd0: 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
cbe0: 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
cbf0: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a  =SF_Distinct );.
cc00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
cc10: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
cc20: 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
cc30: 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
cc40: 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65  regate );.    re
cc50: 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49  turn 0; /* No DI
cc60: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61  STINCT keyword a
cc70: 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20  nd no aggregate 
cc80: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d  functions */.  }
cc90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47  .  assert( p->pG
cca0: 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20  roupBy==0 );    
ccb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ccc0: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
ccd0: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  use */.  if( p->
cce0: 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20  pLimit ) return 
ccf0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cd00: 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20  /* Has no LIMIT 
cd10: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65  clause */.  asse
cd20: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
cd30: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
cd40: 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d     /* No LIMIT m
cd50: 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a  eans no OFFSET *
cd60: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  /.  if( p->pWher
cd70: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
cd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
cd90: 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  s no WHERE claus
cda0: 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d  e */.  pSrc = p-
cdb0: 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
cdc0: 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66   pSrc!=0 );.  if
cdd0: 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ( pSrc->nSrc!=1 
cde0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
cdf0: 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74       /* Single t
ce00: 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  erm in FROM clau
ce10: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  se */.  if( pSrc
ce20: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29  ->a[0].pSelect )
ce30: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f   return 0;     /
ce40: 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20  * FROM is not a 
ce50: 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65 77  subquery or view
ce60: 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72   */.  pTab = pSr
ce70: 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
ce80: 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
ce90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
cea0: 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  b->pSelect==0 );
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cec0: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
ced0: 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66  t a view */.  if
cee0: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
cef0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  ) ) return 0;   
cf00: 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
cf10: 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61  use not a virtua
cf20: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c  l table */.  pEL
cf30: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
cf40: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e  .  if( pEList->n
cf50: 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
cf60: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
cf70: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
cf80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 70  esult set */.  p
cf90: 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  Res = pEList->a[
cfa0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  0].pExpr;.  if( 
cfb0: 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  pRes->op!=TK_COL
cfc0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
cfd0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20     /* Result is 
cfe0: 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 61 73  a column */.  as
cff0: 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54 61 62  sert( pRes->iTab
d000: 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69  le==pSrc->a[0].i
d010: 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f  Cursor );  /* No
d020: 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
d030: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 72 65 74  ubquery */.  ret
d040: 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn p;.}.#endif 
d050: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
d060: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
d070: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63  * Code an OP_Onc
d080: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e  e instruction an
d090: 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  d allocate space
d0a0: 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52   for its flag. R
d0b0: 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64  eturn the .** ad
d0c0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
d0d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
d0e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65  .int sqlite3Code
d0f0: 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50 61 72  Once(Parse *pPar
d100: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
d110: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
d120: 70 50 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a  pParse);      /*
d130: 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   Virtual machine
d140: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
d150: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d160: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d170: 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e  _Once, pParse->n
d180: 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Once++);.}../*.*
d190: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d1a0: 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 65 20  that checks the 
d1b0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
d1c0: 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20   of index table 
d1d0: 69 43 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a  iCur to see if.*
d1e0: 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  * it contains an
d1f0: 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20  y NULL entries. 
d200: 20 43 61 75 73 65 20 74 68 65 20 72 65 67 69 73   Cause the regis
d210: 74 65 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c  ter at regHasNul
d220: 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74  l to be set.** t
d230: 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  o a non-NULL val
d240: 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61  ue if iCur conta
d250: 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43  ins no NULLs.  C
d260: 61 75 73 65 20 72 65 67 69 73 74 65 72 20 72 65  ause register re
d270: 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62  gHasNull.** to b
d280: 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  e set to NULL if
d290: 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f   iCur contains o
d2a0: 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20  ne or more NULL 
d2b0: 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  values..*/.stati
d2c0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
d2d0: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62  tHasNullFlag(Vdb
d2e0: 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20  e *v, int iCur, 
d2f0: 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b  int regHasNull){
d300: 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20  .  int addr1;.  
d310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d320: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
d330: 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
d340: 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
d350: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d360: 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 29  OP_Rewind, iCur)
d370: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
d380: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d390: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
d3a0: 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20 72 65  umn, iCur, 0, re
d3b0: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c  gHasNull);.  sql
d3c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d3d0: 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f  (v, OPFLAG_TYPEO
d3e0: 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d  FARG);.  VdbeCom
d3f0: 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73 74 5f  ment((v, "first_
d400: 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c 20 69  entry_in(%d)", i
d410: 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cur));.  sqlite3
d420: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d430: 61 64 64 72 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  addr1);.}...#ifn
d440: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d450: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
d460: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
d470: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
d480: 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
d490: 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
d4a0: 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
d4b0: 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
d4c0: 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
d4d0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
d4e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
d4f0: 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
d500: 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
d510: 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
d520: 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
d530: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
d540: 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
d550: 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
d560: 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
d570: 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
d580: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
d590: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
d5a0: 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
d5b0: 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
d5c0: 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
d5d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d5e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
d5f0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
d600: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
d610: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
d620: 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
d630: 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
d640: 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
d650: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d660: 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
d670: 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
d680: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
d690: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
d6a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
d6b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d6c0: 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
d6d0: 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
d6e0: 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
d6f0: 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
d700: 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
d710: 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
d720: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
d730: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
d740: 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
d750: 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
d760: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
d770: 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
d780: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
d790: 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
d7a0: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
d7b0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
d7c0: 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
d7d0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
d7e0: 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
d7f0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
d800: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
d810: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d820: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
d830: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
d840: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
d850: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
d860: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
d870: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
d880: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
d890: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
d8a0: 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
d8b0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d8c0: 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
d8d0: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
d8e0: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
d8f0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
d900: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
d910: 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
d920: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
d930: 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
d940: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d950: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
d960: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
d990: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
d9a0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
d9b0: 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
d9c0: 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
d9d0: 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
d9e0: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
da10: 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
da20: 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
da30: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
da40: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
da50: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
da60: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
da70: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
da80: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
da90: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
daa0: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
dab0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
dac0: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
dad0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
dae0: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
daf0: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
db00: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
db10: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
db20: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
db30: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
db40: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
db50: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
db60: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
db70: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
db80: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
db90: 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
dba0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ble..**.** The i
dbb0: 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  nFlags parameter
dbc0: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78   must contain ex
dbd0: 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
dbe0: 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
dbf0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
dc00: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20  IN_INDEX_LOOP.  
dc10: 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
dc20: 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
dc30: 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
dc40: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
dc50: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
dc60: 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20  d for a.** fast 
dc70: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
dc80: 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
dc90: 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
dca0: 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69  set, the.** IN i
dcb0: 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65  ndex will be use
dcc0: 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
dcd0: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
dce0: 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49   RHS of the.** I
dcf0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
dd00: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
dd10: 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
dd20: 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
dd30: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
dd40: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
dd50: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
dd60: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
dd70: 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
dd80: 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
dd90: 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
dda0: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
ddb0: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
ddc0: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
ddd0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
dde0: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
ddf0: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
de00: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
de10: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
de20: 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  ** has a UNIQUE 
de30: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e  constraint or UN
de40: 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  IQUE index..**.*
de50: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
de60: 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
de70: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
de80: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
de90: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
dea0: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
deb0: 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
dec0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
ded0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
dee0: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
def0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
df00: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
df10: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
df20: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
df30: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
df40: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
df50: 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
df60: 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
df70: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
df80: 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
df90: 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
dfa0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
dfb0: 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
dfc0: 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
dfd0: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
dfe0: 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
dff0: 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
e000: 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
e010: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
e020: 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
e030: 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
e040: 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
e050: 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
e060: 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
e070: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
e080: 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
e090: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
e0a0: 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
e0b0: 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
e0c0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
e0d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
e0e0: 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
e0f0: 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
e100: 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
e110: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
e120: 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
e130: 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
e140: 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
e150: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
e160: 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
e170: 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
e180: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
e190: 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
e1a0: 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
e1b0: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
e1c0: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
e1d0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
e1e0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
e1f0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
e200: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
e210: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
e220: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
e230: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
e240: 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
e250: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
e260: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
e270: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
e280: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
e290: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
e2a0: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
e2b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
e2c0: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
e2d0: 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
e2e0: 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
e2f0: 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
e300: 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
e310: 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
e320: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
e330: 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
e340: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
e350: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
e360: 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
e370: 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
e380: 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
e390: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
e3a0: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
e3b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e3c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
e3d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
e3e0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
e3f0: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75 33 32  e, Expr *pX, u32
e400: 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70   inFlags, int *p
e410: 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20  rRhsHasNull){.  
e420: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
e450: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
e460: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
e470: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
e4a0: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
e4b0: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
e4c0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
e4d0: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
e4e0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
e4f0: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
e500: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
e510: 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
e520: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e530: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
e540: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
e550: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
e560: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
e570: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
e580: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
e590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
e5a0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
e5b0: 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
e5c0: 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
e5d0: 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
e5e0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
e5f0: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
e600: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
e610: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
e620: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
e630: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
e640: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
e650: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
e660: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
e670: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
e680: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
e690: 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e 64 69   && (p = isCandi
e6a0: 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 58 29  dateForInOpt(pX)
e6b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
e6c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e6d0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
e6e0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
e6f0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
e700: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
e730: 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
e740: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
e770: 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  ssion <column> *
e780: 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b 20  /.    i16 iCol; 
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7b0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
e7c0: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
e7d0: 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
e800: 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
e810: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
e820: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
e830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e840: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
e850: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
e860: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e870: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
e880: 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
e890: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
e8a0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
e8b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e8c0: 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e8e0: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
e8f0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
e900: 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
e910: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
e920: 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  b;.    pExpr = p
e930: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
e940: 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d  Expr;.    iCol =
e950: 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69 43 6f   (i16)pExpr->iCo
e960: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
e970: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
e980: 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
e990: 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
e9a0: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
e9b0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
e9c0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
e9d0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
e9e0: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
e9f0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
ea00: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
ea10: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
ea20: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
ea30: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
ea40: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  me);..    /* Thi
ea50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
ea60: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
ea70: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
ea80: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
ea90: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
eaa0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
eab0: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
eac0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
ead0: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
eae0: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
eaf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
eb00: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
eb10: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
eb20: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
eb30: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
eb40: 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  se);.      VdbeC
eb50: 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
eb60: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
eb70: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
eb80: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
eb90: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
eba0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
ebb0: 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20  X_ROWID;..      
ebc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ebd0: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
ebe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ebf0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
ec20: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
ec30: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
ec40: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
ec50: 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72  ed by the compar
ec60: 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65  ison. If an inde
ec70: 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  x is to.      **
ec80: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
ec90: 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c  e of a temp-tabl
eca0: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72  e, it must be or
ecb0: 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a  dered according.
ecc0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73        ** to this
ecd0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ece0: 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43  nce.  */.      C
ecf0: 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
ed00: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
ed10: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
ed20: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45  e, pX->pLeft, pE
ed30: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
ed40: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
ed50: 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
ed60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
ed70: 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20  form the .      
ed80: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
ed90: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
eda0: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
edb0: 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
edc0: 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20    ** it is not, 
edd0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
ede0: 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e  le to use any in
edf0: 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dex..      */.  
ee00: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
ee10: 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  _ok = sqlite3Ind
ee20: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
ee30: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ee40: 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20  ].affinity);..  
ee50: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
ee60: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
ee70: 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
ee80: 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
ee90: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
eea0: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
eeb0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
eec0: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26  Col).         &&
eed0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
eee0: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
eef0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
ef00: 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20  , 0)==pReq.     
ef10: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
ef20: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
ef30: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73  nKeyCol==1 && Is
ef40: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
ef50: 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ))).        ){. 
ef60: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
ef70: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
ef80: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
ef90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
efa0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
efb0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
efc0: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
efd0: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
efe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
eff0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
f000: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
f010: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
f020: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
f030: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
f040: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
f050: 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
f060: 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
f070: 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
f080: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
f090: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
f0a0: 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
f0b0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
f0c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
f0d0: 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 21  rRhsHasNull && !
f0e0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
f0f0: 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  .notNull ){.    
f100: 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
f110: 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
f120: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
f130: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
f140: 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
f150: 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
f160: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
f170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f180: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
f190: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
f1a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f1b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
f1c0: 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65  preexisting inde
f1d0: 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  x is available f
f1e0: 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  or the IN clause
f1f0: 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44  .  ** and IN_IND
f200: 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c  EX_NOOP is an al
f210: 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a  lowed reply.  **
f220: 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20   and the RHS of 
f230: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
f240: 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61  is a list, not a
f250: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61   subquery.  ** a
f260: 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  nd the RHS is no
f270: 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20 68 61 73  t contant or has
f280: 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65   two or fewer te
f290: 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69  rms,.  ** then i
f2a0: 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63  t is not worth c
f2b0: 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
f2c0: 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76  eral table to ev
f2d0: 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20  aluate.  ** the 
f2e0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72  IN operator so r
f2f0: 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
f300: 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OOP..  */.  if( 
f310: 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28  eType==0.   && (
f320: 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
f330: 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26  EX_NOOP_OK).   &
f340: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
f350: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
f360: 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c  ect).   && (!sql
f370: 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
f380: 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78  ant(pX) || pX->x
f390: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32  .pList->nExpr<=2
f3a0: 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65  ).  ){.    eType
f3b0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   = IN_INDEX_NOOP
f3c0: 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a 20 20 69  ;.  }.     ..  i
f3d0: 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
f3e0: 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
f3f0: 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
f400: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
f410: 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
f420: 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
f430: 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
f440: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
f450: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
f460: 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
f470: 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
f480: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
f490: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
f4a0: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
f4b0: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
f4c0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
f4d0: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
f4e0: 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
f4f0: 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
f500: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
f510: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f520: 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
f530: 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
f540: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
f550: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
f560: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
f570: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
f580: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
f590: 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
f5a0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73   ){.      *prRhs
f5b0: 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61  HasNull = rMayHa
f5c0: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
f5d0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
f5e0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
f5f0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
f600: 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  pX, rMayHaveNull
f610: 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  , eType==IN_INDE
f620: 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50  X_ROWID);.    pP
f630: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
f640: 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
f650: 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  op;.  }else{.   
f660: 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
f670: 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ab;.  }.  return
f680: 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
f690: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
f6a0: 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
f6b0: 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
f6c0: 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
f6d0: 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
f6e0: 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
f6f0: 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
f700: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
f710: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
f720: 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
f730: 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
f740: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
f750: 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
f760: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
f770: 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
f780: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
f790: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
f7a0: 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
f7b0: 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
f7c0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
f7d0: 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
f7e0: 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
f7f0: 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
f800: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
f810: 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
f820: 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
f830: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
f840: 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
f850: 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
f860: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
f870: 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
f880: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
f890: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
f8a0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
f8b0: 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
f8c0: 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
f8d0: 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
f8e0: 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
f8f0: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
f900: 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
f910: 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
f920: 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
f930: 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
f940: 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
f950: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
f960: 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
f970: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
f980: 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
f990: 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
f9a0: 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
f9b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
f9c0: 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
f9d0: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
f9e0: 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
f9f0: 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
fa00: 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
fa10: 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
fa20: 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
fa30: 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
fa40: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
fa50: 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
fa60: 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65  lize the registe
fa70: 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
fa80: 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55  aveNull.** to NU
fa90: 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
faa0: 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20  tines will take 
fab0: 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
fac0: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a   this register.*
fad0: 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  * value to non-N
fae0: 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
faf0: 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
fb00: 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
fb10: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
fb20: 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
fb30: 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
fb40: 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
fb50: 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74  .  For IN operat
fb60: 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
fb70: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72  or occurs, the r
fb80: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30  eturn value is 0
fb90: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
fba0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
fbb0: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
fbc0: 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
fbd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
fbe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
fbf0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
fc00: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
fc10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
fc20: 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
fc30: 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
fc40: 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
fc50: 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
fc60: 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
fc70: 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
fc80: 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
fc90: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
fca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
fcb0: 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
fcc0: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
fcd0: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
fce0: 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
fcf0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
fd00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
fd10: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
fd20: 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
fd30: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd50: 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
fd60: 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
fd70: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
fd80: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fd90: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
fda0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
fdb0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
fdc0: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
fdd0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
fde0: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
fdf0: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
fe00: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
fe10: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
fe20: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
fe30: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
fe40: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
fe50: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
fe60: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
fe70: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
fe80: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
fe90: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
fea0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
feb0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
fec0: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
fed0: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
fee0: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
fef0: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
ff00: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
ff10: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
ff20: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
ff30: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
ff40: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
ff50: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
ff60: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
ff70: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
ff80: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
ff90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ffa0: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
ffb0: 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66  ct) ){.    jmpIf
ffc0: 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65  Dynamic = sqlite
ffd0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
ffe0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
fff0: 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  v);.  }..#ifndef
10000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
10010 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
10020 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
10030 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
10040 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10050 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58  (pParse->db, "EX
10060 45 43 55 54 45 20 25 73 25 73 20 53 55 42 51 55  ECUTE %s%s SUBQU
10070 45 52 59 20 25 64 22 2c 0a 20 20 20 20 20 20 20  ERY %d",.       
10080 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30   jmpIfDynamic>=0
10090 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20  ?"":"CORRELATED 
100a0 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ",.        pExpr
100b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53  ->op==TK_IN?"LIS
100c0 54 22 3a 22 53 43 41 4c 41 52 22 2c 0a 20 20 20  T":"SCALAR",.   
100d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 4e 65       pParse->iNe
100e0 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29  xtSelectId.    )
100f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10100 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
10110 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
10120 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
10130 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
10140 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
10150 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
10160 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
10170 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
10180 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20  ar affinity;    
10190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
101a0 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53  inity of the LHS
101b0 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20   of the IN */.  
101c0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
101f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
10200 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
10210 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
10220 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20  = pExpr->pLeft; 
10230 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  /* the LHS of th
10240 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  e IN operator */
10250 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
10260 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
10270 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d     /* Key inform
10280 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ation */..      
10290 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
102a0 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
102b0 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
102c0 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
102d0 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
102e0 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
102f0 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
10300 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
10310 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
10320 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20   the same way.  
10330 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  An ephemeral tab
10340 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  le is .      ** 
10350 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67  filled with sing
10360 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b  le-field index k
10370 65 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67  eys representing
10380 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
10390 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53     ** from the S
103a0 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78  ELECT or the <ex
103b0 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a  prlist>..      *
103c0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
103d0 65 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e  e 'x' expression
103e0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c   is a column val
103f0 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43  ue, or the SELEC
10400 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  T....      ** st
10410 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20  atement returns 
10420 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20  a column value, 
10430 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74  then the affinit
10440 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20  y of that.      
10450 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  ** column is use
10460 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69  d to build the i
10470 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f  ndex keys. If bo
10480 74 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20  th 'x' and the. 
10490 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e       ** SELECT..
104a0 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
104b0 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
104c0 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69  meric affinity i
104d0 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  s used.      ** 
104e0 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e  if either column
104f0 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20   has NUMERIC or 
10500 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79  INTEGER affinity
10510 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20  . If neither.   
10520 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68     ** 'x' nor th
10530 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  e SELECT... stat
10540 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
10550 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
10560 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a  affinity.      *
10570 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20  * is used..     
10580 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
10590 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
105a0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
105b0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
105c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
105d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45  penEphemeral, pE
105e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73  xpr->iTable, !is
105f0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b  Rowid);.      pK
10600 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64  eyInfo = isRowid
10610 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65   ? 0 : sqlite3Ke
10620 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
10630 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20  e->db, 1, 1);.. 
10640 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
10650 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
10660 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
10670 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
10680 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   1:     expr IN 
10690 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20  (SELECT ...).   
106a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
106b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
106c0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65   to write the re
106d0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
106e0 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d  ect into the tem
106f0 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a  porary.        *
10700 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65  * table allocate
10710 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f  d and opened abo
10720 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
10730 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
10740 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e  Select = pExpr->
10750 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
10760 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
10770 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  st;.        Expr
10780 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20  List *pEList;.. 
10790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
107a0 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  isRowid );.     
107b0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
107c0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
107d0 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
107e0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  iTable);.       
107f0 20 64 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20   dest.affSdst = 
10800 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20  (u8)affinity;.  
10810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
10820 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
10830 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
10840 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
10850 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d     pSelect->iLim
10860 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
10870 74 65 73 74 63 61 73 65 28 20 70 53 65 6c 65 63  testcase( pSelec
10880 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
10890 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
108a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
108b0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a  KeyInfo==0 ); /*
108c0 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69   Caused by OOM i
108d0 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
108e0 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20  Alloc() */.     
108f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
10900 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10910 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a  lect, &dest) ){.
10920 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10930 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
10940 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  eyInfo);.       
10950 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
10960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
10970 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
10980 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
10990 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
109a0 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77  o!=0 ); /* OOM w
109b0 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20 61  ill cause exit a
109c0 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65  fter sqlite3Sele
109d0 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ct() */.        
109e0 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
109f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
10a00 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
10a10 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  pr>0 );.        
10a20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
10a30 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
10a40 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20  e(pKeyInfo) );. 
10a50 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
10a60 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69  >aColl[0] = sqli
10a70 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
10a80 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10a90 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
10ae0 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
10af0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
10b00 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  YS(pExpr->x.pLis
10b10 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
10b20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
10b30 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
10b40 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
10b50 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63        ** For eac
10b60 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
10b70 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
10b80 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
10b90 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
10ba0 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
10bb0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
10bc0 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
10bd0 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
10be0 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
10bf0 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
10c00 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
10c10 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
10c20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
10c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
10c40 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
10c50 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
10c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
10c70 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
10c80 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
10c90 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
10ca0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45          struct E
10cb0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
10cc0 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  tem;.        int
10cd0 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20   r1, r2, r3;..  
10ce0 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e        if( !affin
10cf0 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ity ){.         
10d00 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49   affinity = SQLI
10d10 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20  TE_AFF_BLOB;.   
10d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10d30 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
10d40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
10d50 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
10d60 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
10d70 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
10d80 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c    pKeyInfo->aCol
10d90 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78  l[0] = sqlite3Ex
10da0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
10db0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
10dc0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
10dd0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
10de0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
10df0 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
10e00 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31  >. */.        r1
10e10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
10e20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
10e30 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
10e40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
10e50 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
10e60 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69  ( isRowid ) sqli
10e70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10e80 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29   OP_Null, 0, r2)
10e90 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
10ea0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  pList->nExpr, pI
10eb0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e  tem=pList->a; i>
10ec0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
10ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
10ee0 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70   *pE2 = pItem->p
10ef0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
10f00 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a  int iValToIns;..
10f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10f20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10f30 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74  s not constant t
10f40 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64  hen we will need
10f50 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
10f60 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 73   disable the tes
10f70 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65 72  t that was gener
10f80 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74 20  ated above that 
10f90 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20  makes sure.     
10fa0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64       ** this cod
10fb0 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20  e only executes 
10fc0 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20 66  once.  Because f
10fd0 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e  or a non-constan
10fe0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
10ff0 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65  xpression we nee
11000 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20  d to rerun this 
11010 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a  code each time..
11020 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
11030 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66         if( jmpIf
11040 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73  Dynamic>=0 && !s
11050 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
11060 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20  tant(pE2) ){.   
11070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11080 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
11090 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  (v, jmpIfDynamic
110a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
110b0 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31  mpIfDynamic = -1
110c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
110d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
110e0 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
110f0 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
11100 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
11110 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
11120 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 26     if( isRowid &
11130 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
11140 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56 61  nteger(pE2, &iVa
11150 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20  lToIns) ){.     
11160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11170 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11180 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d  nsertInt, pExpr-
11190 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61  >iTable, r2, iVa
111a0 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20  lToIns);.       
111b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
111c0 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74        r3 = sqlit
111d0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
111e0 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31  (pParse, pE2, r1
111f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
11200 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20  f( isRowid ){.  
11210 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11220 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11230 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
11240 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11260 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75     sqlite3VdbeCu
11270 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
11280 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  .              V
11290 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
112b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
112c0 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45  v, OP_Insert, pE
112d0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
112e0 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r3);.          
112f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11310 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
11320 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31  akeRecord, r3, 1
11330 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c  , r2, &affinity,
11340 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   1);.           
11350 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
11360 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
11370 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29  e(pParse, r3, 1)
11380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113a0 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
113b0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
113c0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20  , r2);.         
113d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
113e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
113f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
11400 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
11410 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
11420 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11430 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
11440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11450 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
11460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11470 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
11480 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79  dr, (void *)pKey
11490 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
114a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
114b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
114c0 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
114d0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
114e0 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75  ELECT:.    defau
114f0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  lt: {.      /* I
11500 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62 65  f this has to be
11510 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
11520 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
11530 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
11540 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
11550 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
11560 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
11570 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
11580 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
11590 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
115a0 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69  iColumn.  If thi
115b0 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20  s is an EXISTS, 
115c0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61  write.      ** a
115d0 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74  n integer 0 (not
115e0 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28 65   exists) or 1 (e
115f0 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65  xists) into a me
11600 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20  mory cell.      
11610 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ** and record th
11620 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  at memory cell i
11630 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
11640 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
11650 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20   *pSel;         
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
11680 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f  ent to encode */
11690 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
116a0 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  t dest;         
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116c0 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68  How to deal with
116d0 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a   SELECt result *
116e0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
116f0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
11700 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20  _EXISTS );.     
11710 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
11720 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
11730 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11740 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
11750 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e  XISTS || pExpr->
11760 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
11770 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
11780 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
11790 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
117a0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53  ect) );.      pS
117b0 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53  el = pExpr->x.pS
117c0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c  elect;.      sql
117d0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
117e0 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70  it(&dest, 0, ++p
117f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  Parse->nMem);.  
11800 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
11810 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
11820 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
11830 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  st = SRT_Mem;.  
11840 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73 74        dest.iSdst
11850 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
11860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11870 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11880 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69  _Null, 0, dest.i
11890 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20  SDParm);.       
118a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
118b0 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79 20   "Init subquery 
118c0 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20  result"));.     
118d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
118e0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
118f0 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20  _Exists;.       
11900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11910 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11920 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72  , 0, dest.iSDPar
11930 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  m);.        Vdbe
11940 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69  Comment((v, "Ini
11950 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74 22  t EXISTS result"
11960 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
11970 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11980 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
11990 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  pSel->pLimit);. 
119a0 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69       pSel->pLimi
119b0 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
119c0 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
119d0 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  GER, 0, 0,.     
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 71               &sq
11a00 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
11a10 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e  ]);.      pSel->
11a20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
11a30 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
11a40 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
11a50 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ue;.      if( sq
11a60 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
11a70 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
11a80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11a90 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
11aa0 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
11ab0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
11ac0 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
11ad0 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
11ae0 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
11af0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
11b00 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
11b10 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
11b20 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
11b30 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11b40 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
11b50 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
11b60 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
11b70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11b80 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
11b90 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
11ba0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
11bb0 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
11bc0 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
11bd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11be0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
11bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11c00 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
11c10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
11c20 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
11c30 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
11c40 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
11c50 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
11c60 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
11c70 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
11c80 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
11c90 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
11ca0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
11cb0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
11cc0 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
11cd0 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
11ce0 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
11cf0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11d00 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
11d10 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
11d20 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
11d30 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
11d40 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
11d50 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
11d60 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
11d70 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
11d80 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
11d90 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
11da0 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
11db0 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
11dc0 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
11dd0 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
11de0 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
11df0 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
11e00 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
11e10 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
11e20 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
11e30 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
11e40 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
11e50 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
11e60 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
11e70 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
11e80 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
11e90 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
11ea0 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
11eb0 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
11ec0 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
11ed0 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
11ee0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
11ef0 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
11f00 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
11f10 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11f20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
11f30 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
11f40 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
11f50 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
11f60 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
11f70 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
11f80 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
11f90 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
11fa0 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
11fb0 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
11fc0 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
11fd0 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
11fe0 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
11ff0 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
12000 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
12010 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
12020 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
12030 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
12040 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
12050 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
12060 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  s */.  char affi
12070 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  nity;        /* 
12080 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e  Comparison affin
12090 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ity to use */.  
120a0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
120b0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
120c0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
120d0 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
120e0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
120f0 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
12100 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
12110 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
12120 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
12130 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  truction */..  /
12140 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48  * Compute the RH
12150 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20  S.   After this 
12160 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20  step, the table 
12170 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a  with cursor.  **
12180 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77   pExpr->iTable w
12190 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ill contains the
121a0 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
121b0 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20  e up the RHS..  
121c0 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
121d0 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
121e0 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
121f0 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
12200 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
12210 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
12220 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
12230 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
12240 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
12250 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
12260 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
12290 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
122a0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
122b0 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
122e0 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
122f0 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20  RhsHasNull);..  
12300 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
12310 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
12320 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
12330 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
12340 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65  ts.  ** of the e
12350 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
12360 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
12370 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
12380 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20  itable for.  ** 
12390 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P4 of OP_MakeRec
123a0 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69  ord..  */.  affi
123b0 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
123c0 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
123d0 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  ;..  /* Code the
123e0 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
123f0 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
12400 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20   (...)"..  */.  
12410 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
12420 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
12430 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
12440 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12450 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
12460 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
12470 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20  >pLeft, r1);..  
12480 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
12490 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
124a0 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
124b0 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
124c0 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
124d0 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
124e0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
124f0 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
12500 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
12510 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
12520 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
12530 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
12540 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
12550 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
12560 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
12570 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
12580 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12590 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
125a0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
125b0 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
125c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
125d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
125e0 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
125f0 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
12600 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
12610 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
12620 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12630 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
12640 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
12650 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
12660 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
12670 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
12680 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
12690 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
126a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
126b0 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
126c0 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
126d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
126e0 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
126f0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
12700 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
12710 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
12720 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
12730 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
12740 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
12750 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
12760 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
12770 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
12780 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
12790 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
127a0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
127b0 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
127c0 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
127d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
127e0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
127f0 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
12800 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
12810 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12820 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
12830 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
12840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12850 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
12860 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
12870 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
12880 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
12890 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
128a0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
128b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
128c0 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
128d0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
128e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
128f0 76 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  v, affinity);.  
12900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12910 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
12920 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
12930 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
12940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12950 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65  v, OP_Ne, r1, de
12960 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
12990 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
129a0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
129b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
129c0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
129d0 28 76 2c 20 61 66 66 69 6e 69 74 79 20 7c 20 53  (v, affinity | S
129e0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
129f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12a00 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12a10 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12a20 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
12a30 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
12a40 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
12a50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12a60 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
12a70 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
12a80 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
12a90 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
12aa0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
12ab0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
12ac0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
12ad0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
12ae0 20 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73   labelOk);.    s
12af0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12b00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
12b10 43 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  CkNull);.  }else
12b20 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  {.  .    /* If t
12b30 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20  he LHS is NULL, 
12b40 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
12b50 69 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20  is either false 
12b60 6f 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e  or NULL dependin
12b70 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74  g.    ** on whet
12b80 68 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65  her the RHS is e
12b90 6d 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73  mpty or not, res
12ba0 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a  pectively..    *
12bb0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
12bc0 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
12bd0 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
12be0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 49 66        if( destIf
12bf0 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73  Null==destIfFals
12c00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
12c10 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
12c20 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
12c30 72 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64  re the false and
12c40 20 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61   NULL outcomes a
12c50 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
12c60 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e same. */.     
12c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12c80 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c  dOp2(v, OP_IsNul
12c90 6c 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c  l, r1, destIfNul
12ca0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
12cb0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
12cc0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
12cd0 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
12ce0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f  eAddOp1(v, OP_No
12cf0 74 4e 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65  tNull, r1); Vdbe
12d00 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12d20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
12d30 69 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ind, pExpr->iTab
12d40 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  le, destIfFalse)
12d50 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
12d60 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
12d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
12d80 74 6f 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  to(v, destIfNull
12d90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12da0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12db0 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
12dc0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
12dd0 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44  f( eType==IN_IND
12de0 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  EX_ROWID ){.    
12df0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
12e00 65 2c 20 74 68 65 20 52 48 53 20 69 73 20 74 68  e, the RHS is th
12e10 65 20 52 4f 57 49 44 20 6f 66 20 74 61 62 6c 65  e ROWID of table
12e20 20 62 2d 74 72 65 65 0a 20 20 20 20 20 20 2a 2f   b-tree.      */
12e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12e40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
12e50 75 73 74 42 65 49 6e 74 2c 20 72 31 2c 20 64 65  ustBeInt, r1, de
12e60 73 74 49 66 46 61 6c 73 65 29 3b 20 56 64 62 65  stIfFalse); Vdbe
12e70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12e80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12e90 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
12ea0 69 73 74 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  ists, pExpr->iTa
12eb0 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65  ble, destIfFalse
12ec0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
12ed0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
12ef0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
12f00 74 68 65 20 52 48 53 20 69 73 20 61 6e 20 69 6e  the RHS is an in
12f10 64 65 78 20 62 2d 74 72 65 65 2e 0a 20 20 20 20  dex b-tree..    
12f20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
12f30 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12f40 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 72 31 2c  OP_Affinity, r1,
12f50 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
12f60 2c 20 31 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f  , 1);.  .      /
12f70 2a 20 49 66 20 74 68 65 20 73 65 74 20 6d 65 6d  * If the set mem
12f80 62 65 72 73 68 69 70 20 74 65 73 74 20 66 61 69  bership test fai
12f90 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ls, then the res
12fa0 75 6c 74 20 6f 66 20 74 68 65 20 0a 20 20 20 20  ult of the .    
12fb0 20 20 2a 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29    ** "x IN (...)
12fc0 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73  " expression mus
12fd0 74 20 62 65 20 65 69 74 68 65 72 20 30 20 6f 72  t be either 0 or
12fe0 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 73 65   NULL. If the se
12ff0 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61  t.      ** conta
13000 69 6e 73 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75  ins no NULL valu
13010 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  es, then the res
13020 75 6c 74 20 69 73 20 30 2e 20 49 66 20 74 68 65  ult is 0. If the
13030 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 63   set .      ** c
13040 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
13050 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c  ore NULL values,
13060 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
13070 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
13080 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
13090 6c 73 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20  lso NULL..      
130a0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
130b0 20 64 65 73 74 49 66 46 61 6c 73 65 21 3d 64 65   destIfFalse!=de
130c0 73 74 49 66 4e 75 6c 6c 20 7c 7c 20 72 52 68 73  stIfNull || rRhs
130d0 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  HasNull==0 );.  
130e0 20 20 20 20 69 66 28 20 72 52 68 73 48 61 73 4e      if( rRhsHasN
130f0 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
13100 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
13110 20 72 75 6e 73 20 69 66 20 69 74 20 69 73 20 6b   runs if it is k
13120 6e 6f 77 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20  nown at compile 
13130 74 69 6d 65 20 74 68 61 74 20 74 68 65 20 52 48  time that the RH
13140 53 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  S.        ** can
13150 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c  not contain NULL
13160 20 76 61 6c 75 65 73 2e 20 54 68 69 73 20 68 61   values. This ha
13170 70 70 65 6e 73 20 61 73 20 74 68 65 20 72 65 73  ppens as the res
13180 75 6c 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ult.        ** o
13190 66 20 61 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63  f a "NOT NULL" c
131a0 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 74 68 65  onstraint in the
131b0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
131c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
131d0 20 20 20 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e       ** Also run
131e0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 66 20   this branch if 
131f0 4e 55 4c 4c 20 69 73 20 65 71 75 69 76 61 6c 65  NULL is equivale
13200 6e 74 20 74 6f 20 46 41 4c 53 45 0a 20 20 20 20  nt to FALSE.    
13210 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20      ** for this 
13220 70 61 72 74 69 63 75 6c 61 72 20 49 4e 20 6f 70  particular IN op
13230 65 72 61 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  erator..        
13240 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
13250 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
13260 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20  v, OP_NotFound, 
13270 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
13280 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 2c 20  estIfFalse, r1, 
13290 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
132a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
132b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
132c0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 62 72 61    /* In this bra
132d0 6e 63 68 2c 20 74 68 65 20 52 48 53 20 6f 66 20  nch, the RHS of 
132e0 74 68 65 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e  the IN might con
132f0 74 61 69 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a  tain a NULL and.
13300 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
13310 72 65 73 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c  resence of a NUL
13320 4c 20 6f 6e 20 74 68 65 20 52 48 53 20 6d 61 6b  L on the RHS mak
13330 65 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 20  es a difference 
13340 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  in the.        *
13350 2a 20 6f 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20  * outcome..     
13360 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
13370 74 20 61 64 64 72 31 3b 0a 20 20 0a 20 20 20 20  t addr1;.  .    
13380 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 68 65      /* First che
13390 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
133a0 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69 6e 65   LHS is containe
133b0 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  d in the RHS.  I
133c0 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  f so,.        **
133d0 20 74 68 65 6e 20 74 68 65 20 61 6e 73 77 65 72   then the answer
133e0 20 69 73 20 54 52 55 45 20 74 68 65 20 70 72 65   is TRUE the pre
133f0 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69  sence of NULLs i
13400 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73 0a 20  n the RHS does. 
13410 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61         ** not ma
13420 74 74 65 72 2e 20 20 49 66 20 74 68 65 20 4c 48  tter.  If the LH
13430 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
13440 65 64 20 69 6e 20 74 68 65 20 52 48 53 2c 20 74  ed in the RHS, t
13450 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
13460 2a 2a 20 61 6e 73 77 65 72 20 69 73 20 4e 55 4c  ** answer is NUL
13470 4c 20 69 66 20 74 68 65 20 52 48 53 20 63 6f 6e  L if the RHS con
13480 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20  tains NULLs and 
13490 74 68 65 20 61 6e 73 77 65 72 20 69 73 0a 20 20  the answer is.  
134a0 20 20 20 20 20 20 2a 2a 20 46 41 4c 53 45 20 69        ** FALSE i
134b0 66 20 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c  f the RHS is NUL
134c0 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20 20 20 20  L-free..        
134d0 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 31  */.        addr1
134e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
134f0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f  dOp4Int(v, OP_Fo
13500 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
13510 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20  le, 0, r1, 1);. 
13520 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
13530 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
13540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13550 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
13560 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73  rRhsHasNull, des
13570 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
13580 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
13590 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
135a0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
135b0 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
135c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
135d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
135e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
135f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
13600 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
13610 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  rse, r1);.  sqli
13620 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
13630 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43  pParse);.  VdbeC
13640 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
13650 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65  IN expr"));.}.#e
13660 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
13670 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
13680 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13690 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
136a0 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  INT./*.** Genera
136b0 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
136c0 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
136d0 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  the floating poi
136e0 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63  nt.** value desc
136f0 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d  ribed by z[0..n-
13700 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
13710 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iMem..**.** The
13720 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c   z[] string will
13730 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65   probably not be
13740 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
13750 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a  .  But the .** z
13760 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73  [n] character is
13770 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
13780 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  e something that
13790 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a   does not look.*
137a0 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69  * like the conti
137b0 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  nuation of the n
137c0 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
137d0 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56   void codeReal(V
137e0 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
137f0 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74  ar *z, int negat
13800 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29  eFlag, int iMem)
13810 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a  {.  if( ALWAYS(z
13820 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  !=0) ){.    doub
13830 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71  le value;.    sq
13840 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
13850 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
13860 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
13870 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
13880 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
13890 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
138a0 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
138b0 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
138c0 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
138d0 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
138e0 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  lue;.    sqlite3
138f0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
13900 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d  , OP_Real, 0, iM
13910 65 6d 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c  em, 0, (u8*)&val
13920 75 65 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20  ue, P4_REAL);.  
13930 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
13940 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69  ** Generate an i
13950 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
13960 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74  will put the int
13970 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79  eger describe by
13980 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d  .** text z[0..n-
13990 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72  1] into register
139a0 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70   iMem..**.** Exp
139b0 72 2e 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c  r.u.zToken is al
139c0 77 61 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65  ways UTF8 and ze
139d0 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a  ro-terminated..*
139e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
139f0 64 65 49 6e 74 65 67 65 72 28 50 61 72 73 65 20  deInteger(Parse 
13a00 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
13a10 45 78 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61  Expr, int negFla
13a20 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20  g, int iMem){.  
13a30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13a40 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70  ->pVdbe;.  if( p
13a50 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
13a60 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20  _IntValue ){.   
13a70 20 69 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e   int i = pExpr->
13a80 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73  u.iValue;.    as
13a90 73 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20  sert( i>=0 );.  
13aa0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20    if( negFlag ) 
13ab0 69 20 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69  i = -i;.    sqli
13ac0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13ad0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
13ae0 69 4d 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iMem);.  }else{.
13af0 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69      int c;.    i
13b00 36 34 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f  64 value;.    co
13b10 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
13b20 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
13b30 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
13b40 29 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74  );.    c = sqlit
13b50 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
13b60 7a 2c 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20  z, &value);.    
13b70 69 66 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d  if( c==0 || (c==
13b80 32 20 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b  2 && negFlag) ){
13b90 0a 20 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c  .      if( negFl
13ba0 61 67 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d  ag ){ value = c=
13bb0 3d 32 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e  =2 ? SMALLEST_IN
13bc0 54 36 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a  T64 : -value; }.
13bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13be0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
13bf0 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d  P_Int64, 0, iMem
13c00 2c 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65  , 0, (u8*)&value
13c10 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
13c20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
13c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
13c40 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
13c50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13c60 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69 7a  pParse, "oversiz
13c70 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25 73  ed integer: %s%s
13c80 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22  ", negFlag ? "-"
13c90 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65   : "", z);.#else
13ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13cb0 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45 52  OMIT_HEX_INTEGER
13cc0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
13cd0 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30  e3_strnicmp(z,"0
13ce0 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  x",2)==0 ){.    
13cf0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13d00 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65 78  Msg(pParse, "hex
13d10 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69 67   literal too big
13d20 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
13d30 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
13d40 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f      {.        co
13d50 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67  deReal(v, z, neg
13d60 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  Flag, iMem);.   
13d70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13d80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
13d90 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74  lear a cache ent
13da0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
13db0 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65  id cacheEntryCle
13dc0 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
13dd0 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63  , struct yColCac
13de0 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  he *p){.  if( p-
13df0 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20  >tempReg ){.    
13e00 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  if( pParse->nTem
13e10 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70  pReg<ArraySize(p
13e20 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29  Parse->aTempReg)
13e30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
13e40 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73  ->aTempReg[pPars
13e50 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d  e->nTempReg++] =
13e60 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
13e70 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
13e80 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a   0;.  }.}.../*.*
13e90 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20  * Record in the 
13ea0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68 61  column cache tha
13eb0 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 63  t a particular c
13ec0 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20  olumn from a.** 
13ed0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
13ee0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20   is stored in a 
13ef0 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69 73  particular regis
13f00 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
13f10 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
13f20 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  re(Parse *pParse
13f30 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74 20  , int iTab, int 
13f40 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b  iCol, int iReg){
13f50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
13f60 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64  minLru;.  int id
13f70 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20 79  xLru;.  struct y
13f80 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20  ColCache *p;..  
13f90 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72  /* Unless an err
13fa0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
13fb0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
13fc0 73 20 61 72 65 20 61 6c 77 61 79 73 20 70 6f 73  s are always pos
13fd0 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65  itive. */.  asse
13fe0 72 74 28 20 69 52 65 67 3e 30 20 7c 7c 20 70 50  rt( iReg>0 || pP
13ff0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
14000 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14010 46 61 69 6c 65 64 20 29 3b 0a 20 20 61 73 73 65  Failed );.  asse
14020 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20  rt( iCol>=-1 && 
14030 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f  iCol<32768 );  /
14040 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20  * Finite column 
14050 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a  numbers */..  /*
14060 20 54 68 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75   The SQLITE_Colu
14070 6d 6e 43 61 63 68 65 20 66 6c 61 67 20 64 69 73  mnCache flag dis
14080 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ables the column
14090 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 69 73   cache.  This is
140a0 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74   used.  ** for t
140b0 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f  esting only - to
140c0 20 76 65 72 69 66 79 20 74 68 61 74 20 53 51 4c   verify that SQL
140d0 69 74 65 20 61 6c 77 61 79 73 20 67 65 74 73 20  ite always gets 
140e0 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a  the same answer.
140f0 20 20 2a 2a 20 77 69 74 68 20 61 6e 64 20 77 69    ** with and wi
14100 74 68 6f 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e  thout the column
14110 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
14120 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
14130 69 73 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  isabled(pParse->
14140 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d  db, SQLITE_Colum
14150 6e 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e  nCache) ) return
14160 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 72 65  ;..  /* First re
14170 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74 69  place any existi
14180 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20  ng entry..  **. 
14190 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
141a0 65 20 77 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e  e way the column
141b0 20 63 61 63 68 65 20 69 73 20 63 75 72 72 65 6e   cache is curren
141c0 74 6c 79 20 75 73 65 64 2c 20 77 65 20 61 72 65  tly used, we are
141d0 20 67 75 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a   guaranteed.  **
141e0 20 74 68 61 74 20 74 68 65 20 6f 62 6a 65 63 74   that the object
141f0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65   will never alre
14200 61 64 79 20 62 65 20 69 6e 20 63 61 63 68 65 2e  ady be in cache.
14210 20 20 56 65 72 69 66 79 20 74 68 69 73 20 67 75    Verify this gu
14220 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69  arantee..  */.#i
14230 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 66  fndef NDEBUG.  f
14240 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
14250 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
14260 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14270 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
14280 20 61 73 73 65 72 74 28 20 70 2d 3e 69 52 65 67   assert( p->iReg
14290 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65  ==0 || p->iTable
142a0 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f  !=iTab || p->iCo
142b0 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20  lumn!=iCol );.  
142c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46  }.#endif..  /* F
142d0 69 6e 64 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f  ind an empty slo
142e0 74 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  t and replace it
142f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
14300 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
14310 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
14320 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
14330 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
14340 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Reg==0 ){.      
14350 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
14360 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
14370 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  .      p->iTable
14380 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 70   = iTab;.      p
14390 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
143a0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
143b0 3d 20 69 52 65 67 3b 0a 20 20 20 20 20 20 70 2d  = iReg;.      p-
143c0 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20  >tempReg = 0;.  
143d0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
143e0 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
143f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
14400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14410 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
14420 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
14430 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
14440 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
14450 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
14460 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
14470 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
14480 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14490 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
144a0 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
144b0 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
144c0 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
144d0 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
144e0 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
144f0 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
14500 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
14510 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
14520 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
14530 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
14540 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
14550 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
14560 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
14570 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
14580 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
14590 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
145a0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
145b0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
145c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d     return;.  }.}
145d0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
145e0 20 74 68 61 74 20 72 65 67 69 73 74 65 72 73 20   that registers 
145f0 62 65 74 77 65 65 6e 20 69 52 65 67 2e 2e 69 52  between iReg..iR
14600 65 67 2b 6e 52 65 67 2d 31 20 61 72 65 20 62 65  eg+nReg-1 are be
14610 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
14620 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 72 61  .** Purge the ra
14630 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nge of registers
14640 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e   from the column
14650 20 63 61 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20   cache..*/.void 
14660 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14670 52 65 6d 6f 76 65 28 50 61 72 73 65 20 2a 70 50  Remove(Parse *pP
14680 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
14690 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74  int nReg){.  int
146a0 20 69 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 20   i;.  int iLast 
146b0 3d 20 69 52 65 67 20 2b 20 6e 52 65 67 20 2d 20  = iReg + nReg - 
146c0 31 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  1;.  struct yCol
146d0 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
146e0 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
146f0 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14700 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14710 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
14720 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
14730 20 20 20 69 66 28 20 72 3e 3d 69 52 65 67 20 26     if( r>=iReg &
14740 26 20 72 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20  & r<=iLast ){.  
14750 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
14760 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
14770 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
14780 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
14790 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  /*.** Remember t
147a0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d  he current colum
147b0 6e 20 63 61 63 68 65 20 63 6f 6e 74 65 78 74 2e  n cache context.
147c0 20 20 41 6e 79 20 6e 65 77 20 65 6e 74 72 69 65    Any new entrie
147d0 73 20 61 64 64 65 64 0a 2a 2a 20 61 64 64 65 64  s added.** added
147e0 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   to the column c
147f0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
14800 63 61 6c 6c 20 61 72 65 20 72 65 6d 6f 76 65 64  call are removed
14810 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72   when the.** cor
14820 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f  responding pop o
14830 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
14840 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
14850 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
14860 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43  e){.  pParse->iC
14870 61 63 68 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66  acheLevel++;.#if
14880 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14890 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64  .  if( pParse->d
148a0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
148b0 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
148c0 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
148d0 50 55 53 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70  PUSH to %d\n", p
148e0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
148f0 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  el);.  }.#endif.
14900 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
14910 66 72 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20  from the column 
14920 63 61 63 68 65 20 61 6e 79 20 65 6e 74 72 69 65  cache any entrie
14930 73 20 74 68 61 74 20 77 65 72 65 20 61 64 64 65  s that were adde
14940 64 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74  d since the.** t
14950 68 65 20 70 72 65 76 69 6f 75 73 20 73 71 6c 69  he previous sqli
14960 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
14970 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20   operation.  In 
14980 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 73  other words, res
14990 74 6f 72 65 0a 2a 2a 20 74 68 65 20 63 61 63 68  tore.** the cach
149a0 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 69  e to the state i
149b0 74 20 77 61 73 20 69 6e 20 70 72 69 6f 72 20 74  t was in prior t
149c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 50  he most recent P
149d0 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ush..*/.void sql
149e0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
149f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14a00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
14a10 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
14a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
14a30 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d  e->iCacheLevel>=
14a40 31 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69  1 );.  pParse->i
14a50 43 61 63 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69  CacheLevel--;.#i
14a60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14a70 47 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  G.  if( pParse->
14a80 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
14a90 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
14aa0 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  e ){.    printf(
14ab0 22 50 4f 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20  "POP  to %d\n", 
14ac0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14ad0 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  vel);.  }.#endif
14ae0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
14af0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
14b00 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
14b10 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14b20 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
14b30 20 26 26 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50   && p->iLevel>pP
14b40 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
14b50 6c 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  l ){.      cache
14b60 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
14b70 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
14b80 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
14b90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
14ba0 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75 6d  n a cached colum
14bb0 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61 6b  n is reused, mak
14bc0 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73 20  e sure that its 
14bd0 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e  register is.** n
14be0 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61 62  o longer availab
14bf0 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65 67  le as a temp reg
14c00 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20 23  ister.  ticket #
14c10 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d 65  3879:  that same
14c20 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69 67  .** register mig
14c30 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ht be in the cac
14c40 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  he in multiple p
14c50 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75 72  laces, so be sur
14c60 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d  e to.** get them
14c70 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   all..*/.static 
14c80 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
14c90 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72  CachePinRegister
14ca0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14cb0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74  int iReg){.  int
14cc0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
14cd0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
14ce0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14cf0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14d00 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
14d10 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14d20 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67  f( p->iReg==iReg
14d30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d   ){.      p->tem
14d40 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
14d50 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61    }.}../* Genera
14d60 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
14d70 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67 69  l load into regi
14d80 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76 61  ster regOut a va
14d90 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 61  lue that is.** a
14da0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
14db0 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f  he iIdxCol-th co
14dc0 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49  lumn of index pI
14dd0 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  dx..*/.void sqli
14de0 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64 49  te3ExprCodeLoadI
14df0 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61  ndexColumn(.  Pa
14e00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a  rse *pParse,  /*
14e10 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
14e20 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20  text */.  Index 
14e30 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68 65  *pIdx,    /* The
14e40 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f 6c   index whose col
14e50 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f 61  umn is to be loa
14e60 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ded */.  int iTa
14e70 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72 73  bCur,    /* Curs
14e80 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  or pointing to a
14e90 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20   table row */.  
14ea0 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20 20  int iIdxCol,    
14eb0 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  /* The column of
14ec0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   the index to be
14ed0 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74   loaded */.  int
14ee0 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a 20   regOut      /* 
14ef0 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78 20  Store the index 
14f00 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
14f10 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
14f20 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43 6f  .){.  i16 iTabCo
14f30 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
14f40 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69  mn[iIdxCol];.  i
14f50 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45  f( iTabCol==XN_E
14f60 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72  XPR ){.    asser
14f70 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  t( pIdx->aColExp
14f80 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
14f90 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d   pIdx->aColExpr-
14fa0 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20 29  >nExpr>iIdxCol )
14fb0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 53  ;.    pParse->iS
14fc0 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75 72  elfTab = iTabCur
14fd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
14fe0 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73 65  rCodeCopy(pParse
14ff0 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  , pIdx->aColExpr
15000 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78  ->a[iIdxCol].pEx
15010 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  pr, regOut);.  }
15020 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15030 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
15040 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73 65  mnOfTable(pParse
15050 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e 70  ->pVdbe, pIdx->p
15060 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a  Table, iTabCur,.
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15090 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65 67      iTabCol, reg
150a0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Out);.  }.}../*.
150b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
150c0 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
150d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
150e0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
150f0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
15100 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
15110 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
15120 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
15130 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
15140 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
15150 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
15160 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
15170 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
15180 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
15190 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
151a0 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
151b0 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
151c0 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
151d0 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
151e0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
151f0 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
15200 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
15210 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
15220 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
15230 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
15240 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
15250 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
15260 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
15270 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
15280 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15290 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
152a0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
152b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
152c0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
152d0 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
152e0 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
152f0 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
15300 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
15310 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20  Tab) ){.      x 
15320 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
15330 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72  fIndex(sqlite3Pr
15340 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
15350 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ab), iCol);.    
15360 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
15370 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
15380 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75  TabCur, x, regOu
15390 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
153a0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
153b0 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
153c0 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
153d0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
153e0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
153f0 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
15400 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
15410 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
15420 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
15430 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
15440 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20  lumn value in a 
15450 72 65 67 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a  register. .**.**
15460 20 41 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   An effort is ma
15470 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
15480 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
15490 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 20 20  register iReg.  
154a0 54 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67  This.** is not g
154b0 61 72 61 6e 74 65 65 65 64 20 66 6f 72 20 47 65  aranteeed for Ge
154c0 74 43 6f 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20  tColumn() - the 
154d0 72 65 73 75 6c 74 20 63 61 6e 20 62 65 20 73 74  result can be st
154e0 6f 72 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72  ored in.** any r
154f0 65 67 69 73 74 65 72 2e 20 20 42 75 74 20 74 68  egister.  But th
15500 65 20 72 65 73 75 6c 74 20 69 73 20 67 75 61 72  e result is guar
15510 61 6e 74 65 65 64 20 74 6f 20 6c 61 6e 64 20 69  anteed to land i
15520 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67 0a  n register iReg.
15530 2a 2a 20 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e  ** for GetColumn
15540 54 6f 52 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ToReg()..**.** T
15550 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
15560 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
15570 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
15580 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
15590 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
155a0 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
155b0 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
155c0 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
155d0 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69   the rowid..*/.i
155e0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
155f0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
15600 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15610 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
15620 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
15630 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
15640 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
15650 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
15660 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
15670 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
15680 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
15690 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
156a0 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
156b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
156c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
156d0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
156e0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
156f0 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
15700 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
15710 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35   here */.  u8 p5
15720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15730 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43  5 value for OP_C
15740 6f 6c 75 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f  olumn + FLAGS */
15750 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
15760 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
15770 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
15780 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a   yColCache *p;..
15790 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
157a0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
157b0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
157c0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
157d0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e      if( p->iReg>
157e0 30 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  0 && p->iTable==
157f0 69 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f  iTable && p->iCo
15800 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b  lumn==iColumn ){
15810 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
15820 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
15830 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
15840 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
15850 67 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70  gister(pParse, p
15860 2d 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72  ->iReg);.      r
15870 65 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20  eturn p->iReg;. 
15880 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73     }.  }  .  ass
15890 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73  ert( v!=0 );.  s
158a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
158b0 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76  tColumnOfTable(v
158c0 2c 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20  , pTab, iTable, 
158d0 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a  iColumn, iReg);.
158e0 20 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20    if( p5 ){.    
158f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15900 65 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65  eP5(v, p5);.  }e
15910 6c 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69  lse{   .    sqli
15920 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
15930 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65  e(pParse, iTable
15940 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29  , iColumn, iReg)
15950 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
15960 52 65 67 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  Reg;.}.void sqli
15970 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
15980 6c 75 6d 6e 54 6f 52 65 67 28 0a 20 20 50 61 72  lumnToReg(.  Par
15990 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a  se *pParse,   /*
159a0 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
159b0 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
159c0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
159d0 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65  *pTab,     /* De
159e0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
159f0 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65   table we are re
15a00 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20  ading from */.  
15a10 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20  int iColumn,    
15a20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
15a30 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f   table column */
15a40 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
15a50 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
15a60 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
15a70 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
15a80 20 69 52 65 67 20 20 20 20 20 20 20 20 20 2f 2a   iReg         /*
15a90 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68   Store results h
15aa0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
15ab0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
15ac0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
15ad0 61 72 73 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c  arse, pTab, iCol
15ae0 75 6d 6e 2c 20 69 54 61 62 6c 65 2c 20 69 52 65  umn, iTable, iRe
15af0 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 31 21  g, 0);.  if( r1!
15b00 3d 69 52 65 67 20 29 20 73 71 6c 69 74 65 33 56  =iReg ) sqlite3V
15b10 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65  dbeAddOp2(pParse
15b20 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70  ->pVdbe, OP_SCop
15b30 79 2c 20 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a  y, r1, iReg);.}.
15b40 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c  ../*.** Clear al
15b50 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65  l column cache e
15b60 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ntries..*/.void 
15b70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15b80 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61  Clear(Parse *pPa
15b90 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rse){.  int i;. 
15ba0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
15bb0 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54  e *p;..#if SQLIT
15bc0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
15bd0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
15be0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
15bf0 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
15c00 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29  rintf("CLEAR\n")
15c10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
15c20 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
15c30 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
15c40 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
15c50 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
15c60 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a   if( p->iReg ){.
15c70 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79        cacheEntry
15c80 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29  Clear(pParse, p)
15c90 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20  ;.      p->iReg 
15ca0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
15cb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
15cc0 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20  he fact that an 
15cd0 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20  affinity change 
15ce0 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20  has occurred on 
15cf0 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74  iCount.** regist
15d00 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74  ers starting wit
15d10 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69  h iStart..*/.voi
15d20 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
15d30 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
15d40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15d50 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
15d60 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74  iCount){.  sqlit
15d70 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
15d80 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74  e(pParse, iStart
15d90 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a  , iCount);.}../*
15da0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15db0 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e  e to move conten
15dc0 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73  t from registers
15dd0 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e   iFrom...iFrom+n
15de0 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f  Reg-1.** over to
15df0 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31   iTo..iTo+nReg-1
15e00 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d  . Keep the colum
15e10 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61  n cache up-to-da
15e20 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
15e30 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
15e40 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15e50 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
15e60 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  o, int nReg){.  
15e70 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69  assert( iFrom>=i
15e80 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d  To+nReg || iFrom
15e90 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20  +nReg<=iTo );.  
15ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15eb0 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  3(pParse->pVdbe,
15ec0 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c   OP_Move, iFrom,
15ed0 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73   iTo, nReg);.  s
15ee0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
15ef0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46  emove(pParse, iF
15f00 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23  rom, nReg);.}..#
15f10 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
15f20 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
15f30 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
15f40 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
15f50 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
15f60 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74  ny register in t
15f70 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e  he range iFrom..
15f80 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a  iTo (inclusive).
15f90 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61  ** is used as pa
15fa0 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  rt of the column
15fb0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
15fc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
15fd0 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ed within assert
15fe0 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
15ff0 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a  ) macros only.**
16000 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70   and does not ap
16010 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c  pear in a normal
16020 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
16030 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75  c int usedAsColu
16040 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  mnCache(Parse *p
16050 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d  Parse, int iFrom
16060 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e  , int iTo){.  in
16070 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
16080 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
16090 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
160a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
160b0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
160c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
160d0 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b  int r = p->iReg;
160e0 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f  .    if( r>=iFro
160f0 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65  m && r<=iTo ) re
16100 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f  turn 1;    /*NO_
16110 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  TEST*/.  }.  ret
16120 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
16130 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
16140 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  || SQLITE_COVERA
16150 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a  GE_TEST */../*.*
16160 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70  * Convert an exp
16170 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20  ression node to 
16180 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f  a TK_REGISTER.*/
16190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
161a0 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72  rToRegister(Expr
161b0 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a   *p, int iReg){.
161c0 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70    p->op2 = p->op
161d0 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52  ;.  p->op = TK_R
161e0 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54  EGISTER;.  p->iT
161f0 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45  able = iReg;.  E
16200 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79  xprClearProperty
16210 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a  (p, EP_Skip);.}.
16220 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16230 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75  code into the cu
16240 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76  rrent Vdbe to ev
16250 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e  aluate the given
16260 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  .** expression. 
16270 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72   Attempt to stor
16280 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
16290 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65   register "targe
162a0 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  t"..** Return th
162b0 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65  e register where
162c0 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
162d0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  red..**.** With 
162e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
162f0 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e  ere is no guaran
16300 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73  tee that results
16310 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72   will.** be stor
16320 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54  ed in target.  T
16330 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20  he result might 
16340 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d  be stored in som
16350 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73  e other.** regis
16360 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e  ter if it is con
16370 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f  venient to do so
16380 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
16390 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  unction.** must 
163a0 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
163b0 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74   code and move t
163c0 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
163d0 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67  e desired.** reg
163e0 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ister..*/.int sq
163f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
16400 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  get(Parse *pPars
16410 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
16420 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56  int target){.  V
16430 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16440 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20  >pVdbe;  /* The 
16450 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  VM under constru
16460 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ction */.  int o
16470 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
16480 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
16490 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  de being coded *
164a0 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20  /.  int inReg = 
164b0 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a  target;       /*
164c0 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20   Results stored 
164d0 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65  in register inRe
164e0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  g */.  int regFr
164f0 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee1 = 0;        
16500 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
16510 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
16520 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
16530 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
16540 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49   0;         /* I
16550 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20  f non-zero free 
16560 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72  this temporary r
16570 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
16580 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b   r1, r2, r3, r4;
16590 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75         /* Variou
165a0 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  s register numbe
165b0 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  rs */.  sqlite3 
165c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
165d0 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73  ; /* The databas
165e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
165f0 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20    Expr tempX;   
16600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16610 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73  emporary express
16620 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61  ion node */..  a
16630 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
16640 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73  && target<=pPars
16650 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28  e->nMem );.  if(
16660 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73   v==0 ){.    ass
16670 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d  ert( pParse->db-
16680 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
16690 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
166a0 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d   }..  if( pExpr=
166b0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
166c0 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
166d0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
166e0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
166f0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
16700 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
16710 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f   {.      AggInfo
16720 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78   *pAggInfo = pEx
16730 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20  pr->pAggInfo;.  
16740 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
16750 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
16760 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70  pAggInfo->aCol[p
16770 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20  Expr->iAgg];.   
16780 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f     if( !pAggInfo
16790 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a  ->directMode ){.
167a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
167b0 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a  pCol->iMem>0 );.
167c0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
167d0 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  pCol->iMem;.    
167e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
167f0 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49   }else if( pAggI
16800 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49  nfo->useSortingI
16810 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dx ){.        sq
16820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16830 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41  v, OP_Column, pA
16840 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49  ggInfo->sortingI
16850 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20  dxPTab,.        
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
16880 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  terColumn, targe
16890 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
168a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
168b0 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66   /* Otherwise, f
168c0 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
168d0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65  e TK_COLUMN case
168e0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
168f0 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
16900 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d        int iTab =
16910 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
16920 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30        if( iTab<0
16930 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
16940 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30  pParse->ckBase>0
16950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
16960 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43   Generating CHEC
16970 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72  K constraints or
16980 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20   inserting into 
16990 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
169a0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67  .          inReg
169b0 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
169c0 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61  n + pParse->ckBa
169d0 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  se;.          br
169e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
169f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
16a00 20 43 6f 64 69 6e 67 20 61 6e 20 65 78 70 72 65   Coding an expre
16a10 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61  ssion that is pa
16a20 72 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 77  rt of an index w
16a30 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  here column name
16a40 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  s.          ** i
16a50 6e 20 74 68 65 20 69 6e 64 65 78 20 72 65 66 65  n the index refe
16a60 72 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 74  r to the table t
16a70 6f 20 77 68 69 63 68 20 74 68 65 20 69 6e 64 65  o which the inde
16a80 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20  x belongs */.   
16a90 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 50         iTab = pP
16aa0 61 72 73 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a  arse->iSelfTab;.
16ab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16ac0 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  }.      inReg = 
16ad0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
16ae0 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
16af0 20 70 45 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20   pExpr->pTab,.  
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
16b20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61  pr->iColumn, iTa
16b30 62 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  b, target,.     
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16b60 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20 62 72 65  >op2);.      bre
16b70 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16b80 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
16b90 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
16ba0 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
16bb0 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
16bc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16bd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16be0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
16bf0 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  INT.    case TK_
16c00 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  FLOAT: {.      a
16c10 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16c20 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16c30 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16c40 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
16c50 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16c60 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
16c70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16c80 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
16c90 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
16ca0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16cb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16cc0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16cd0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
16ce0 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
16cf0 76 2c 20 74 61 72 67 65 74 2c 20 70 45 78 70 72  v, target, pExpr
16d00 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
16d10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16d20 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
16d30 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
16d40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16d50 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65  P_Null, 0, targe
16d60 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
16d70 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
16d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f  QLITE_OMIT_BLOB_
16d90 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65  LITERAL.    case
16da0 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
16db0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63    int n;.      c
16dc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
16dd0 20 20 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b      char *zBlob;
16de0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16df0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
16e00 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
16e10 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
16e20 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
16e30 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20  oken[0]=='x' || 
16e40 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
16e50 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20  0]=='X' );.     
16e60 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
16e70 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27  u.zToken[1]=='\'
16e80 27 20 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26  ' );.      z = &
16e90 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
16ea0 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71  2];.      n = sq
16eb0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
16ec0 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   - 1;.      asse
16ed0 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29  rt( z[n]=='\'' )
16ee0 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20  ;.      zBlob = 
16ef0 73 71 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62  sqlite3HexToBlob
16f00 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76  (sqlite3VdbeDb(v
16f10 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  ), z, n);.      
16f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16f30 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f  4(v, OP_Blob, n/
16f40 32 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42  2, target, 0, zB
16f50 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  lob, P4_DYNAMIC)
16f60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16f70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16f80 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
16f90 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
16fa0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
16fb0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
16fc0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
16fd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
16fe0 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20  .zToken!=0 );.  
16ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17000 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d  r->u.zToken[0]!=
17010 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
17020 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17030 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
17040 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72  pr->iColumn, tar
17050 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
17060 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
17070 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]!=0 ){.       
17080 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
17090 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27  u.zToken[0]=='?'
170a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
170b0 7c 20 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e  | strcmp(pExpr->
170c0 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65  u.zToken, pParse
170d0 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69  ->azVar[pExpr->i
170e0 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b  Column-1])==0 );
170f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17100 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
17110 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  -1, pParse->azVa
17120 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
17130 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  -1], P4_STATIC);
17140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17150 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17160 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52  case TK_REGISTER
17170 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
17180 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
17190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
171a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
171b0 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
171c0 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
171d0 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
171e0 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
171f0 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
17200 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
17210 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
17220 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
17230 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
17240 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
17250 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
17260 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
17270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17280 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
17290 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
172a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
172b0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
172c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
172d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
172e0 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20  Cast, target,.  
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66        sqlite3Aff
17310 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
17320 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  >u.zToken, 0));.
17330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17340 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
17350 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
17360 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
17370 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17380 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
17390 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
173a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
173b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
173c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
173d0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
173e0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
173f0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
17400 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
17410 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
17420 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
17430 45 51 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  EQ: {.      r1 =
17440 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17450 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
17460 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
17470 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
17480 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17490 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
174a0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
174b0 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
174c0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
174d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
174e0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
174f0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
17500 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
17510 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
17520 45 50 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EP2);.      asse
17530 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
17540 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
17550 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
17560 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
17570 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
17580 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
17590 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
175a0 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
175b0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
175c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
175d0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
175e0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
175f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
17600 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
17610 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
17620 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
17630 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
17640 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
17650 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
17660 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
17670 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
17680 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
17690 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
176a0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
176b0 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
176c0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
176d0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
176e0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
176f0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
17700 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17710 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
17720 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17730 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
17740 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17750 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
17760 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
17770 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17780 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
17790 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
177a0 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
177b0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
177c0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
177d0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
177e0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
177f0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
17800 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
17810 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
17820 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
17830 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
17840 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
17850 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
17860 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
17870 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
17880 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
17890 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
178a0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
178b0 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
178c0 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  P2 | SQLITE_NULL
178d0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
178e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
178f0 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56  =TK_EQ);.      V
17900 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
17910 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20   op==TK_NE);.   
17920 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17930 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17940 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17950 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17960 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17970 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
17980 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
17990 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
179a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
179b0 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
179c0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
179d0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
179e0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
179f0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
17a00 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
17a10 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
17a20 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
17a30 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
17a40 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
17a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17a60 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
17a70 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17a80 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
17a90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17aa0 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
17ac0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
17ad0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
17ae0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
17af0 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
17b00 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17b10 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
17b20 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
17b30 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
17b40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17b50 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
17b60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
17b70 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
17b80 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
17b90 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
17ba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17bb0 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
17bc0 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
17bd0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
17be0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
17bf0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
17c00 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
17c10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17c20 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
17c30 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
17c40 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
17c50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17c60 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
17c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17c80 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
17c90 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
17ca0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
17cb0 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
17cc0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
17cd0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
17ce0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17cf0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
17d00 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
17d10 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
17d20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
17d30 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
17d40 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
17d50 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17d60 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17d70 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17d80 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
17d90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17da0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17db0 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
17dc0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
17dd0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17de0 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
17df0 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
17e00 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
17e10 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
17e20 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
17e30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
17e40 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17e50 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
17e60 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
17e70 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
17e80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
17e90 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
17ea0 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
17eb0 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
17ec0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
17ed0 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
17ee0 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20  arget);.#ifndef 
17ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
17f00 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
17f10 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
17f20 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
17f30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17f40 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
17f50 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
17f60 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
17f70 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
17f80 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
17f90 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
17fa0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
17fb0 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
17fc0 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
17fd0 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
17fe0 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
17ff0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
18000 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
18010 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
18020 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
18030 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
18040 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
18050 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
18060 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
18070 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
18080 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
18090 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
180a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
180b0 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
180c0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
180d0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
180e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
180f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
18100 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
18110 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
18120 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18130 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
18140 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
18150 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
18160 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
18170 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
18180 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
18190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
181a0 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
181b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
181c0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
181d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
181e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
181f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
18200 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
18210 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18220 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
18230 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
18240 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  arget;.      sql
18250 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18260 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
18270 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
18290 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
182a0 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
182b0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
182c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
182d0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
182e0 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
182f0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
18300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18310 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
18320 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
18330 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
18340 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
18350 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18360 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
18370 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
18380 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
18390 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
183a0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
183b0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
183c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
183d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
183e0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
183f0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
18400 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
18410 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
18420 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
18430 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
18440 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
18450 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
18460 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18470 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
18480 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
18490 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
184a0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
184b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
184c0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
184d0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
184e0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
184f0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
18500 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
18510 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
18520 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
18530 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18540 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
18550 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18560 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18570 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
18580 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
18590 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
185a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
185b0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49        inReg = pI
185c0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
185d0 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
185e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
185f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18600 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
18610 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
18620 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
18630 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
18640 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
18650 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
18660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18670 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
18680 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
18690 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
186a0 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
186b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
186c0 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
186d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
186e0 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a  r *zId;       /*
186f0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
18700 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20  me */.      u32 
18710 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20  constMask = 0;  
18720 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75     /* Mask of fu
18730 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
18740 20 74 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61   that are consta
18750 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  nt */.      int 
18760 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
18770 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18780 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  er */.      u8 e
18790 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20  nc = ENC(db);   
187a0 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65     /* The text e
187b0 6e 63 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20  ncoding used by 
187c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
187d0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
187e0 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a  pColl = 0;    /*
187f0 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   A collating seq
18800 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20  uence */..      
18810 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
18820 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
18830 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
18840 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
18850 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
18860 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
18870 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  ){.        pFarg
18880 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
18890 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67  e{.        pFarg
188a0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
188b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
188c0 20 6e 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f   nFarg = pFarg ?
188d0 20 70 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20   pFarg->nExpr : 
188e0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
188f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
18900 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
18910 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a  alue) );.      z
18920 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Id = pExpr->u.zT
18930 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 44 65 66  oken;.      pDef
18940 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
18950 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
18960 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a  nFarg, enc, 0);.
18970 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
18980 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61  0 || pDef->xFina
18990 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  lize!=0 ){.     
189a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
189b0 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
189c0 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  own function: %s
189d0 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  ()", zId);.     
189e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
189f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74 65  }..      /* Atte
18a00 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d 70  mpt a direct imp
18a10 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
18a20 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c  he built-in COAL
18a30 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20 20  ESCE() and.     
18a40 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e   ** IFNULL() fun
18a50 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61 76  ctions.  This av
18a60 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72 79  oids unnecessary
18a70 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20   evaluation of. 
18a80 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74       ** argument
18a90 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73 74  s past the first
18aa0 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65   non-NULL argume
18ab0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
18ac0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
18ad0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
18ae0 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b  FUNC_COALESCE ){
18af0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e 64  .        int end
18b00 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69 74  Coalesce = sqlit
18b10 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
18b20 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  v);.        asse
18b30 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a  rt( nFarg>=2 );.
18b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18b50 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
18b60 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
18b70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
18b80 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
18b90 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
18ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18bb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f  eAddOp2(v, OP_No
18bc0 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65  tNull, target, e
18bd0 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20  ndCoalesce);.   
18be0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
18bf0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18c00 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
18c10 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
18c20 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20 20   target, 1);.   
18c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18c40 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
18c50 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
18c60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
18c70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18c80 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  i].pExpr, target
18c90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
18ca0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
18cb0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18cc0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
18cd0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18ce0 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73  bel(v, endCoales
18cf0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ce);.        bre
18d00 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
18d10 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45     /* The UNLIKE
18d20 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  LY() function is
18d30 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72   a no-op.  The r
18d40 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61 6c  esult is the val
18d50 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  ue.      ** of t
18d60 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18d70 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
18d80 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
18d90 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
18da0 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
18db0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18dc0 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20  nFarg>=1 );.    
18dd0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
18de0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
18df0 74 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  t(pParse, pFarg-
18e00 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[0].pExpr, tar
18e10 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
18e20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
18e30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
18e40 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Farg; i++){.    
18e50 20 20 20 20 69 66 28 20 69 3c 33 32 20 26 26 20      if( i<32 && 
18e60 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
18e70 73 74 61 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69  stant(pFarg->a[i
18e80 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
18e90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18ea0 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20  i==31 );.       
18eb0 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20     constMask |= 
18ec0 4d 41 53 4b 42 49 54 33 32 28 69 29 3b 0a 20 20  MASKBIT32(i);.  
18ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18ee0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
18ef0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
18f00 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20  NC_NEEDCOLL)!=0 
18f10 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  && !pColl ){.   
18f20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
18f30 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
18f40 71 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  q(pParse, pFarg-
18f50 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
18f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18f70 20 20 20 20 20 20 69 66 28 20 70 46 61 72 67 20        if( pFarg 
18f80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
18f90 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20  onstMask ){.    
18fa0 20 20 20 20 20 20 72 31 20 3d 20 70 50 61 72 73        r1 = pPars
18fb0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
18fc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
18fd0 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20  m += nFarg;.    
18fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18ff0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
19000 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
19010 61 72 73 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20  arse, nFarg);.  
19020 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
19030 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74 68 28 29   /* For length()
19040 20 61 6e 64 20 74 79 70 65 6f 66 28 29 20 66 75   and typeof() fu
19050 6e 63 74 69 6f 6e 73 20 77 69 74 68 20 61 20 63  nctions with a c
19060 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a  olumn argument,.
19070 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
19080 68 65 20 50 35 20 70 61 72 61 6d 65 74 65 72 20  he P5 parameter 
19090 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e  to the OP_Column
190a0 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41   opcode to OPFLA
190b0 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20 20 20 20  G_LENGTHARG.    
190c0 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47      ** or OPFLAG
190d0 5f 54 59 50 45 4f 46 41 52 47 20 72 65 73 70 65  _TYPEOFARG respe
190e0 63 74 69 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69  ctively, to avoi
190f0 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 64 61  d unnecessary da
19100 74 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ta.        ** lo
19110 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  ading..        *
19120 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  /.        if( (p
19130 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
19140 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45   (SQLITE_FUNC_LE
19150 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43  NGTH|SQLITE_FUNC
19160 5f 54 59 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a  _TYPEOF))!=0 ){.
19170 20 20 20 20 20 20 20 20 20 20 75 38 20 65 78 70            u8 exp
19180 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rOp;.          a
19190 73 73 65 72 74 28 20 6e 46 61 72 67 3d 3d 31 20  ssert( nFarg==1 
191a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
191b0 65 72 74 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d  ert( pFarg->a[0]
191c0 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  .pExpr!=0 );.   
191d0 20 20 20 20 20 20 20 65 78 70 72 4f 70 20 3d 20         exprOp = 
191e0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
191f0 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20  r->op;.         
19200 20 69 66 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f   if( exprOp==TK_
19210 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70  COLUMN || exprOp
19220 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
19230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
19240 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
19250 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41  NC_LENGTH==OPFLA
19260 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20  G_LENGTHARG );. 
19270 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
19280 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54  t( SQLITE_FUNC_T
19290 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59  YPEOF==OPFLAG_TY
192a0 50 45 4f 46 41 52 47 20 29 3b 0a 20 20 20 20 20  PEOFARG );.     
192b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
192c0 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
192d0 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48   & OPFLAG_LENGTH
192e0 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ARG );.         
192f0 20 20 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70     pFarg->a[0].p
19300 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20  Expr->op2 = .   
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19320 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
19330 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41   (OPFLAG_LENGTHA
19340 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  RG|OPFLAG_TYPEOF
19350 41 52 47 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ARG);.          
19360 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
19370 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19380 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
19390 29 3b 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  );     /* Ticket
193a0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
193b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
193c0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
193d0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2c 20  (pParse, pFarg, 
193e0 72 31 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  r1, 0,.         
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
19410 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
19420 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
19430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19440 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
19450 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
19460 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
19470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19480 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20       r1 = 0;.   
19490 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
194a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
194b0 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
194c0 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
194d0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
194e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
194f0 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
19500 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
19510 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
19520 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
19530 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
19540 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
19550 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
19560 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
19570 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
19580 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
19590 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
195a0 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
195b0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
195c0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
195d0 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
195e0 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
195f0 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
19600 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
19610 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
19620 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
19630 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
19640 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
19650 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
19660 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19670 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
19680 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
19690 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
196a0 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
196b0 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
196c0 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
196d0 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
196e0 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
196f0 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
19700 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
19710 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
19720 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
19730 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
19740 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
19750 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e        if( nFarg>
19760 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c  =2 && (pExpr->fl
19770 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75  ags & EP_InfixFu
19780 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
19790 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
197a0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
197b0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
197c0 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
197d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
197e0 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
197f0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
19800 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
19810 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
19820 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
19830 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
19840 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
19850 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
19860 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
19870 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
19880 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
19890 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
198a0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
198b0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
198c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
198d0 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
198e0 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
198f0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
19900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
19910 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19920 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c  v, OP_Function0,
19930 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
19940 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
19970 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
19980 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19990 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
199a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
199b0 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d  rg && constMask=
199c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
199d0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
199e0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
199f0 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
19a00 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
19a10 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
19a20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19a30 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
19a40 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
19a50 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
19a60 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
19a70 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
19a80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19a90 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
19aa0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
19ab0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
19ac0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19ad0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
19ae0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19af0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
19b00 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
19b10 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
19b20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19b30 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
19b40 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
19b50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19b60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19b70 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
19b80 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
19b90 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
19ba0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
19bb0 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
19bc0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
19bd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19be0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19bf0 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
19c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19c10 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19c20 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19c40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
19c50 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
19c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19c70 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
19c80 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
19c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ca0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
19cb0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19cc0 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
19cd0 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
19ce0 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
19cf0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
19d00 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
19d10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
19d20 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
19d30 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
19d40 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
19d50 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
19d60 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
19d70 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
19d80 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
19d90 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
19da0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
19db0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
19dc0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
19dd0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
19de0 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
19df0 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
19e00 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19e10 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
19e20 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a  pr->x.pList->a;.
19e30 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
19e40 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
19e50 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
19e60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19e70 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
19e80 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
19e90 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
19ea0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19eb0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
19ec0 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
19ed0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
19ee0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
19ef0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19f00 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
19f10 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19f20 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19f30 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
19f40 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19f50 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
19f60 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
19f70 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
19f80 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
19f90 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
19fa0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
19fb0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
19fc0 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  (v);.      pLIte
19fd0 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
19fe0 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
19ff0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
1a000 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1a010 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1a020 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1a030 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a040 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1a050 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1a060 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1a070 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1a080 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
1a090 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
1a0a0 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
1a0b0 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
1a0c0 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 56  TOREP2);.      V
1a0d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1a0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a0f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e  eAddOp3(v, OP_An
1a100 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65  d, r3, r4, targe
1a110 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a120 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1a130 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20  pParse, r3);.   
1a140 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1a150 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a160 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r4);.      brea
1a170 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1a180 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63  e TK_SPAN:.    c
1a190 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
1a1a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
1a1b0 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
1a1c0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1a1d0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1a1e0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1a1f0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
1a200 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1a210 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
1a220 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
1a230 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
1a240 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
1a250 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1a260 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
1a270 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
1a280 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
1a290 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
1a2a0 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
1a2b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
1a2c0 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
1a2d0 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
1a2e0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
1a2f0 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
1a300 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
1a310 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
1a320 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
1a330 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
1a340 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
1a350 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
1a360 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
1a370 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
1a380 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
1a390 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
1a3a0 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
1a3b0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
1a3c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
1a3d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
1a3e0 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
1a3f0 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
1a400 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
1a410 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
1a420 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
1a430 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
1a440 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
1a450 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
1a460 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
1a470 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
1a480 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
1a490 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
1a4a0 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
1a4b0 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
1a4c0 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
1a4d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
1a4e0 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
1a4f0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
1a500 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
1a510 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
1a520 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
1a530 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
1a540 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
1a550 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
1a560 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
1a570 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
1a580 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
1a590 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
1a5a0 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
1a5b0 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
1a5c0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
1a5d0 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
1a5e0 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
1a5f0 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
1a600 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
1a610 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a620 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1a630 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
1a640 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
1a650 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
1a660 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
1a670 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a680 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
1a690 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
1a6a0 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
1a6b0 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
1a6c0 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
1a6d0 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
1a6e0 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
1a6f0 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
1a700 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
1a710 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
1a720 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
1a730 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
1a740 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1a750 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
1a760 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
1a770 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
1a780 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
1a790 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
1a7a0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
1a7b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1a7c0 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
1a7d0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
1a7e0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
1a7f0 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
1a800 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
1a810 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
1a820 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
1a830 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
1a840 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
1a850 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
1a860 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
1a870 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
1a880 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
1a890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a8a0 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
1a8b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
1a8c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a8d0 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
1a8e0 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
1a8f0 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
1a900 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
1a910 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
1a920 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
1a930 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
1a940 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
1a950 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
1a960 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
1a970 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a980 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1a990 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
1a9a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
1a9b0 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
1a9c0 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
1a9d0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
1a9e0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
1a9f0 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
1aa00 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
1aa10 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
1aa20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  real..      **. 
1aa30 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
1aa40 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36  -OF: R-60985-576
1aa50 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63  62 SQLite will c
1aa60 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75 65  onvert the value
1aa70 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a   back to.      *
1aa80 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
1aa90 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67   when extracting
1aaa0 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63   it from the rec
1aab0 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ord.  */.      i
1aac0 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
1aad0 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  n>=0 .       && 
1aae0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72  pTab->aCol[pExpr
1aaf0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  ->iColumn].affin
1ab00 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
1ab10 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20  REAL.      ){.  
1ab20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ab30 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
1ab40 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67  alAffinity, targ
1ab50 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  et);.      }.#en
1ab60 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
1ab70 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1ab80 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20      ** Form A:. 
1ab90 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57     **   CASE x W
1aba0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
1abb0 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
1abc0 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
1abd0 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1abe0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
1abf0 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53   B:.    **   CAS
1ac00 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  E WHEN e1 THEN r
1ac10 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
1ac20 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
1ac30 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1ac40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1ac50 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20  orm A is can be 
1ac60 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
1ac70 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
1ac80 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77  form B as follow
1ac90 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  s:.    **   CASE
1aca0 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20   WHEN x=e1 THEN 
1acb0 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45  r1 WHEN x=e2 THE
1acc0 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20  N r2 ....    ** 
1acd0 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e         WHEN x=eN
1ace0 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
1acf0 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
1ad00 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73 74  * X (if it exist
1ad10 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  s) is in pExpr->
1ad20 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
1ad30 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65  is in the last e
1ad40 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d  lement of pExpr-
1ad50 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70  >x.pList if pExp
1ad60 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1ad70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e  r is.    ** odd.
1ad80 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20    The Y is also 
1ad90 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68  optional.  If th
1ada0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1adb0 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a  ents in x.pList.
1adc0 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20      ** is even, 
1add0 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65  then Y is omitte
1ade0 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72  d and the "other
1adf0 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73 20  wise" result is 
1ae00 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20  NULL..    ** Ei 
1ae10 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69  is in pExpr->pLi
1ae20 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52  st->a[i*2] and R
1ae30 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73  i is pExpr->pLis
1ae40 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20  t->a[i*2+1]..   
1ae50 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1ae60 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70  esult of the exp
1ae70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52  ression is the R
1ae80 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  i for the first 
1ae90 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20  matching Ei,.   
1aea0 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20   ** or if there 
1aeb0 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45  is no matching E
1aec0 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d  i, the ELSE term
1aed0 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20   Y, or if there 
1aee0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53  is.    ** no ELS
1aef0 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20  E term, NULL..  
1af00 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
1af10 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b  : assert( op==TK
1af20 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20  _CASE ); {.     
1af30 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20   int endLabel;  
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c     /* GOTO label
1af60 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45   for end of CASE
1af70 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69   stmt */.      i
1af80 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20  nt nextCase;    
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afa0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
1afb0 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61  or next WHEN cla
1afc0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  use */.      int
1afd0 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aff0 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57  * 2x number of W
1b000 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
1b010 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b030 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1b040 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
1b050 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20  /* List of WHEN 
1b080 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73  terms */.      s
1b090 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1b0a0 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20  tem *aListelem; 
1b0b0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45   /* Array of WHE
1b0c0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1b0d0 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b   Expr opCompare;
1b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0f0 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20     /* The X==Ei 
1b100 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1b110 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20      Expr *pX;   
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65        /* The X e
1b140 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
1b150 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d     Expr *pTest =
1b160 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1b170 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66       /* X==Ei (f
1b180 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45  orm A) or just E
1b190 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20  i (form B) */.  
1b1a0 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e      VVA_ONLY( in
1b1b0 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20  t iCacheLevel = 
1b1c0 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1b1d0 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73  vel; )..      as
1b1e0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
1b1f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1b200 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20 70  _xIsSelect) && p
1b210 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b  Expr->x.pList );
1b220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
1b230 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
1b240 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
1b250 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1b260 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  x.pList;.      a
1b270 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
1b280 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
1b290 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
1b2a0 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65  r;.      endLabe
1b2b0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
1b2c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1b2d0 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45 78     if( (pX = pEx
1b2e0 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b  pr->pLeft)!=0 ){
1b2f0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d  .        tempX =
1b300 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65   *pX;.        te
1b310 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d  stcase( pX->op==
1b320 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
1b330 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69 73       exprToRegis
1b340 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69  ter(&tempX, sqli
1b350 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1b360 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67  pParse, pX, &reg
1b370 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20  Free1));.       
1b380 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1b390 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1b3a0 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d    opCompare.op =
1b3b0 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20   TK_EQ;.        
1b3c0 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20  opCompare.pLeft 
1b3d0 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20  = &tempX;.      
1b3e0 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d    pTest = &opCom
1b3f0 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pare;.        /*
1b400 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35 66   Ticket b351d95f
1b410 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61 65  9cd5ef17e9d9dbae
1b420 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30 31  18f5ca8611190001
1b430 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  :.        ** The
1b440 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65   value in regFre
1b450 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f  e1 might get SCo
1b460 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66  py-ed into the f
1b470 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20  ile result..    
1b480 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73      ** So make s
1b490 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 67  ure that the reg
1b4a0 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20 69  Free1 register i
1b4b0 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72  s not reused for
1b4c0 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a   other.        *
1b4d0 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70  * purposes and p
1b4e0 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74  ossibly overwrit
1b4f0 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ten.  */.       
1b500 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20   regFree1 = 0;. 
1b510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1b520 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b  (i=0; i<nExpr-1;
1b530 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20   i=i+2){.       
1b540 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b550 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1b560 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29 7b         if( pX ){
1b570 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b580 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20  t( pTest!=0 );. 
1b590 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61           opCompa
1b5a0 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73  re.pRight = aLis
1b5b0 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a  telem[i].pExpr;.
1b5c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b5d0 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20 3d           pTest =
1b5e0 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
1b5f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xpr;.        }. 
1b600 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65 20         nextCase 
1b610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1b620 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1b630 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1b640 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  st->op==TK_COLUM
1b650 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
1b660 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1b670 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e  pParse, pTest, n
1b680 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f  extCase, SQLITE_
1b690 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1b6a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1b6b0 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
1b6c0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1b6d0 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1b6e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1b6f0 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  arse, aListelem[
1b700 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  i+1].pExpr, targ
1b710 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
1b720 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b730 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20  endLabel);.     
1b740 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1b750 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1b760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b770 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b780 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20  v, nextCase);.  
1b790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b7a0 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a  (nExpr&1)!=0 ){.
1b7b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1b7c0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1b7d0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
1b7e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1b7f0 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
1b800 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20  nExpr-1].pExpr, 
1b810 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
1b820 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1b830 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
1b840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b860 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
1b870 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
1b880 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1b890 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
1b8a0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
1b8b0 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20  Err>0 .         
1b8c0 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61    || pParse->iCa
1b8d0 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65  cheLevel==iCache
1b8e0 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73  Level );.      s
1b8f0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1b900 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62  eLabel(v, endLab
1b910 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
1b920 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1b930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1b940 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1b950 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61  RAISE: {.      a
1b960 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66  ssert( pExpr->af
1b970 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62  finity==OE_Rollb
1b980 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ack .           
1b990 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  || pExpr->affini
1b9a0 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20  ty==OE_Abort.   
1b9b0 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72          || pExpr
1b9c0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46  ->affinity==OE_F
1b9d0 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ail.           |
1b9e0 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1b9f0 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20  y==OE_Ignore.   
1ba00 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
1ba10 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65  !pParse->pTrigge
1ba20 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  rTab ){.        
1ba30 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ba40 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ba60 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
1ba70 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
1ba80 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
1ba90 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
1baa0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1bab0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1bac0 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f  affinity==OE_Abo
1bad0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
1bae0 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50  lite3MayAbort(pP
1baf0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  arse);.      }. 
1bb00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
1bb10 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1bb20 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
1bb30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
1bb40 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1bb50 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
1bb60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1bb70 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
1bb80 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20      v, OP_Halt, 
1bb90 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67  SQLITE_OK, OE_Ig
1bba0 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e  nore, 0, pExpr->
1bbb0 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20  u.zToken,0);.   
1bbc0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1bbd0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
1bbe0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1bbf0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
1bc00 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1bc10 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
1bc20 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
1bc50 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  y, pExpr->u.zTok
1bc60 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  en, 0, 0);.     
1bc70 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   }..      break;
1bc80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1bc90 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1bca0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1bcb0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1bcc0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1bcd0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1bce0 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e  Free2);.  return
1bcf0 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   inReg;.}../*.**
1bd00 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20   Factor out the 
1bd10 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65  code of the give
1bd20 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1bd30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1bd40 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1bd50 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1bd60 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  it(.  Parse *pPa
1bd70 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1bd80 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1bd90 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1bda0 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
1bdb0 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e  ion to code when
1bdc0 20 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61   the VDBE initia
1bdd0 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  lizes */.  int r
1bde0 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  egDest,      /* 
1bdf0 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  Store the value 
1be00 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
1be10 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c   */.  u8 reusabl
1be20 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  e       /* True 
1be30 69 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69  if this expressi
1be40 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a  on is reusable *
1be50 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  /.){.  ExprList 
1be60 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f  *p;.  assert( Co
1be70 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72  nstFactorOk(pPar
1be80 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61  se) );.  p = pPa
1be90 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
1bea0 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74  .  pExpr = sqlit
1beb0 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
1bec0 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
1bed0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78  .  p = sqlite3Ex
1bee0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1bef0 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a  rse, p, pExpr);.
1bf00 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
1bf10 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1bf20 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1bf30 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b  ->a[p->nExpr-1];
1bf40 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69  .     pItem->u.i
1bf50 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72  ConstExprReg = r
1bf60 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74  egDest;.     pIt
1bf70 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72  em->reusable = r
1bf80 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70  eusable;.  }.  p
1bf90 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1bfa0 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = p;.}../*.** 
1bfb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1bfc0 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70   evaluate an exp
1bfd0 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72  ression and stor
1bfe0 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a  e the results.**
1bff0 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72   into a register
1c000 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
1c010 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68  gister number wh
1c020 65 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ere the results.
1c030 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a  ** are stored..*
1c040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69  *.** If the regi
1c050 73 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72  ster is a tempor
1c060 61 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61  ary register tha
1c070 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63  t can be dealloc
1c080 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72  ated,.** then wr
1c090 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69  ite its number i
1c0a0 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74  nto *pReg.  If t
1c0b0 68 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  he result regist
1c0c0 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74  er is not.** a t
1c0d0 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73  emporary, then s
1c0e0 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f  et *pReg to zero
1c0f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
1c100 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20   is a constant, 
1c110 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1c120 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65  e might generate
1c130 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f   this.** code to
1c140 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74   fill the regist
1c150 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61  er in the initia
1c160 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e  lization section
1c170 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   of the.** VDBE 
1c180 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65  program, in orde
1c190 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f  r to factor it o
1c1a0 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61  ut of the evalua
1c1b0 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e  tion loop..*/.in
1c1c0 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
1c1d0 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61  eTemp(Parse *pPa
1c1e0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1c1f0 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20  , int *pReg){.  
1c200 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20  int r2;.  pExpr 
1c210 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
1c220 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b  pCollate(pExpr);
1c230 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74  .  if( ConstFact
1c240 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20  orOk(pParse).   
1c250 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  && pExpr->op!=TK
1c260 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20  _REGISTER.   && 
1c270 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
1c280 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78  stantNotJoin(pEx
1c290 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70  pr).  ){.    Exp
1c2a0 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73  rList *p = pPars
1c2b0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20  e->pConstExpr;. 
1c2c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70     int i;.    *p
1c2d0 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66  Reg  = 0;.    if
1c2e0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ( p ){.      str
1c2f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c300 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
1c310 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20  for(pItem=p->a, 
1c320 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b  i=p->nExpr; i>0;
1c330 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a   pItem++, i--){.
1c340 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1c350 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73  m->reusable && s
1c360 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
1c370 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70  e(pItem->pExpr,p
1c380 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20  Expr,-1)==0 ){. 
1c390 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1c3a0 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45  pItem->u.iConstE
1c3b0 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20  xprReg;.        
1c3c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c3d0 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73      r2 = ++pPars
1c3e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
1c3f0 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1c400 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1c410 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  , r2, 1);.  }els
1c420 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20  e{.    int r1 = 
1c430 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1c440 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72  g(pParse);.    r
1c450 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1c460 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1c470 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20  , pExpr, r1);.  
1c480 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a    if( r2==r1 ){.
1c490 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31        *pReg = r1
1c4a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c4b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
1c4c0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1c4d0 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65   r1);.      *pRe
1c4e0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
1c4f0 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a  .  return r2;.}.
1c500 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c510 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1c520 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1c530 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1c540 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1c550 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
1c560 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1c570 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
1c580 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
1c590 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c5a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1c5b0 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
1c5c0 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1c5d0 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1c5e0 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b  t){.  int inReg;
1c5f0 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1c600 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
1c610 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
1c620 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
1c630 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47  Expr->op==TK_REG
1c640 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c  ISTER ){.    sql
1c650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1c660 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1c670 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54  _Copy, pExpr->iT
1c680 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20  able, target);. 
1c690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65   }else{.    inRe
1c6a0 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
1c6b0 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
1c6c0 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  , pExpr, target)
1c6d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1c6e0 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c  arse->pVdbe!=0 |
1c6f0 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1c700 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c710 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1c720 67 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70  get && pParse->p
1c730 56 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Vdbe ){.      sq
1c740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c750 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
1c760 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20  P_SCopy, inReg, 
1c770 74 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20  target);.    }. 
1c780 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1c790 20 61 20 74 72 61 6e 73 69 65 6e 74 20 63 6f 70   a transient cop
1c7a0 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
1c7b0 70 45 78 70 72 20 61 6e 64 20 74 68 65 6e 20 63  pExpr and then c
1c7c0 6f 64 65 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20  ode it using.** 
1c7d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1c7e0 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
1c7f0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
1c800 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c810 28 29 0a 2a 2a 20 65 78 63 65 70 74 20 74 68 61  ().** except tha
1c820 74 20 74 68 65 20 69 6e 70 75 74 20 65 78 70 72  t the input expr
1c830 65 73 73 69 6f 6e 20 69 73 20 67 75 61 72 61 6e  ession is guaran
1c840 74 65 65 64 20 74 6f 20 62 65 20 75 6e 63 68 61  teed to be uncha
1c850 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nged..*/.void sq
1c860 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 70  lite3ExprCodeCop
1c870 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
1c880 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1c890 74 20 74 61 72 67 65 74 29 7b 0a 20 20 73 71 6c  t target){.  sql
1c8a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1c8b0 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70 72 20 3d  e->db;.  pExpr =
1c8c0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1c8d0 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
1c8e0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1c8f0 46 61 69 6c 65 64 20 29 20 73 71 6c 69 74 65 33  Failed ) sqlite3
1c900 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1c910 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1c920 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1c930 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
1c940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c950 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c960 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
1c970 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
1c980 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1c990 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1c9a0 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1c9b0 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
1c9c0 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
1c9d0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
1c9e0 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65 78  rget.  If the ex
1c9f0 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
1ca00 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  tant, then this 
1ca10 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
1ca20 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20   choose to code 
1ca30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
1ca40 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  t initialization
1ca50 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
1ca60 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46 61  qlite3ExprCodeFa
1ca70 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a  ctorable(Parse *
1ca80 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1ca90 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1caa0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
1cab0 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26  okConstFactor &&
1cac0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
1cad0 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b  nstant(pExpr) ){
1cae0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1caf0 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1cb00 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1cb10 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1cb20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1cb30 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
1cb40 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d  , target);.  }.}
1cb50 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1cb60 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75   code that evalu
1cb70 61 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  ates the given e
1cb80 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
1cb90 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
1cba0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1cbb0 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
1cbc0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
1cbd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
1cbe0 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
1cbf0 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
1cc00 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
1cc10 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
1cc20 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
1cc30 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
1cc40 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
1cc50 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
1cc60 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
1cc70 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
1cc80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1cc90 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
1cca0 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
1ccb0 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
1ccc0 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
1ccd0 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
1cce0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1ccf0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
1cd00 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
1cd10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1cd20 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
1cd30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1cd40 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1cd50 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
1cd60 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1cd70 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20  ;.  int iMem;.. 
1cd80 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1cd90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1cda0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
1cdb0 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74  ISTER );.  sqlit
1cdc0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1cdd0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1cde0 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  );.  iMem = ++pP
1cdf0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
1ce00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ce10 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67  v, OP_Copy, targ
1ce20 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70  et, iMem);.  exp
1ce30 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70  rToRegister(pExp
1ce40 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  r, iMem);.}../*.
1ce50 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1ce60 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
1ce70 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
1ce80 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
1ce90 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
1cea0 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 73  on list into a s
1ceb0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
1cec0 74 65 72 73 20 62 65 67 69 6e 6e 69 6e 67 20 61  ters beginning a
1ced0 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20  t target..**.** 
1cee0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1cef0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 65 76  r of elements ev
1cf00 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  aluated..**.** T
1cf10 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  he SQLITE_ECEL_D
1cf20 55 50 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73  UP flag prevents
1cf30 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 66   the arguments f
1cf40 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c  rom being.** fil
1cf50 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f  led using OP_SCo
1cf60 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73  py.  OP_Copy mus
1cf70 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  t be used instea
1cf80 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
1cf90 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20  ITE_ECEL_FACTOR 
1cfa0 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20  argument allows 
1cfb0 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
1cfc0 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74  ts to be.** fact
1cfd0 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e  ored out into in
1cfe0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64  itialization cod
1cff0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  e..**.** The SQL
1d000 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61  ITE_ECEL_REF fla
1d010 67 20 6d 65 61 6e 73 20 74 68 61 74 20 65 78 70  g means that exp
1d020 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
1d030 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20 45 78 70  list with.** Exp
1d040 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f  rList.a[].u.x.iO
1d050 72 64 65 72 42 79 43 6f 6c 3e 30 20 68 61 76 65  rderByCol>0 have
1d060 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 65 76   already been ev
1d070 61 6c 75 61 74 65 64 20 61 6e 64 20 73 74 6f 72  aluated and stor
1d080 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  ed.** in registe
1d090 72 73 20 61 74 20 73 72 63 52 65 67 2c 20 61 6e  rs at srcReg, an
1d0a0 64 20 73 6f 20 74 68 65 20 76 61 6c 75 65 20 63  d so the value c
1d0b0 61 6e 20 62 65 20 63 6f 70 69 65 64 20 66 72 6f  an be copied fro
1d0c0 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20  m there..*/.int 
1d0d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1d0e0 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
1d0f0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
1d100 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1d110 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1d120 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
1d130 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1d140 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1d150 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20   int target,    
1d160 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1d170 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
1d180 0a 20 20 69 6e 74 20 73 72 63 52 65 67 2c 20 20  .  int srcReg,  
1d190 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
1d1a0 72 65 67 69 73 74 65 72 73 20 69 66 20 53 51 4c  registers if SQL
1d1b0 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a  ITE_ECEL_REF */.
1d1c0 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20 20    u8 flags      
1d1d0 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45       /* SQLITE_E
1d1e0 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  CEL_* flags */.)
1d1f0 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  {.  struct ExprL
1d200 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1d210 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
1d220 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66    u8 copyOp = (f
1d230 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43  lags & SQLITE_EC
1d240 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70  EL_DUP) ? OP_Cop
1d250 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20  y : OP_SCopy;.  
1d260 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d270 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
1d280 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20  t( pList!=0 );. 
1d290 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1d2a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1d2b0 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d 30 20  Parse->pVdbe!=0 
1d2c0 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20 67 65 74  );  /* Never get
1d2d0 73 20 74 68 69 73 20 66 61 72 20 6f 74 68 65 72  s this far other
1d2e0 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c  wise */.  n = pL
1d2f0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66  ist->nExpr;.  if
1d300 28 20 21 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  ( !ConstFactorOk
1d310 28 70 50 61 72 73 65 29 20 29 20 66 6c 61 67 73  (pParse) ) flags
1d320 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c   &= ~SQLITE_ECEL
1d330 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70  _FACTOR;.  for(p
1d340 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
1d350 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
1d360 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
1d370 20 2a 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d   *pExpr = pItem-
1d380 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
1d390 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1d3a0 45 43 45 4c 5f 52 45 46 29 21 3d 30 20 26 26 20  ECEL_REF)!=0 && 
1d3b0 28 6a 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (j = pList->a[i]
1d3c0 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1d3d0 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )>0 ){.      sql
1d3e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1d3f0 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52  , copyOp, j+srcR
1d400 65 67 2d 31 2c 20 74 61 72 67 65 74 2b 69 29 3b  eg-1, target+i);
1d410 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1d420 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1d430 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d 30 20 26  CEL_FACTOR)!=0 &
1d440 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1d450 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
1d460 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1d470 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1d480 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1d490 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d  get+i, 0);.    }
1d4a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1d4b0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
1d4c0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
1d4d0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1d4e0 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 69 66  get+i);.      if
1d4f0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 2b  ( inReg!=target+
1d500 69 20 29 7b 0a 20 20 20 20 20 20 20 20 56 64 62  i ){.        Vdb
1d510 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
1d520 20 20 69 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50    if( copyOp==OP
1d530 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
1d540 26 20 28 70 4f 70 3d 73 71 6c 69 74 65 33 56 64  & (pOp=sqlite3Vd
1d550 62 65 47 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d  beGetOp(v, -1))-
1d560 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79  >opcode==OP_Copy
1d570 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
1d580 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p1+pOp->p3+1==
1d590 69 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  inReg.         &
1d5a0 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70  & pOp->p2+pOp->p
1d5b0 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20  3+1==target+i.  
1d5c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1d5d0 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20     pOp->p3++;.  
1d5e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d5f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1d600 62 65 41 64 64 4f 70 32 28 76 2c 20 63 6f 70 79  beAddOp2(v, copy
1d610 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  Op, inReg, targe
1d620 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+i);.        }.
1d630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d640 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
1d650 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d660 63 6f 64 65 20 66 6f 72 20 61 20 42 45 54 57 45  code for a BETWE
1d670 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a  EN operator..**.
1d680 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
1d690 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68  y AND z.**.** Th
1d6a0 65 20 61 62 6f 76 65 20 69 73 20 65 71 75 69 76  e above is equiv
1d6b0 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20  alent to .**.** 
1d6c0 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a     x>=y AND x<=z
1d6d0 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61  .**.** Code it a
1d6e0 73 20 73 75 63 68 2c 20 74 61 6b 69 6e 67 20 63  s such, taking c
1d6f0 61 72 65 20 74 6f 20 64 6f 20 74 68 65 20 63 6f  are to do the co
1d700 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65 73 73 69  mmon subexpressi
1d710 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f  on.** eliminatio
1d720 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69  n of x..*/.stati
1d730 63 20 76 6f 69 64 20 65 78 70 72 43 6f 64 65 42  c void exprCodeB
1d740 65 74 77 65 65 6e 28 0a 20 20 50 61 72 73 65 20  etween(.  Parse 
1d750 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
1d760 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20  arsing and code 
1d770 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
1d780 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
1d790 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  xpr,      /* The
1d7a0 20 42 45 54 57 45 45 4e 20 65 78 70 72 65 73 73   BETWEEN express
1d7b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
1d7c0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
1d7d0 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 6a  mp here if the j
1d7e0 75 6d 70 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a  ump is taken */.
1d7f0 20 20 69 6e 74 20 6a 75 6d 70 49 66 54 72 75 65    int jumpIfTrue
1d800 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20  ,   /* Take the 
1d810 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57  jump if the BETW
1d820 45 45 4e 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  EEN is true */. 
1d830 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   int jumpIfNull 
1d840 20 20 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a     /* Take the j
1d850 75 6d 70 20 69 66 20 74 68 65 20 42 45 54 57 45  ump if the BETWE
1d860 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  EN is NULL */.){
1d870 0a 20 20 45 78 70 72 20 65 78 70 72 41 6e 64 3b  .  Expr exprAnd;
1d880 20 20 20 20 20 2f 2a 20 54 68 65 20 41 4e 44 20       /* The AND 
1d890 6f 70 65 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d  operator in  x>=
1d8a0 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20  y AND x<=z  */. 
1d8b0 20 45 78 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20   Expr compLeft; 
1d8c0 20 20 20 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20     /* The  x>=y 
1d8d0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
1d8e0 63 6f 6d 70 52 69 67 68 74 3b 20 20 20 2f 2a 20  compRight;   /* 
1d8f0 54 68 65 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20  The  x<=z  term 
1d900 2a 2f 0a 20 20 45 78 70 72 20 65 78 70 72 58 3b  */.  Expr exprX;
1d910 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 20 78         /* The  x
1d920 20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20    subexpression 
1d930 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
1d940 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72  1 = 0; /* Tempor
1d950 61 72 79 20 75 73 65 20 72 65 67 69 73 74 65 72  ary use register
1d960 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
1d970 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1d980 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1d990 65 63 74 29 20 29 3b 0a 20 20 65 78 70 72 58 20  ect) );.  exprX 
1d9a0 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b  = *pExpr->pLeft;
1d9b0 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20  .  exprAnd.op = 
1d9c0 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e  TK_AND;.  exprAn
1d9d0 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c  d.pLeft = &compL
1d9e0 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  eft;.  exprAnd.p
1d9f0 52 69 67 68 74 20 3d 20 26 63 6f 6d 70 52 69 67  Right = &compRig
1da00 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f  ht;.  compLeft.o
1da10 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d  p = TK_GE;.  com
1da20 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d 20 26 65  pLeft.pLeft = &e
1da30 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74  xprX;.  compLeft
1da40 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  .pRight = pExpr-
1da50 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
1da60 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68  Expr;.  compRigh
1da70 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20  t.op = TK_LE;.  
1da80 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65 66 74 20  compRight.pLeft 
1da90 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70  = &exprX;.  comp
1daa0 52 69 67 68 74 2e 70 52 69 67 68 74 20 3d 20 70  Right.pRight = p
1dab0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1dac0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 65 78 70  [1].pExpr;.  exp
1dad0 72 54 6f 52 65 67 69 73 74 65 72 28 26 65 78 70  rToRegister(&exp
1dae0 72 58 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rX, sqlite3ExprC
1daf0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1db00 26 65 78 70 72 58 2c 20 26 72 65 67 46 72 65 65  &exprX, &regFree
1db10 31 29 29 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49  1));.  if( jumpI
1db20 66 54 72 75 65 20 29 7b 0a 20 20 20 20 73 71 6c  fTrue ){.    sql
1db30 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1db40 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c  Parse, &exprAnd,
1db50 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1db60 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
1db70 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1db80 6c 73 65 28 70 50 61 72 73 65 2c 20 26 65 78 70  lse(pParse, &exp
1db90 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
1dba0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73  IfNull);.  }.  s
1dbb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1dbc0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1dbd0 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Free1);..  /* En
1dbe0 73 75 72 65 20 61 64 65 71 75 61 74 65 20 74 65  sure adequate te
1dbf0 73 74 20 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20  st coverage */. 
1dc00 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1dc10 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1dc20 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1dc30 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1dc40 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1dc50 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1dc60 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1dc70 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1dc80 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1dc90 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1dca0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
1dcb0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1dcc0 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1dcd0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1dce0 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1dcf0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1dd00 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1dd10 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1dd20 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1dd30 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1dd40 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1dd50 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1dd60 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74  gFree1!=0 );.  t
1dd70 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1dd80 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1dd90 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1dda0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1==0 );.  test
1ddb0 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1ddc0 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1ddd0 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1dde0 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0 );.}../*.** 
1ddf0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1de00 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
1de10 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
1de20 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
1de30 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
1de40 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
1de50 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
1de60 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
1de70 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
1de80 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
1de90 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
1dea0 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
1deb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
1dec0 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
1ded0 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
1dee0 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
1def0 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
1df00 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
1df10 6c 20 66 6c 61 67 20 69 73 20 53 51 4c 49 54 45  l flag is SQLITE
1df20 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a  _JUMPIFNULL..**.
1df30 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
1df40 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
1df50 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
1df60 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
1df70 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
1df80 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
1df90 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
1dfa0 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
1dfb0 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
1dfc0 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
1dfd0 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
1dfe0 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
1dff0 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
1e000 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
1e010 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
1e020 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
1e030 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
1e040 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
1e050 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
1e060 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1e070 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
1e080 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
1e090 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1e0a0 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
1e0b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1e0c0 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
1e0d0 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
1e0e0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
1e0f0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
1e100 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72   op = 0;.  int r
1e110 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69  egFree1 = 0;.  i
1e120 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
1e130 0a 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a  .  int r1, r2;..
1e140 20 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66    assert( jumpIf
1e150 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d  Null==SQLITE_JUM
1e160 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49  PIFNULL || jumpI
1e170 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  fNull==0 );.  if
1e180 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
1e190 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
1e1a0 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
1e1b0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
1e1c0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ler */.  if( NEV
1e1d0 45 52 28 70 45 78 70 72 3d 3d 30 29 20 29 20 72  ER(pExpr==0) ) r
1e1e0 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61  eturn;  /* No wa
1e1f0 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
1e200 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70  n */.  op = pExp
1e210 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
1e220 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e230 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
1e240 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
1e250 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1e260 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e270 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1e280 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e290 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1e2a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1e2b0 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e  , d2,jumpIfNull^
1e2c0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1e2d0 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1e2e0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1e2f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1e300 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
1e310 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e320 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
1e330 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e340 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1e350 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
1e360 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e370 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1e380 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e390 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e3a0 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_OR: {.      te
1e3b0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e3c0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1e3d0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1e3e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e3f0 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
1e400 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e410 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e420 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1e430 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e440 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1e450 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1e460 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e470 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e480 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1e490 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e4a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1e4b0 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
1e4c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1e4d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1e4e0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1e4f0 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1e500 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1e510 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1e520 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e530 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
1e540 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
1e550 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
1e560 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
1e570 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
1e580 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
1e590 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e5a0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e5b0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
1e5c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e5d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e5e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
1e5f0 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
1e600 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1e610 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
1e620 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
1e630 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
1e640 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1e650 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1e660 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e680 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1e690 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e6a0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
1e6b0 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
1e6c0 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
1e6d0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1e6e0 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
1e6f0 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
1e700 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
1e710 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
1e720 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1e730 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
1e740 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
1e750 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
1e760 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
1e770 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1e780 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
1e790 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
1e7a0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1e7b0 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
1e7c0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1e7d0 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
1e7e0 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
1e7f0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1e800 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
1e810 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
1e820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e830 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
1e840 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
1e850 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1e860 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
1e870 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e880 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e890 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e8a0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1e8b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e8c0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1e8d0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1e8e0 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
1e8f0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53  tcase( op==TK_IS
1e900 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1e910 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  se( op==TK_ISNOT
1e920 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
1e930 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1e940 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1e950 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
1e960 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e1);.      r2 = 
1e970 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e980 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1e990 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  r->pRight, &regF
1e9a0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20  ree2);.      op 
1e9b0 3d 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  = (op==TK_IS) ? 
1e9c0 54 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20  TK_EQ : TK_NE;. 
1e9d0 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1e9e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1e9f0 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1ea00 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1ea20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1ea30 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1ea40 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ea50 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20  , op==TK_EQ);.  
1ea60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ea70 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29  If(v, op==TK_NE)
1ea80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ea90 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
1eaa0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1eab0 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
1eac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ead0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1eae0 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
1eaf0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
1eb00 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
1eb10 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
1eb20 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
1eb30 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b  op==TK_ISNULL );
1eb40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1eb50 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f  K_NOTNULL==OP_No
1eb60 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73  tNull ); testcas
1eb70 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
1eb80 4c 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  L );.      r1 = 
1eb90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eba0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1ebb0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1ebc0 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee1);.      sqli
1ebd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ebe0 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a   op, r1, dest);.
1ebf0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ec00 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49  geIf(v, op==TK_I
1ec10 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 56 64  SNULL);.      Vd
1ec20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ec30 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b  op==TK_NOTNULL);
1ec40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ec50 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1ec60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ec70 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
1ec80 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20  ETWEEN: {.      
1ec90 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1eca0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ecb0 20 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e   exprCodeBetween
1ecc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1ecd0 64 65 73 74 2c 20 31 2c 20 6a 75 6d 70 49 66 4e  dest, 1, jumpIfN
1ece0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
1ecf0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1ed00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1ed10 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
1ed20 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
1ed30 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d 20  t destIfFalse = 
1ed40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1ed50 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
1ed60 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
1ed70 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65 73  jumpIfNull ? des
1ed80 74 20 3a 20 64 65 73 74 49 66 46 61 6c 73 65 3b  t : destIfFalse;
1ed90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1eda0 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c  prCodeIN(pParse,
1edb0 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61   pExpr, destIfFa
1edc0 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  lse, destIfNull)
1edd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ede0 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29  dbeGoto(v, dest)
1edf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ee00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1ee10 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  v, destIfFalse);
1ee20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ee30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
1ee40 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1ee50 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 54 72  if( exprAlwaysTr
1ee60 75 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  ue(pExpr) ){.   
1ee70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee80 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20  Goto(v, dest);. 
1ee90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
1eea0 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
1eeb0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1eec0 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* No-op */.   
1eed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1eee0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1eef0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ef00 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
1ef10 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
1ef20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1ef30 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64 65  v, OP_If, r1, de
1ef40 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
1ef50 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
1ef60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1ef70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
1ef80 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
1ef90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1efa0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1efb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1efc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1efd0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1efe0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1eff0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
1f000 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1f010 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
1f020 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee2);  .}../*.**
1f030 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1f040 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
1f050 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
1f060 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
1f070 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
1f080 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
1f090 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
1f0a0 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
1f0b0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
1f0c0 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
1f0d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1f0e0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
1f0f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
1f100 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
1f110 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
1f120 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
1f130 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
1f140 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f 4a  Null is SQLITE_J
1f150 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61 6c  UMPIFNULL or fal
1f160 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d  l through if jum
1f170 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e  pIfNull.** is 0.
1f180 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f190 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
1f1a0 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1f1b0 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1f1c0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1f1d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1f1e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1f1f0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1f200 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1f210 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1f220 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1f230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1f240 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1f250 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1f260 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f270 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1f280 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45 78   ) return; /* Ex
1f290 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20  istence of VDBE 
1f2a0 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65  checked by calle
1f2b0 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72  r */.  if( pExpr
1f2c0 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e 3b  ==0 )    return;
1f2d0 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
1f2e0 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
1f2f0 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
1f300 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1f310 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
1f320 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1f330 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
1f340 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
1f350 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
1f360 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
1f370 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
1f380 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
1f390 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
1f3a0 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
1f3b0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1f3d0 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
1f3e0 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
1f3f0 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
1f400 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
1f410 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
1f420 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
1f430 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
1f440 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1f460 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
1f470 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
1f480 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
1f490 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
1f4a0 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
1f4b0 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
1f4c0 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
1f4d0 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
1f4e0 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
1f4f0 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
1f500 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
1f510 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
1f520 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
1f530 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
1f540 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
1f550 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
1f560 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1f570 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
1f580 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
1f590 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
1f5a0 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
1f5b0 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
1f5c0 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
1f5d0 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
1f5e0 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1f5f0 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
1f600 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1f610 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
1f620 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
1f630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f640 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
1f650 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
1f660 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1f670 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
1f680 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
1f690 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1f6a0 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
1f6b0 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
1f6c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f6d0 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
1f6e0 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
1f6f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
1f700 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
1f710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f720 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
1f730 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
1f740 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f750 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
1f760 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
1f770 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
1f780 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1f790 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f7a0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f7b0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1f7c0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1f7d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f7e0 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f7f0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f800 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1f810 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1f820 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f830 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1f840 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1f850 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1f860 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1f870 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1f880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f890 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1f8a0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
1f8b0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
1f8c0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
1f8d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f8e0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f8f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f900 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1f910 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
1f920 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54  jumpIfNull^SQLIT
1f930 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1f940 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f950 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1f960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f970 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1f980 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1f990 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1f9a0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1f9b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f9c0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1f9d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f9e0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1f9f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fa00 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1fa10 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1fa20 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1fa30 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1fa40 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1fa50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1fa60 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1fa70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
1fa80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fa90 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
1faa0 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
1fab0 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
1fac0 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
1fad0 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
1fae0 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
1faf0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1fb00 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1fb10 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fb20 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fb30 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fb40 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fb50 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1fb60 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1fb70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1fb80 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1fb90 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
1fba0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1fbb0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
1fbc0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
1fbe0 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   r2, dest, jumpI
1fbf0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73  fNull);.      as
1fc00 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
1fc10 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
1fc20 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
1fc30 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1fc40 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
1fc50 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
1fc60 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1fc70 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
1fc80 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1fc90 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
1fca0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
1fcb0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1fcc0 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
1fcd0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
1fce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1fcf0 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
1fd00 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
1fd10 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1fd20 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
1fd30 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1fd40 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
1fd50 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
1fd60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fd70 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
1fd80 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
1fd90 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
1fda0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
1fdb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fdc0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1fdd0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1fde0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1fdf0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1fe00 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
1fe10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1fe20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
1fe30 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
1fe40 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1fe50 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
1fe60 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IS );.      test
1fe70 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
1fe80 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1fe90 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fea0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1feb0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fec0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fed0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1fee0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1fef0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1ff00 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1ff10 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70        op = (pExp
1ff20 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20  r->op==TK_IS) ? 
1ff30 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20  TK_NE : TK_EQ;. 
1ff40 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1ff50 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ff60 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
1ff70 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
1ff90 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54 45  r2, dest, SQLITE
1ffa0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1ffb0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ffc0 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20  , op==TK_EQ);.  
1ffd0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ffe0 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29  If(v, op==TK_NE)
1fff0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20000 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
20010 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20020 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a   regFree2==0 );.
20030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20040 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
20050 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
20060 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
20070 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20080 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
20090 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
200a0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
200b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
200c0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
200d0 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74  , dest);.      t
200e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
200f0 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65  ISNULL );   Vdbe
20100 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20110 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
20120 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20130 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20  ==TK_NOTNULL ); 
20140 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20150 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  v, op==TK_NOTNUL
20160 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  L);.      testca
20170 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20180 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20190 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
201a0 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20  K_BETWEEN: {.   
201b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
201c0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
201d0 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77      exprCodeBetw
201e0 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70  een(pParse, pExp
201f0 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70  r, dest, 0, jump
20200 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
20210 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
20220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20230 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
20240 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
20250 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   if( jumpIfNull 
20260 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20270 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61  e3ExprCodeIN(pPa
20280 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
20290 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
202a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
202b0 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73  t destIfNull = s
202c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
202d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
202e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
202f0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
20300 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c   dest, destIfNul
20310 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
20320 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20330 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c  bel(v, destIfNul
20340 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
20350 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
20360 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
20370 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65  t: {.      if( e
20380 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70  xprAlwaysFalse(p
20390 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
203a0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
203b0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
203c0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
203d0 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
203e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
203f0 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
20400 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
20410 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20420 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
20430 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
20440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20450 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
20460 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
20470 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
20480 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
20490 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
204a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
204b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
204c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
204d0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
204e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
204f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
20500 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
20510 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
20520 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
20530 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
20540 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
20550 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b  2);.}../*.** Lik
20560 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
20570 61 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68  alse() except th
20580 61 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64  at a copy is mad
20590 65 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72  e of pExpr befor
205a0 65 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61  e.** code genera
205b0 74 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63  tion, and that c
205c0 6f 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61  opy is deleted a
205d0 66 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61  fter code genera
205e0 74 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e  tion. This.** en
205f0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f  sures that the o
20600 72 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73  riginal pExpr is
20610 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76   unchanged..*/.v
20620 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
20630 66 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20  fFalseDup(Parse 
20640 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
20650 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69  Expr, int dest,i
20660 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
20670 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20680 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
20690 70 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69  pr *pCopy = sqli
206a0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
206b0 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  Expr, 0);.  if( 
206c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
206d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
206e0 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
206f0 61 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73  arse, pCopy, des
20700 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
20710 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
20720 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70  rDelete(db, pCop
20730 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f  y);.}.../*.** Do
20740 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73   a deep comparis
20750 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73  on of two expres
20760 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74  sion trees.  Ret
20770 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
20780 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
20790 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  are completely i
207a0 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72  dentical.  Retur
207b0 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66  n 1 if they diff
207c0 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20  er only.** by a 
207d0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
207e0 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65   at the top leve
207f0 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20  l.  Return 2 if 
20800 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72  there are differ
20810 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74  ences.** other t
20820 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65  han the top-leve
20830 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  l COLLATE operat
20840 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  or..**.** If any
20850 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70   subelement of p
20860 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c  B has Expr.iTabl
20870 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20  e==(-1) then it 
20880 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
20890 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74   compare equal t
208a0 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  o an equivalent 
208b0 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69  element in pA wi
208c0 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  th Expr.iTable==
208d0 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iTab..**.** The 
208e0 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65  pA side might be
208f0 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54   using TK_REGIST
20900 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  ER.  If that is 
20910 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20  the case and pB 
20920 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20  is.** not using 
20930 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20  TK_REGISTER but 
20940 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75  is otherwise equ
20950 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74  ivalent, then st
20960 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ill return 0..**
20970 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68  .** Sometimes th
20980 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
20990 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66  return 2 even if
209a0 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73   the two express
209b0 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61  ions.** really a
209c0 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  re equivalent.  
209d0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f  If we cannot pro
209e0 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ve that the expr
209f0 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69  essions are.** i
20a00 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74  dentical, we ret
20a10 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65  urn 2 just to be
20a20 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68   safe.  So if th
20a30 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
20a40 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f  turns 2, then yo
20a50 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  u do not really 
20a60 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e  know for certain
20a70 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65   if the two.** e
20a80 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
20a90 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66  he same.  But if
20aa0 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20   you get a 0 or 
20ab0 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79  1 return, then y
20ac0 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72  ou.** can be sur
20ad0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
20ae0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  s are the same. 
20af0 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77   In the places w
20b00 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  here.** this rou
20b10 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74  tine is used, it
20b20 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74   does not hurt t
20b30 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32  o get an extra 2
20b40 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20   - that.** just 
20b50 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
20b60 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c  some slightly sl
20b70 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20  ower code.  But 
20b80 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20  returning.** an 
20b90 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31  incorrect 0 or 1
20ba0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
20bb0 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f   malfunction..*/
20bc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
20bd0 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
20be0 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20  , Expr *pB, int 
20bf0 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d  iTab){.  u32 com
20c00 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66  binedFlags;.  if
20c10 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30  ( pA==0 || pB==0
20c20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
20c30 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20  B==pA ? 0 : 2;. 
20c40 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61   }.  combinedFla
20c50 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c  gs = pA->flags |
20c60 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66   pB->flags;.  if
20c70 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
20c80 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b  & EP_IntValue ){
20c90 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c  .    if( (pA->fl
20ca0 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50  ags&pB->flags&EP
20cb0 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26  _IntValue)!=0 &&
20cc0 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70   pA->u.iValue==p
20cd0 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20  B->u.iValue ){. 
20ce0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
20cf0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
20d00 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  2;.  }.  if( pA-
20d10 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20  >op!=pB->op ){. 
20d20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54     if( pA->op==T
20d30 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
20d40 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20d50 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69  pA->pLeft, pB, i
20d60 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
20d70 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20d80 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d      if( pB->op==
20d90 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
20da0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
20db0 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  (pA, pB->pLeft, 
20dc0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
20dd0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20de0 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20  .    return 2;. 
20df0 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
20e00 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41  =TK_COLUMN && pA
20e10 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op!=TK_AGG_COL
20e20 55 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f  UMN && pA->u.zTo
20e30 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ken ){.    if( p
20e40 41 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49  A->op==TK_FUNCTI
20e50 4f 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ON ){.      if( 
20e60 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
20e70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
20e80 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72  u.zToken)!=0 ) r
20e90 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c  eturn 2;.    }el
20ea0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41  se if( strcmp(pA
20eb0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
20ec0 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20  .zToken)!=0 ){. 
20ed0 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e       return pA->
20ee0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f  op==TK_COLLATE ?
20ef0 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20   1 : 2;.    }.  
20f00 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61  }.  if( (pA->fla
20f10 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
20f20 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20  )!=(pB->flags & 
20f30 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72  EP_Distinct) ) r
20f40 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41  eturn 2;.  if( A
20f50 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46  LWAYS((combinedF
20f60 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f  lags & EP_TokenO
20f70 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nly)==0) ){.    
20f80 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
20f90 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74  s & EP_xIsSelect
20fa0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
20fb0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
20fc0 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
20fd0 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  t, pB->pLeft, iT
20fe0 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
20ff0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
21000 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
21010 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
21020 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
21030 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
21040 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
21050 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c  are(pA->x.pList,
21060 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54   pB->x.pList, iT
21070 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  ab) ) return 2;.
21080 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28      if( ALWAYS((
21090 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
210a0 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20  EP_Reduced)==0) 
210b0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54  && pA->op!=TK_ST
210c0 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66  RING ){.      if
210d0 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
210e0 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
210f0 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
21100 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
21110 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
21120 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
21130 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
21140 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
21150 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
21160 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
21170 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
21180 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
21190 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
211a0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
211b0 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
211c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
211d0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
211e0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
211f0 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
21200 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
21210 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
21220 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
21230 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
21240 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
21250 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
21260 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
21270 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
21280 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
21290 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
212a0 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
212b0 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
212c0 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
212d0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
212e0 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
212f0 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
21300 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
21310 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
21320 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
21330 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
21340 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
21350 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
21360 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
21370 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
21380 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
21390 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
213a0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
213b0 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
213c0 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
213d0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
213e0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
213f0 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
21400 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
21410 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
21420 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
21430 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
21440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21450 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
21460 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
21470 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
21480 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
21490 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
214a0 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
214b0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
214c0 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
214d0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
214e0 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
214f0 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
21500 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
21510 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
21520 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
21530 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21540 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
21550 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
21560 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
21570 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21580 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21590 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
215a0 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
215b0 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
215c0 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
215d0 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
215e0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
215f0 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
21600 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
21610 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
21620 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
21630 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
21640 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
21650 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
21660 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
21670 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
21680 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
21690 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
216a0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
216b0 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
216c0 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
216d0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
216e0 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
216f0 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
21700 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
21710 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21720 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
21730 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21740 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
21750 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
21760 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
21770 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
21780 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
21790 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
217a0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
217b0 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
217c0 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
217d0 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
217e0 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
217f0 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
21800 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
21810 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
21820 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
21830 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
21840 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
21850 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
21860 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
21870 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
21880 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
21890 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
218a0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
218b0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
218c0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
218d0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
218e0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
218f0 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
21900 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
21910 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
21920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
21930 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
21940 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
21950 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
21960 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21970 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
21980 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
21990 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
219a0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
219b0 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
219c0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
219d0 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
219e0 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
219f0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
21a00 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21a10 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
21a20 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
21a30 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
21a40 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
21a50 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
21a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
21a70 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
21a80 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
21a90 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
21aa0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
21ab0 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
21ac0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
21ad0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
21ae0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
21af0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21b00 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
21b10 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
21b20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
21b30 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
21b40 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
21b50 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
21b60 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
21b70 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
21b80 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
21b90 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
21ba0 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
21bb0 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
21bc0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
21bd0 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
21be0 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
21bf0 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
21c00 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
21c10 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
21c20 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
21c30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21c40 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
21c50 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
21c60 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
21c70 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
21c80 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
21c90 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
21ca0 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
21cb0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
21cc0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
21cd0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
21ce0 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
21cf0 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
21d00 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
21d10 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
21d20 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
21d30 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
21d40 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
21d50 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
21d60 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
21d70 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
21d80 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
21d90 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
21da0 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
21db0 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
21dc0 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
21dd0 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
21de0 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
21df0 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
21e00 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
21e10 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
21e20 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
21e30 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
21e40 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
21e50 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
21e60 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
21e70 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
21e80 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
21e90 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
21ea0 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
21eb0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
21ec0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
21ed0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
21ee0 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
21ef0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
21f00 53 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72  Src;.    int nSr
21f10 63 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d  c = pSrc ? pSrc-
21f20 3e 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66  >nSrc : 0;.    f
21f30 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20  or(i=0; i<nSrc; 
21f40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
21f50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
21f60 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
21f70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
21f80 0a 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20  .    if( i<nSrc 
21f90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
21fa0 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
21fb0 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
21fc0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
21fd0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
21fe0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
21ff0 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
22000 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
22010 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
22020 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
22030 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
22040 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
22050 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
22060 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
22070 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
22080 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
22090 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
220a0 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
220b0 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
220c0 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
220d0 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
220e0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
220f0 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
22100 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
22110 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
22120 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
22130 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
22140 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
22150 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
22160 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
22170 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
22180 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
22190 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
221a0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
221b0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
221c0 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
221d0 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
221e0 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
221f0 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
22200 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
22210 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
22220 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
22230 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
22240 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
22250 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
22260 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
22270 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
22280 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
22290 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
222a0 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
222b0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
222c0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
222d0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
222e0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
222f0 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
22300 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22310 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
22320 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
22330 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
22340 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
22350 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
22360 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
22370 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
22380 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
22390 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
223a0 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
223b0 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
223c0 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
223d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
223e0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
223f0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
22400 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
22410 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
22420 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
22430 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
22440 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
22450 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
22460 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
22470 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22480 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
22490 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
224a0 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
224b0 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
224c0 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
224d0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
224e0 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
224f0 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
22500 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
22510 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
22520 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
22530 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
22540 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
22550 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
22560 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
22570 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
22580 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
22590 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
225a0 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
225b0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
225c0 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
225d0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
225e0 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
225f0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
22600 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
22610 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
22620 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
22630 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
22640 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
22650 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
22660 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
22670 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
22680 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
22690 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
226a0 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
226b0 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
226c0 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
226d0 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
226e0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
226f0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
22700 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
22710 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
22720 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
22730 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
22740 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
22750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
22760 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
22770 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
22780 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
22790 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
227a0 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
227b0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
227c0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
227d0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
227e0 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
227f0 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
22800 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
22810 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22820 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
22830 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
22840 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
22850 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
22860 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
22870 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
22880 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
22890 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
228a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
228b0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
228c0 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
228d0 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
228e0 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
228f0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
22900 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
22910 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
22920 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
22930 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
22940 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
22950 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
22960 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
22970 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
22980 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
22990 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
229a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
229b0 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
229c0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
229d0 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
229e0 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
229f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
22a00 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
22a10 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
22a20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
22a30 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
22a40 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
22a50 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
22a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
22a70 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
22a80 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
22a90 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
22aa0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
22ab0 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
22ac0 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22ae0 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
22af0 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
22b10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
22b20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22b30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
22b40 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
22b50 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
22b60 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
22b70 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
22b80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
22b90 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
22ba0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22bb0 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
22bc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
22bd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
22be0 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
22bf0 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
22c00 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
22c10 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
22c20 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
22c30 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
22c40 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
22c50 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
22c60 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
22c70 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22c90 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
22ca0 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
22cb0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
22cc0 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
22cd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
22ce0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
22cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22d00 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
22d20 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
22d30 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
22d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d50 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
22d60 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
22d70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
22d80 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
22d90 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
22da0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
22db0 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
22dc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
22dd0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
22de0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
22e10 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
22e20 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
22e30 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
22e50 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
22e60 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
22e90 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
22eb0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
22ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22ef0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
22f00 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
22f10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
22f20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
22f30 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
22f40 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
22f50 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
22f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22f70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22f80 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
22f90 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
22fa0 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
22fb0 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
22fd0 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
22fe0 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
22ff0 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
23000 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
23010 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
23020 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
23030 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
23040 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
23050 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
23060 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
23070 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
23080 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23090 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
230a0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
230b0 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
230c0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
230d0 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
230e0 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
230f0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
23100 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
23110 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
23120 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
23130 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
23140 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
23150 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
23160 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
23170 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
23180 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
23190 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
231a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
231b0 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
231c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
231d0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
231e0 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
231f0 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
23200 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
23210 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
23220 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
23230 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
23240 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
23250 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
23260 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
23270 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
23280 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
23290 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
232a0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
232b0 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
232c0 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
232d0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
232e0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
232f0 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
23300 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
23310 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
23320 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
23330 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
23340 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
23350 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
23360 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31  pExpr, pExpr, -1
23370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
233a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
233b0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
233c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
233d0 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
233e0 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
233f0 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
23400 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
23410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
23420 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
23430 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
23440 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
23450 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
23460 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
23470 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
23480 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23490 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
234a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
234b0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
234c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
234d0 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
234e0 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
234f0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
23500 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
23510 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
23520 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
23530 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
23540 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
23550 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23560 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
23580 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
23590 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
235a0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
235d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
235e0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70        pExpr->x.p
235f0 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e  List ? pExpr->x.
23600 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
23610 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
23620 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
23630 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
23640 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20  tinct ){.       
23650 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44         pItem->iD
23660 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65  istinct = pParse
23670 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
23680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23690 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
236a0 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
236b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
236c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
236d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
236e0 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e   Make pExpr poin
236f0 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
23700 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61  iate pAggInfo->a
23710 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20  Func[] entry.   
23720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23730 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23740 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23750 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
23760 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
23770 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
23780 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
23790 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
237a0 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
237b0 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20  = (i16)i;.      
237c0 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66    pExpr->pAggInf
237d0 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20  o = pAggInfo;.  
237e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
237f0 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65  _Prune;.      }e
23800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
23810 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
23840 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61  _Continue;.}.sta
23850 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
23860 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
23870 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
23880 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
23890 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ct){.  UNUSED_PA
238a0 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29  RAMETER(pWalker)
238b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
238c0 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20  ETER(pSelect);. 
238d0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
238e0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  inue;.}../*.** A
238f0 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72  nalyze the pExpr
23900 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
23910 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
23920 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
23930 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
23940 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
23950 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66   added to AggInf
23960 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e  o object that pN
23970 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70  C->pAggInfo.** p
23980 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74  oints to.  Addit
23990 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72  ional entries ar
239a0 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67  e made on the Ag
239b0 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a  gInfo object as.
239c0 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  ** necessary..**
239d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
239e0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
239f0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
23a00 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
23a10 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
23a20 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   by sqlite3Resol
23a30 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a  veExprNames()..*
23a40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
23a50 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
23a60 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  tes(NameContext 
23a70 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70  *pNC, Expr *pExp
23a80 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  r){.  Walker w;.
23a90 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20    memset(&w, 0, 
23aa0 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e  sizeof(w));.  w.
23ab0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
23ac0 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
23ad0 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
23ae0 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41  lback = analyzeA
23af0 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63  ggregatesInSelec
23b00 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  t;.  w.u.pNC = p
23b10 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
23b20 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29  C->pSrcList!=0 )
23b30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
23b40 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
23b50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71  }../*.** Call sq
23b60 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
23b70 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72  Aggregates() for
23b80 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
23b90 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65  n in an.** expre
23ba0 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74  ssion list.  Ret
23bb0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
23bc0 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
23bd0 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66  If an error is f
23be0 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73  ound, the analys
23bf0 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e  is is cut short.
23c00 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23c10 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
23c20 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  st(NameContext *
23c30 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  pNC, ExprList *p
23c40 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20  List){.  struct 
23c50 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23c60 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
23c70 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
23c80 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
23c90 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
23ca0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
23cb0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23cc0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
23cd0 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43  zeAggregates(pNC
23ce0 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
23cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
23d00 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73  .** Allocate a s
23d10 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74  ingle new regist
23d20 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f  er for use to ho
23d30 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64  ld some intermed
23d40 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a  iate result..*/.
23d50 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65  int sqlite3GetTe
23d60 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
23d70 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  rse){.  if( pPar
23d80 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20  se->nTempReg==0 
23d90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b  ){.    return ++
23da0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23db0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  }.  return pPars
23dc0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50  e->aTempReg[--pP
23dd0 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b  arse->nTempReg];
23de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
23df0 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c  cate a register,
23e00 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c   making availabl
23e10 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20  e for reuse for 
23e20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75  some other.** pu
23e30 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rpose..**.** If 
23e40 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75  a register is cu
23e50 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73  rrently being us
23e60 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e  ed by the column
23e70 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20   cache, then.** 
23e80 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e  the deallocation
23e90 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
23ea0 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  il the column ca
23eb0 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73  che line that us
23ec0 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74  es.** the regist
23ed0 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65  er becomes stale
23ee0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23ef0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
23f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
23f10 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20  nt iReg){.  if( 
23f20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e  iReg && pParse->
23f30 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
23f40 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
23f50 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Reg) ){.    int 
23f60 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43  i;.    struct yC
23f70 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20  olCache *p;.    
23f80 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
23f90 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
23fa0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
23fb0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
23fc0 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
23fd0 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20  =iReg ){.       
23fe0 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b   p->tempReg = 1;
23ff0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
24000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24010 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
24020 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
24030 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a  pReg++] = iReg;.
24040 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
24050 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63  ocate or dealloc
24060 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e  ate a block of n
24070 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20  Reg consecutive 
24080 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74  registers.*/.int
24090 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
240a0 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  ange(Parse *pPar
240b0 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  se, int nReg){. 
240c0 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d   int i, n;.  i =
240d0 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52   pParse->iRangeR
240e0 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65  eg;.  n = pParse
240f0 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69  ->nRangeReg;.  i
24100 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20  f( nReg<=n ){.  
24110 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41    assert( !usedA
24120 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61  sColumnCache(pPa
24130 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29  rse, i, i+n-1) )
24140 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52  ;.    pParse->iR
24150 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b  angeReg += nReg;
24160 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
24170 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a  ngeReg -= nReg;.
24180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d    }else{.    i =
24190 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
241a0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
241b0 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20  m += nReg;.  }. 
241c0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69   return i;.}.voi
241d0 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65  d sqlite3Release
241e0 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
241f0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
24200 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  g, int nReg){.  
24210 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
24220 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
24230 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66  Reg, nReg);.  if
24240 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e  ( nReg>pParse->n
24250 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20  RangeReg ){.    
24260 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
24270 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50  g = nReg;.    pP
24280 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20  arse->iRangeReg 
24290 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = iReg;.  }.}../
242a0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65  *.** Mark all te
242b0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
242c0 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61  s as being unava
242d0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
242e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
242f0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
24300 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  he(Parse *pParse
24310 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65  ){.  pParse->nTe
24320 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61  mpReg = 0;.  pPa
24330 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
24340 20 30 3b 0a 7d 0a                                 0;.}.