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

Artifact 5555f768c05d7d4a7840c6c2e72ad7aecbe0fe54:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20 54 4b  TK_COLLATE or TK
0be0: 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  _AS operators an
0bf0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0c00: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c10: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c20: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c30: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c40: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c50: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c60: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c70: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c90: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0cb0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cc0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cd0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0ce0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0cf0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0d00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d10: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d20: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d40: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d50: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d70: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0da0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
0dc0: 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  S );.      pExpr
0dd0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0de0: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0df0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0e00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0e10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0e20: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0e30: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0e40: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0e50: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0e60: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0e70: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0e80: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0e90: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0ea0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0eb0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0ec0: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
0ed0: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
0ee0: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
0ef0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0f00: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
0f10: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
0f20: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
0f30: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
0f40: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
0f50: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
0f60: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
0f70: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
0f80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
0f90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0fa0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
0fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0fc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0fd0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0fe0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0ff0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1010: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1020: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1030: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1040: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1050: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1060: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1070: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1080: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1090: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
10a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
10b0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
10c0: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
10d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
10e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1100: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1120: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1130: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1140: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1150: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1160: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1170: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
1180: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
1190: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
11a0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
11b0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
11c0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
11d0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
11e0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
11f0: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1200: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1210: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1220: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1230: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1240: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1250: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1270: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
1280: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
1290: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12b0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
12c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
12f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1300: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1310: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1320: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1330: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1340: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1350: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1360: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1370: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
1380: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
1390: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
13a0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
13b0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
13c0: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
13d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13e0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
13f0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1400: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1410: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1420: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1430: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1440: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1450: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
1460: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
1470: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
1480: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
1490: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
14a0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
14b0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
14c0: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
14d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
14e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
14f0: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1500: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1510: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1530: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1540: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1550: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
1560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1570: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1580: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
1590: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
15a0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
15b0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
15c0: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
15d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1610: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1650: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
1660: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
1670: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
1680: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
1690: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
16b0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
16c0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
16d0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
16e0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
16f0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1700: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1710: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1720: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1730: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1740: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1760: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1770: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1780: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1790: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
17a0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
17b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
17c0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
17d0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
17e0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
17f0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1800: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1810: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1820: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1830: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1840: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1850: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1860: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1870: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1880: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1890: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
18a0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
18b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
18d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1900: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1910: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1920: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1930: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1940: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1950: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1960: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1970: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1990: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
19a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
19b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
19c0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
19d0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
19e0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
19f0: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1a00: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1a10: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1a20: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1a30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1a40: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1a50: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1a60: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1a70: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a80: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1a90: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1aa0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1ab0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1ac0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1ad0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1ae0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1af0: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1b00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1b10: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b20: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1b30: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1b50: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1b60: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1b70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1b80: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1b90: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ba0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1bb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1bc0: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1bd0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1be0: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1bf0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c10: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1c20: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1c30: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c40: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1c50: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1c60: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c80: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1c90: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1ca0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1cb0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1cc0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1cd0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1ce0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
1cf0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
1d00: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  E_AFF_NONE;.  }.
1d10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1d20: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1d30: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70  a comparison exp
1d40: 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27  ression, eg. '='
1d50: 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65  , '<', IN(...) e
1d60: 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e  tc..** idx_affin
1d70: 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e  ity is the affin
1d80: 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ity of an indexe
1d90: 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e  d column. Return
1da0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20   true.** if the 
1db0: 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e  index with affin
1dc0: 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79  ity idx_affinity
1dd0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1de0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70   comparison in p
1e00: 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
1e10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
1e20: 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c  yOk(Expr *pExpr,
1e30: 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69   char idx_affini
1e40: 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ty){.  char aff 
1e50: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
1e60: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73  nity(pExpr);.  s
1e70: 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20  witch( aff ){.  
1e80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1e90: 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65  F_NONE:.      re
1ea0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65  turn 1;.    case
1eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1ec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  :.      return i
1ed0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
1ee0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
1ef0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1f00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f10: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1f20: 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  (idx_affinity);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1f40: 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65  urn the P5 value
1f50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f60: 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  used for a binar
1f70: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  y comparison.** 
1f80: 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f  opcode (OP_Eq, O
1f90: 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20  P_Ge etc.) used 
1fa0: 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72  to compare pExpr
1fb0: 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f  1 and pExpr2..*/
1fc0: 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72  .static u8 binar
1fd0: 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20  yCompareP5(Expr 
1fe0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
1ff0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
2000: 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66  fNull){.  u8 aff
2010: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2020: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2030: 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75  pr2);.  aff = (u
2040: 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  8)sqlite3Compare
2050: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
2060: 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70   aff) | (u8)jump
2070: 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e  IfNull;.  return
2080: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   aff;.}../*.** R
2090: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20a0: 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  to the collation
20b0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73   sequence that s
20c0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79  hould be used by
20d0: 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  .** a binary com
20e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
20f0: 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74   comparing pLeft
2100: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a   and pRight..**.
2110: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  ** If the left h
2120: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68  and expression h
2130: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
2140: 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68  equence type, th
2150: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64  en it is.** used
2160: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
2170: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2180: 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ce for the right
2190: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
21a0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20  .** is used, or 
21b0: 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e  the default (BIN
21c0: 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20  ARY) if neither 
21d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
21e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79   collating.** ty
21f0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  pe..**.** Argume
2200: 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e  nt pRight (but n
2210: 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65  ot pLeft) may be
2220: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
2230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2240: 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  * it is not cons
2250: 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53  idered..*/.CollS
2260: 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72  eq *sqlite3Binar
2270: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  , .  Expr *pLeft
22a0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  , .  Expr *pRigh
22b0: 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  t.){.  CollSeq *
22c0: 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pColl;.  assert(
22d0: 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20   pLeft );.  if( 
22e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
22f0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
2300: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2310: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2320: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  se, pLeft);.  }e
2330: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26  lse if( pRight &
2340: 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  & (pRight->flags
2350: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
2360: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
2370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2380: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2390: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
23a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23b0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23c0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
23d0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
23e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
23f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2400: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2420: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
2430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2440: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
2450: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
2460: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
2470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
2480: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2490: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
24a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
24b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
24c0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
24d0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
24f0: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2500: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2510: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2530: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2540: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2550: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2560: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2570: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2580: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2590: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
25a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
25b0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
25c0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
25d0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
25e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
25f0: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2600: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2610: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2620: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2640: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2650: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2660: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2670: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
26a0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
26b0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26e0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
26f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2700: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2710: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2720: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2730: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
2740: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
2750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2760: 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74  argument nHeight
2770: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2780: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
2790: 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73  ximum.** express
27a0: 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65  ion depth allowe
27b0: 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  d. If it is not,
27c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27d0: 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50  message in.** pP
27e0: 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  arse..*/.int sql
27f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2800: 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ght(Parse *pPars
2810: 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b  e, int nHeight){
2820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48  TE_OK;.  int mxH
2840: 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e  eight = pParse->
2850: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2860: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
2870: 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67  TH];.  if( nHeig
2880: 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20  ht>mxHeight ){. 
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
28b0: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
28c0: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
28d0: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
28e0: 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20  %d)", mxHeight. 
28f0: 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53     );.    rc = S
2900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2920: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
2930: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
2940: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
2950: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
2960: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
2970: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
2980: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
2990: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
29a0: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
29b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
29c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
29d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29e0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
2a10: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
2a20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2a30: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
2a40: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
2a50: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
2a60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
2a70: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
2a80: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
2a90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2aa0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
2ab0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
2ac0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2ae0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
2af0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
2b00: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
2b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2b20: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
2b40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
2b50: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2b60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2b90: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2ba0: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
2bb0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
2bc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2bd0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2be0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
2bf0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2c00: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
2c10: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
2c20: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
2c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c40: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
2c50: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2c60: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
2c70: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2c80: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2c90: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
2ca0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2cb0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
2cc0: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
2cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2ce0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
2cf0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
2d20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
2d40: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
2d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d60: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
2d80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2d90: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
2da0: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
2db0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
2dc0: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
2dd0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
2de0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
2df0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
2e00: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
2e10: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
2e20: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
2e30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2e40: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
2e50: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
2e60: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
2e70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
2e80: 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65  ate EP_Propagate
2e90: 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45   flags up from E
2ea0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45  xpr.x.pList to E
2eb0: 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66  xpr.flags,.** if
2ec0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ee0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2f20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2f30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2f40: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2f50: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2f60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2f70: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2f80: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2f90: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2fa0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ight);.  }else i
2fb0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  f( p->x.pList ){
2fc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2fd0: 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74  rList(p->x.pList
2fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , &nHeight);.   
2ff0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
3000: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
3010: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
3020: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
3030: 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  }.  p->nHeight =
3040: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
3050: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
3060: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
3070: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65  able using the e
3080: 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66  xprSetHeight() f
3090: 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74  unction. If.** t
30a0: 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65  he height is gre
30b0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ater than the ma
30c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78  ximum allowed ex
30d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a  pression depth,.
30e0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
30f0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  r in pParse..**.
3100: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
3110: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
3120: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
3130: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
3140: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
3150: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
3160: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3170: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
3180: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
3190: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
31a0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
31b0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
31c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
31d0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
31e0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
3210: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
3220: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
3230: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
3240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3250: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
3260: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3270: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
3280: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
3290: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
32a0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
32b0: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
32c0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
32d0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f  eight;.}.#else /
32e0: 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74  * ABOVE:  Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61   enforcement ena
3300: 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65  bled.  BELOW: He
3310: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
3320: 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72   off */./*.** Pr
3330: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
3340: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
3350: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
3360: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
3370: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
3380: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
3390: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
33a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
33b0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
33c0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26  && p->x.pList &&
33d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
33e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
33f0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61  t) ){.    p->fla
3400: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3410: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
3420: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
3430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65  List);.  }.}.#de
3440: 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67  fine exprSetHeig
3450: 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ht(y).#endif /* 
3460: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3470: 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  DEPTH>0 */../*.*
3480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3490: 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63  s the core alloc
34a0: 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f  ator for Expr no
34b0: 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  des..**.** Const
34c0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
34d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
34e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34f0: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
3500: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
3510: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b  and for the pTok
3520: 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  en argument is a
3530: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
3540: 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  on.** obtained f
3550: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3560: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
3570: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
3580: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3590: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
35a0: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
35b0: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
35c0: 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  *.** If dequote 
35d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
35e0: 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65  e token (if it e
35f0: 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74  xists) is dequot
3600: 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  ed..** If dequot
3610: 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64  e is false, no d
3620: 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66  equoting is perf
3630: 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65  ormance.  The de
3640: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
3650: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
3660: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
3670: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
3680: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
3690: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
36a0: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
36b0: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
36c0: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
36d0: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
36e0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
36f0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
3700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
3710: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
3720: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
3730: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
3740: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
3750: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
3760: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
3770: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
3780: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
3790: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
37a0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
37b0: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
37c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
37d0: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
37e0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
37f0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
3800: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
3810: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
3820: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
3830: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
3840: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
3850: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
3860: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
3870: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3880: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
3890: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
38a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
38b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
38c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
38d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3900: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
3910: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
3920: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
3930: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
3940: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
3950: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
3960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
3970: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
3980: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
3990: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
39a0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
39b0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
39c0: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
39d0: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
39e0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
39f0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3a00: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3a10: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
3a20: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
3a30: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
3a40: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
3a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
3a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3a80: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a90: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3aa0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  {.    pNew->op =
3ab0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
3ac0: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3ad0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
3ae0: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
3af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3b00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3b10: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
3b20: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
3b30: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3b50: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
3b60: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
3b70: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3b80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3b90: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
3ba0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3bc0: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
3bd0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
3be0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
3bf0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
3c00: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
3c10: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
3c30: 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20  te && nExtra>=3 
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3c50: 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a   ((c = pToken->z
3c60: 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  [0])=='\'' || c=
3c70: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='"' || c=='[' |
3c80: 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20  | c=='`') ){.   
3c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
3ca0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
3cb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
3cc0: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e   if( c=='"' ) pN
3cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3ce0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
3cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d00: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3d10: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d20: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d70: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d80: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3da0: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3db0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3dc0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3df0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3e00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3e10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e60: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e90: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3ea0: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3eb0: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ec0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3ed0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ef0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3f10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3fa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3fb0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fc0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fe0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4000: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
4010: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4020: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4030: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4040: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4070: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4090: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
40a0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
40b0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40d0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40e0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40f0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
4100: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
4110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4120: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4130: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4140: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4150: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4160: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4170: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4180: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4190: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
41a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41b0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41c0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41d0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41e0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41f0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
4200: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
4210: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4220: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4230: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4240: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4250: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4260: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4270: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4280: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4290: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
42a0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
42b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42e0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4300: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4310: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4330: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4340: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4360: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4370: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4380: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4390: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
43a0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
43b0: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43c0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
43d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
4400: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4410: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4420: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4440: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4450: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4470: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4480: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
4490: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20  pToken, 1);.    
44a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
44b0: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
44c0: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
44d0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
44e0: 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c  f( p ) {.    sql
44f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
4500: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
4510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  Height);.  }.  r
4520: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4530: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4540: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4550: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4560: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4570: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4580: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4590: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
45a0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
45b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
45c0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
45d0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
45e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
45f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
4600: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
4610: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
4620: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
4630: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
4640: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4650: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4660: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4670: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4680: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4690: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
46a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
46b0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
46c0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
46d0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
46e0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
46f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
4700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4710: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
4720: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
4730: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
4740: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4750: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4760: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4770: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4780: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4790: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
47b0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
47c0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
47d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
47e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
47f0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
4800: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
4810: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
4820: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
4830: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
4840: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4850: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4860: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4870: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4890: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
48a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
48b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
48c0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
48d0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
48e0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
48f0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4900: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4910: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4930: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4950: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4960: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4970: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4980: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4990: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
49a0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
49b0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
49c0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
49d0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
49e0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
49f0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4a00: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4a40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4a50: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4a70: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4a80: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4a90: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4ab0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4ac0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4ad0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4af0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4b10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4b20: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b40: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4b50: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4b60: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4b70: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4b90: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4ba0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4bb0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4bc0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4bd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4be0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4bf0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4c00: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4c10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4c20: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4c30: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4c40: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4c50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4c60: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4c70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4c80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4c90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4ca0: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4cd0: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4ce0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4cf0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4d00: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4d10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4d30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4d40: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4d50: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4d60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d80: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4d90: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4da0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4db0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4dc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4dd0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4de0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4df0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4e00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4e10: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4e20: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4e30: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4e40: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4e50: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4e60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4e70: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
4e80: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
4e90: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
4ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4eb0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
4ec0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
4ed0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4ee0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4ef0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4f00: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4f10: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4f20: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4f30: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4f40: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4f50: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4f60: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4f70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
4f80: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
4f90: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
4fa0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4fb0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
4fc0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
4fd0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4fe0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4ff0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
5000: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5010: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
5020: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
5030: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
5040: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5050: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5060: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5070: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5080: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5090: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
50a0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
50b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
50c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
50d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50e0: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
50f0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
5100: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
5110: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5130: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
5140: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5150: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5160: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5190: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
51a0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
51b0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
51c0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
51d0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
51e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
51f0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
5200: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
5210: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5220: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
5230: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
5240: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5250: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5260: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5270: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5280: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5290: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
52a0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
52b0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
52c0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
52d0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
52e0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
52f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
5300: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
5310: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
5320: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
5330: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
5340: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5350: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5360: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5370: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5390: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
53a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
53b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53d0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
53e0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
53f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5410: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
5420: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
5430: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
5440: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5450: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5480: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5490: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
54a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
54b0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
54c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
54d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
54e0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
54f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5500: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
5510: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
5520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
5530: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5560: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5570: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5580: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5590: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
55a0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
55b0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
55c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
55d0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
55e0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
55f0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
5600: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
5610: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
5620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5630: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
5640: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5650: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5660: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5670: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5680: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5690: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
56a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
56b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
56c0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
56d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56f0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
5700: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
5710: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
5720: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
5730: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5750: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5760: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5780: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5790: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
57a0: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
57b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
57c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
57d0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
57e0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
57f0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
5800: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
5810: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5820: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5830: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5840: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5850: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5870: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5880: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5890: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
58a0: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
58c0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
58e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
58f0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
5900: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5910: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5920: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5930: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5940: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5950: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5960: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5970: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
59a0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
59b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
59c0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
59d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
59e0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
59f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5a10: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5a30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5a40: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5a50: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5a60: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5a70: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a90: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5aa0: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5ab0: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
5ac0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ad0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
5af0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
5b00: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
5b10: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
5b20: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
5b30: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
5b40: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
5b50: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ht==0 );.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
5b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5b90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
5ba0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5bb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bc0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
5bd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5be0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
5bf0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
5c20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5c30: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
5c40: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
5c50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5c60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5c70: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ca0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5cc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5cf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5d20: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5d40: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5d50: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5d60: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5d70: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5d80: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5d90: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5da0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5dc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5dd0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5de0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5df0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5e20: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5e30: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5e40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5e60: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5e70: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5e90: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5ea0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5eb0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5ec0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5ed0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5ee0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5ef0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5f00: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5f10: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5f20: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5f30: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5f40: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5f50: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5f60: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5f70: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5f80: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5f90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5fa0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5fb0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5fc0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5fd0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
6030: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6040: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
6050: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
6060: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
6070: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
6080: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
6090: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
60a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
60b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
60c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
60d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
60e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
60f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
6100: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
6110: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
6120: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
6130: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
6140: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
6150: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
6160: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
6170: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6180: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
61a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
61b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
61c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
61d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
61e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
61f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
6200: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
6210: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
6220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
6230: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
6240: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
6250: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
6260: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
6270: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
6280: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
6290: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
62a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
62b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
62c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
62d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
62e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
62f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
6300: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
6310: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
6320: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
6330: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
6340: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
6350: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
6360: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
6370: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
6380: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
63a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
63b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
63c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
63d0: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
63e0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
63f0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
6400: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
6410: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
6420: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
6430: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
6440: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
6450: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
6460: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
6470: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
6480: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
6490: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
64a0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
64b0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
64c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
64d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
64e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
64f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6500: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
6510: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
6520: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6530: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
6540: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
6550: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
6560: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
6570: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
6580: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
6590: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
65a0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
65b0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
65c0: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
65d0: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
65e0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
65f0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
6600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
6610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6620: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
6630: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
6640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6650: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6660: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
6670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6690: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
66b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66c0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
66d0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
66e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
66f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6730: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
6740: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
6750: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
6760: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
6770: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
6790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
67a0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
67b0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
67c0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
67d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
67e0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
67f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
6800: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
6810: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
6820: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
6830: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6850: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6860: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6870: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6880: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6890: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
68a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
68b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
68c0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
68d0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
68e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
6910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
6920: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
6930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6940: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6950: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
6960: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
6970: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
6980: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
6990: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
69a0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
69b0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
69c0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
69d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
69f0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
6a00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
6a10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
6a20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
6a30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
6a40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
6a50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
6a60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
6a70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
6a80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
6a90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
6aa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
6ab0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
6ac0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
6ad0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
6ae0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
6af0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
6b00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
6b10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
6b20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
6b30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
6b40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
6b50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
6b60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
6b70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
6b80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
6b90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
6ba0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6bb0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6bc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
6bd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
6be0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6bf0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6c00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
6c10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
6c20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
6c30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
6c40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
6c50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
6c60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
6c70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
6c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6ca0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
6cb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
6cc0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
6cd0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
6ce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
6cf0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
6d00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
6d20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
6d30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
6d40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
6d50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
6d60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
6d70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
6d80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
6d90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
6da0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
6db0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
6dc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
6dd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
6de0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6df0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
6e00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
6e10: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
6e20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
6e40: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
6e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
6e60: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
6e70: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
6e80: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
6eb0: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
6ec0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
6ed0: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
6ee0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6ef0: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
6f00: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
6f10: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
6f20: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
6f30: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
6f40: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
6f50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
6f60: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
6f70: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
6f80: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
6f90: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
6fa0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
6fb0: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
6fc0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6fe0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
6ff0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
7000: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7010: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
7020: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
7030: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
7040: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7050: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
7060: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
7070: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
7080: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
7090: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
70a0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
70b0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
70c0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
70d0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
70e0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
70f0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
7100: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7110: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
7120: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
7130: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
7140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
7150: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
7160: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
7170: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
7180: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
7190: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
71b0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
71c0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
71d0: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
71e0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
71f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7200: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
7210: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
7220: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
7230: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7240: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7250: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
7270: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
7280: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
7290: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
72a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
72b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
72c0: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
72d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
72e0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
72f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
7310: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
7320: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7330: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
7340: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
7350: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7360: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7370: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7380: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7390: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
73a0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
73b0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
73c0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
73d0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
73e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
73f0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7400: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
7410: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
7420: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
7430: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
7440: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
7450: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
7460: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7470: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7480: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7490: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
74a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
74b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
74c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
74d0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
74e0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
74f0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7500: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
7510: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
7520: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
7530: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
7540: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
7550: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
7560: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7580: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7590: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
75a0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
75b0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
75c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
75d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
75e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
75f0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7600: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7610: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7620: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
7630: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
7640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7650: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
7660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7670: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7680: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76a0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
76b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
76c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
76d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
76e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
76f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7710: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7720: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7730: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
7740: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7750: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7760: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7780: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7790: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
77a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
77b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
77c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
77d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
77e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
77f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7810: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7860: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7870: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7890: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
78d0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7920: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7930: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7940: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7950: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7960: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7970: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7980: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7990: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
79a0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
79b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
79c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79d0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7a00: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7a10: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7a20: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7a30: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7a40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7a50: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7a60: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7a70: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7a80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7a90: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7aa0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7ab0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7ac0: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7ad0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7af0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7b00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7b10: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7b20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7b30: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7b50: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7b80: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7b90: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7ba0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7bb0: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7bc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7be0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7bf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7c00: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7c10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7c20: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7c30: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7c40: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7c50: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7c60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7c70: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7c90: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7ca0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7cb0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7cc0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7cd0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7ce0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7cf0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7d00: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7d10: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7d20: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7d30: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7d40: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7d50: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7d60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7d70: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
7d80: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
7d90: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
7da0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
7db0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
7dc0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
7dd0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
7de0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
7df0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
7e00: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
7e10: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
7e20: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
7e30: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
7e40: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
7e50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
7e60: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
7e70: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
7e80: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
7e90: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
7ea0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
7eb0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
7ec0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
7ed0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
7ee0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
7ef0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
7f00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
7f10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
7f20: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7f30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
7f40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7f50: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
7f60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
7f70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
7f80: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
7f90: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
7fa0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7fb0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
7fc0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
7fd0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7fe0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
7ff0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8000: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8010: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
8020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8050: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8060: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8090: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
80a0: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
80b0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
80c0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
80d0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
80e0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
80f0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8120: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8130: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8150: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8160: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8170: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8190: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
81a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
81b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
81c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
81d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
81e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
81f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8200: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8210: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8240: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8250: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8270: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8280: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8290: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
82a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
82b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
82d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
82e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
82f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8300: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8330: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8340: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8350: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8360: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8370: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8390: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
83a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
83b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
83c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
83d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
83e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
83f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8400: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8410: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8420: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8430: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8440: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8450: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8470: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
84a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
84b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
84c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
84d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
84e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
84f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8500: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
8510: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
8520: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
8530: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
8540: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8550: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
8560: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8580: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8590: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
85a0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
85b0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
85c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
85d0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
85e0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
85f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8600: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8610: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8640: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8650: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8660: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8670: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8690: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
86a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
86b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
86c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
86e0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
86f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8700: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8710: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8720: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
8730: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
8740: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
8750: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8760: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8770: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8780: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8790: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
87a0: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
87b0: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
87c0: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
87d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
87e0: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
87f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
8800: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
8810: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
8820: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
8830: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
8840: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
8850: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8860: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8870: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8880: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8890: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
88a0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
88b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
88c0: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
88d0: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
88e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
88f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
8900: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
8910: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8920: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8930: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8940: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8950: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8970: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8980: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8990: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
89a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
89b0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
89c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
89d0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
89e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
89f0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8a00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8a10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8a20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8a30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8a40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8a50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8a60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8a70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8a80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8a90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8aa0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8ab0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8ac0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8ae0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8af0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
8b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b10: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
8b20: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
8b30: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8b40: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
8b50: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8b60: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8b90: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8ba0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8bb0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8bc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8bd0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8be0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8bf0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
8c00: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
8c10: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
8c20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
8c30: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
8c40: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
8c50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8c60: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8c70: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8c80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8c90: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8ca0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8cb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8cc0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8cd0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8cf0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8d00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8d10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
8d20: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
8d30: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8d50: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8d60: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8d70: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8d80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8d90: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8da0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8dc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8dd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8de0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8df0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8e00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
8e10: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
8e20: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8e30: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
8e40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
8e50: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8e60: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8e70: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8e80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8e90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ea0: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8eb0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8ec0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8ed0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8ee0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8ef0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
8f00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8f10: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
8f20: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8f30: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
8f40: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8f50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8f60: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8f70: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8f80: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8f90: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8fa0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8fb0: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8fc0: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8fd0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8fe0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8ff0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
9000: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
9010: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
9020: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
9030: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
9040: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9050: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
9060: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
9070: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
9080: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
9090: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
90a0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
90b0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
90c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
90d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
90e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
90f0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
9100: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
9110: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
9120: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d  .  pNew->pWith =
9130: 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e   withDup(db, p->
9140: 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  pWith);.  sqlite
9150: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
9160: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
9180: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
9190: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
91a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
91b0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
91c0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
91d0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
91e0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
91f0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9200: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9210: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9220: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9230: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
9240: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
9250: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
9260: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9270: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9280: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9290: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
92a0: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
92b0: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
92c0: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
92d0: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
92e0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
92f0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
9300: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
9310: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
9320: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
9330: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
9340: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
9350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9380: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
93a0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
93b0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
93c0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
93d0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
93e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
93f0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
9400: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
9410: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9420: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9430: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9440: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9450: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9460: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
9470: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
9480: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9490: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
94a0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
94b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
94c0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
94d0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
94e0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
94f0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
9500: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
9510: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
9520: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
9530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9540: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9550: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
9560: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
9570: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
9580: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
9590: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
95a0: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
95b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
95c0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
95d0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
95f0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
9600: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
9610: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
9620: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9630: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9640: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9650: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
9660: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
9670: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
9680: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
9690: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
96a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
96b0: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
96c0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
96d0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
96e0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
9700: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
9710: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
9720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9730: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9740: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
9750: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9760: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
9770: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9780: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9790: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
97a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
97b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
97c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
97d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
97e0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
97f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
9800: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9810: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
9820: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9830: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9840: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9860: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
9870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9880: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9890: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
98a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
98b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
98c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
98d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
98e0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
98f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
9900: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
9910: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
9920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9930: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
9940: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
9950: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9960: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
9970: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9980: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
9990: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
99a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
99b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
99c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
99d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
99e0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
99f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9a00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
9a10: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
9a20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
9a30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9a40: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
9a50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9a60: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
9a70: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
9a80: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
9a90: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
9aa0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
9ab0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9ac0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
9ad0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9ae0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9af0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9b00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9b10: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
9b20: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
9b30: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
9b40: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
9b50: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
9b60: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
9b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9b80: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ba0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9bc0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
9bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9bf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9c00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9c10: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9c20: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9c30: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9c40: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
9c50: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
9c60: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
9c70: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
9c80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9c90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
9ca0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
9cb0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
9cc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
9cd0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
9cf0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
9d00: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
9d10: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9d20: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
9d30: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
9d40: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
9d50: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
9d60: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
9d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d80: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
9d90: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
9da0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9db0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
9dc0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
9e00: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
9e10: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
9e20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9e30: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
9e40: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
9e50: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
9e60: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
9e70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9e80: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
9e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ea0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
9eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
9ec0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9ed0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9ee0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
9ef0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
9f00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9f10: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
9f20: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
9f30: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9f40: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
9f50: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
9f60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
9f70: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
9f80: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
9f90: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
9fa0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9fb0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
9fc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
9fd0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
9fe0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
9ff0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
a000: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
a010: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
a020: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
a030: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
a040: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
a050: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a060: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
a070: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
a080: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
a090: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
a0a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
a0b0: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
a0c0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
a0d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
a0e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
a0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a100: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
a110: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
a120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
a140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a150: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
a160: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
a170: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
a180: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
a190: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
a1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a1b0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
a1c0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
a1d0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
a1e0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
a1f0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
a200: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
a210: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
a220: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
a230: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
a240: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
a250: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
a260: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a270: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
a280: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
a290: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 69 66 28  Expr;.       if(
a2a0: 20 41 4c 57 41 59 53 28 70 45 78 70 72 29 20 29   ALWAYS(pExpr) )
a2b0: 20 6d 20 7c 3d 20 70 4c 69 73 74 2d 3e 61 5b 69   m |= pList->a[i
a2c0: 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a  ].pExpr->flags;.
a2d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a2e0: 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn m;.}../*.** T
a2f0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
a300: 65 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  e Walker callbac
a310: 6b 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  ks used to check
a320: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a   expressions to.
a330: 2a 2a 20 73 65 65 20 69 66 20 74 68 65 79 20 61  ** see if they a
a340: 72 65 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f  re "constant" fo
a350: 72 20 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f  r some definitio
a360: 6e 20 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20  n of constant.  
a370: 54 68 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43  The.** Walker.eC
a380: 6f 64 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d  ode value determ
a390: 69 6e 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ines the type of
a3a0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61   "constant" we a
a3b0: 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f  re looking.** fo
a3c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  r..**.** These c
a3d0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73  allback routines
a3e0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70   are used to imp
a3f0: 6c 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f  lement the follo
a400: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
a410: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a420: 73 74 61 6e 74 28 29 20 20 20 20 20 20 20 20 20  stant()         
a430: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
a440: 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20  ->eCode==1.**   
a450: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
a460: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29  onstantNotJoin()
a470: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
a480: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20  er->eCode==2.** 
a490: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 52      sqlite3ExprR
a4a0: 65 66 4f 6e 65 54 61 62 6c 65 4f 6e 6c 79 28 29  efOneTableOnly()
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
a4c0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a  lker->eCode==3.*
a4d0: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
a4e0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
a4f0: 63 74 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70  ction()        p
a500: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34  Walker->eCode==4
a510: 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61   or 5.**.** In a
a520: 6c 6c 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  ll cases, the ca
a530: 6c 6c 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b  llbacks set Walk
a540: 65 72 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61  er.eCode=0 and a
a550: 62 6f 72 74 20 69 66 20 74 68 65 20 65 78 70 72  bort if the expr
a560: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75  ession.** is fou
a570: 6e 64 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63  nd to not be a c
a580: 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  onstant..**.** T
a590: 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  he sqlite3ExprIs
a5a0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a5b0: 6f 6e 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  on() is used for
a5c0: 20 65 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72   evaluating expr
a5d0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20  essions.** in a 
a5e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
a5f0: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c  tement.  The Wal
a600: 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20  ker.eCode value 
a610: 69 73 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e  is 5 when parsin
a620: 67 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  g.** an existing
a630: 20 73 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68   schema and 4 wh
a640: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  en processing a 
a650: 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  new statement.  
a660: 41 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  A bound.** param
a670: 65 74 65 72 20 72 61 69 73 65 73 20 61 6e 20 65  eter raises an e
a680: 72 72 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61  rror for new sta
a690: 74 65 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20  tements, but is 
a6a0: 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  silently convert
a6b0: 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f  ed.** to NULL fo
a6c0: 72 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d  r existing schem
a6d0: 61 73 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  as.  This allows
a6e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
a6f0: 61 62 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63  ables that .** c
a700: 6f 6e 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70  ontain a bound p
a710: 61 72 61 6d 65 74 65 72 20 62 65 63 61 75 73 65  arameter because
a720: 20 74 68 65 79 20 77 65 72 65 20 67 65 6e 65 72   they were gener
a730: 61 74 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65  ated by older ve
a740: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
a750: 69 74 65 20 74 6f 20 62 65 20 70 61 72 73 65 64  ite to be parsed
a760: 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
a770: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74  ns of SQLite wit
a780: 68 6f 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a  hout raising a.*
a790: 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65  * malformed sche
a7a0: 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ma error..*/.sta
a7b0: 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65  tic int exprNode
a7c0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
a7d0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
a7e0: 20 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20   *pExpr){..  /* 
a7f0: 49 66 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  If pWalker->eCod
a800: 65 20 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20  e is 2 then any 
a810: 74 65 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72  term of the expr
a820: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65  ession that come
a830: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  s from.  ** the 
a840: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
a850: 73 65 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ses of a left jo
a860: 69 6e 20 64 69 73 71 75 61 6c 69 66 69 65 73 20  in disqualifies 
a870: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
a880: 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63   ** from being c
a890: 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61  onsidered consta
a8a0: 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61  nt. */.  if( pWa
a8b0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26  lker->eCode==2 &
a8c0: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
a8d0: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
a8e0: 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61  Join) ){.    pWa
a8f0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
a900: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
a910: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77  Abort;.  }..  sw
a920: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
a930: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64  ){.    /* Consid
a940: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
a950: 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61  be constant if a
a960: 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  ll their argumen
a970: 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a  ts are constant.
a980: 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65      ** and eithe
a990: 72 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  r pWalker->eCode
a9a0: 3d 3d 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20  ==4 or 5 or the 
a9b0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65  function has the
a9c0: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  .    ** SQLITE_F
a9d0: 55 4e 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20  UNC_CONST flag. 
a9e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
a9f0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
aa00: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64  f( pWalker->eCod
aa10: 65 3e 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50  e>=4 || ExprHasP
aa20: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50  roperty(pExpr,EP
aa30: 5f 43 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20  _ConstFunc) ){. 
aa40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
aa50: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  C_Continue;.    
aa60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aa70: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
aa80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
aa90: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
aaa0: 20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20       }.    case 
aab0: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
aac0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
aad0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
aae0: 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ION:.    case TK
aaf0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
ab00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ab10: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b  pr->op==TK_ID );
ab20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ab30: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
ab40: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74  OLUMN );.      t
ab50: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
ab60: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
ab70: 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ION );.      tes
ab80: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
ab90: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
aba0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  );.      if( pWa
abb0: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26  lker->eCode==3 &
abc0: 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
abd0: 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72  =pWalker->u.iCur
abe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
abf0: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
ac00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ac10: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
ac20: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Code = 0;.      
ac30: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
ac40: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
ac50: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
ac60: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
ac70: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b  ker->eCode==5 ){
ac80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  .        /* Sile
ac90: 6e 74 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75  ntly convert bou
aca0: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 68  nd parameters th
acb0: 61 74 20 61 70 70 65 61 72 20 69 6e 73 69 64 65  at appear inside
acc0: 20 6f 66 20 43 52 45 41 54 45 0a 20 20 20 20 20   of CREATE.     
acd0: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ace0: 20 69 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65   into a NULL whe
acf0: 6e 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 52  n parsing the CR
ad00: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
ad10: 65 78 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20  ext out.        
ad20: 2a 2a 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ** of the sqlite
ad30: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f  _master table */
ad40: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
ad50: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
ad60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
ad70: 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20  alker->eCode==4 
ad80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
ad90: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20  bound parameter 
ada0: 69 6e 20 61 20 43 52 45 41 54 45 20 73 74 61 74  in a CREATE stat
adb0: 65 6d 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69  ement that origi
adc0: 6e 61 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20  nates from.     
add0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72     ** sqlite3_pr
ade0: 65 70 61 72 65 28 29 20 63 61 75 73 65 73 20 61  epare() causes a
adf0: 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
ae00: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
ae10: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
ae20: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ae30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
ae40: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
ae50: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  /.    default:. 
ae60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ae70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
ae80: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
ae90: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
aea0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
aeb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
aec0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
aed0: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
aee0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
aef0: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
af00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
af10: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
af20: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
af30: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
af40: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
af50: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
af60: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
af70: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
af80: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f  ;.  pWalker->eCo
af90: 64 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  de = 0;.  return
afa0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74   WRC_Abort;.}.st
afb0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 49 73 43  atic int exprIsC
afc0: 6f 6e 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e  onst(Expr *p, in
afd0: 74 20 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20  t initFlag, int 
afe0: 69 43 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20  iCur){.  Walker 
aff0: 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
b000: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
b010: 20 77 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46   w.eCode = initF
b020: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
b030: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
b040: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
b050: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
b060: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
b070: 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69  onstant;.  w.u.i
b080: 43 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71  Cur = iCur;.  sq
b090: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
b0a0: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77  , p);.  return w
b0b0: 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .eCode;.}../*.**
b0c0: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b0d0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b0e0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b0f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b100: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20  constant.** and 
b110: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
b120: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
b130: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a  nction calls..**
b140: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
b150: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
b160: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
b170: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
b180: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
b190: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
b1a0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
b1b0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
b1c0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
b1d0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
b1e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
b1f0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
b200: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65   *p){.  return e
b210: 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c  xprIsConst(p, 1,
b220: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61   0);.}../*.** Wa
b230: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b240: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b250: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b260: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b270: 73 74 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f  stant.** that do
b280: 65 73 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20  es no originate 
b290: 66 72 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55  from the ON or U
b2a0: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
b2b0: 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72  a join..** Retur
b2c0: 6e 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  n 0 if it involv
b2d0: 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20  es variables or 
b2e0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f  function calls o
b2f0: 72 20 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20  r terms from.** 
b300: 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  an ON or USING c
b310: 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  lause..*/.int sq
b320: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
b330: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20  antNotJoin(Expr 
b340: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
b350: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20  prIsConst(p, 2, 
b360: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  0);.}../*.** Wal
b370: 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  k an expression 
b380: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f  tree.  Return no
b390: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78  n-zero if the ex
b3a0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 73 74 61 6e  pression constan
b3b0: 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69 6e  t.** for any sin
b3c0: 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 74  gle row of the t
b3d0: 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f 72  able with cursor
b3e0: 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65 72   iCur.  In other
b3f0: 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20 65   words, the.** e
b400: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 6e  xpression must n
b410: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20  ot refer to any 
b420: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
b430: 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20 61  c function nor a
b440: 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68 65  ny.** table othe
b450: 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a  r than iCur..*/.
b460: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
b470: 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 45  sTableConstant(E
b480: 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75 72  xpr *p, int iCur
b490: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
b4a0: 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69 43  IsConst(p, 3, iC
b4b0: 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  ur);.}../*.** Wa
b4c0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
b4d0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e   tree.  Return n
b4e0: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65  on-zero if the e
b4f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
b500: 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75  stant.** or a fu
b510: 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68  nction call with
b520: 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65   constant argume
b530: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64  nts.  Return and
b540: 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61   0 if there.** a
b550: 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73  re any variables
b560: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b570: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b580: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b590: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b5a0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b5b0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b5c0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b5d0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b5e0: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b5f0: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b600: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b610: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
b620: 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a  rFunction(Expr *
b630: 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a 20  p, u8 isInit){. 
b640: 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74 3d   assert( isInit=
b650: 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31 20  =0 || isInit==1 
b660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  );.  return expr
b670: 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73 49  IsConst(p, 4+isI
b680: 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nit, 0);.}../*.*
b690: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
b6a0: 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f  ion p codes a co
b6b0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74  nstant integer t
b6c0: 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  hat is small eno
b6d0: 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  ugh.** to fit in
b6e0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b6f0: 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20  r, return 1 and 
b700: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  put the value of
b710: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
b720: 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20  in *pValue.  If 
b730: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b740: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
b750: 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f   or if it is too
b760: 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69   big.** to fit i
b770: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
b780: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
b790: 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70  n 0 and leave *p
b7a0: 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e  Value unchanged.
b7b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b7c0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70  xprIsInteger(Exp
b7d0: 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75  r *p, int *pValu
b7e0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  e){.  int rc = 0
b7f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 78  ;..  /* If an ex
b800: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 69  pression is an i
b810: 6e 74 65 67 65 72 20 6c 69 74 65 72 61 6c 20 74  nteger literal t
b820: 68 61 74 20 66 69 74 73 20 69 6e 20 61 20 73 69  hat fits in a si
b830: 67 6e 65 64 20 33 32 2d 62 69 74 0a 20 20 2a 2a  gned 32-bit.  **
b840: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
b850: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
b860: 6c 61 67 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  lag will have al
b870: 72 65 61 64 79 20 62 65 65 6e 20 73 65 74 20 2a  ready been set *
b880: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  /.  assert( p->o
b890: 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20 7c 7c  p!=TK_INTEGER ||
b8a0: 20 28 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f   (p->flags & EP_
b8b0: 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a 20 20 20  IntValue)!=0.   
b8c0: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
b8d0: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 75 2e  e3GetInt32(p->u.
b8e0: 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d 3d 30 20  zToken, &rc)==0 
b8f0: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  );..  if( p->fla
b900: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
b910: 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c 75 65 20   ){.    *pValue 
b920: 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a 20  = p->u.iValue;. 
b930: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
b940: 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
b950: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b960: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
b970: 63 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 49  c = sqlite3ExprI
b980: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
b990: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
b9a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b9b0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
b9c0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
b9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
b9e0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b9f0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
ba00: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
ba10: 28 20 76 21 3d 28 2d 32 31 34 37 34 38 33 36 34  ( v!=(-214748364
ba20: 37 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  7-1) );.        
ba30: 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20  *pValue = -v;.  
ba40: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
ba50: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ba60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
ba70: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d  ault: break;.  }
ba80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ba90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41  ./*.** Return FA
baa0: 4c 53 45 20 69 66 20 74 68 65 72 65 20 69 73 20  LSE if there is 
bab0: 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
bac0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61  he expression ca
bad0: 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n be NULL..**.**
bae0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
baf0: 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  on might be NULL
bb00: 20 6f 72 20 69 66 20 74 68 65 20 65 78 70 72 65   or if the expre
bb10: 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20 63 6f 6d  ssion is too com
bb20: 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65 6c 6c 20  plex.** to tell 
bb30: 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20 0a 2a  return TRUE.  .*
bb40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bb50: 65 20 69 73 20 75 73 65 64 20 61 73 20 61 6e 20  e is used as an 
bb60: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
bb70: 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75 6c 6c 20   skip OP_IsNull 
bb80: 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68 65 6e 20  opcodes.** when 
bb90: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 76  we know that a v
bba0: 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65 20 4e  alue cannot be N
bbb0: 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20 61 20 66  ULL.  Hence, a f
bbc0: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 0a 2a 2a  alse positive.**
bbd0: 20 28 72 65 74 75 72 6e 69 6e 67 20 54 52 55 45   (returning TRUE
bbe0: 20 77 68 65 6e 20 69 6e 20 66 61 63 74 20 74 68   when in fact th
bbf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
bc00: 20 6e 65 76 65 72 20 62 65 20 4e 55 4c 4c 29 20   never be NULL) 
bc10: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20 73 6d  might.** be a sm
bc20: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  all performance 
bc30: 68 69 74 20 62 75 74 20 69 73 20 6f 74 68 65 72  hit but is other
bc40: 77 69 73 65 20 68 61 72 6d 6c 65 73 73 2e 20 20  wise harmless.  
bc50: 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20  On the other.** 
bc60: 68 61 6e 64 2c 20 61 20 66 61 6c 73 65 20 6e 65  hand, a false ne
bc70: 67 61 74 69 76 65 20 28 72 65 74 75 72 6e 69 6e  gative (returnin
bc80: 67 20 46 41 4c 53 45 20 77 68 65 6e 20 74 68 65  g FALSE when the
bc90: 20 72 65 73 75 6c 74 20 63 6f 75 6c 64 20 62 65   result could be
bca0: 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c 6c 20 6c   NULL).** will l
bcb0: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
bcc0: 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 61 6e 73  an incorrect ans
bcd0: 77 65 72 2e 20 20 53 6f 20 77 68 65 6e 20 69 6e  wer.  So when in
bce0: 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 0a 2a   doubt, return.*
bcf0: 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e 74 20 73  * TRUE..*/.int s
bd00: 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e  qlite3ExprCanBeN
bd10: 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70 72 20 2a  ull(const Expr *
bd20: 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 77  p){.  u8 op;.  w
bd30: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
bd40: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
bd50: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
bd60: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
bd70: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
bd80: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
bd90: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
bda0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
bdb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
bdc0: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
bdd0: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73  _STRING:.    cas
bde0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
bdf0: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
be00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
be10: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
be20: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
be30: 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  p->pTab!=0 );.  
be40: 20 20 20 20 72 65 74 75 72 6e 20 45 78 70 72 48      return ExprH
be50: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
be60: 5f 43 61 6e 42 65 4e 75 6c 6c 29 20 7c 7c 0a 20  _CanBeNull) ||. 
be70: 20 20 20 20 20 20 20 20 20 20 20 20 28 70 2d 3e              (p->
be80: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 2d  iColumn>=0 && p-
be90: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e 69  >pTab->aCol[p->i
bea0: 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d  Column].notNull=
beb0: 3d 30 29 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  =0);.    default
bec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
bed0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
bee0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
bef0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
bf00: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
bf10: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
bf20: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
bf30: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
bf40: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
bf50: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
bf60: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
bf70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bf80: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
bf90: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
bfa0: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
bfb0: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
bfc0: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
bfd0: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
bfe0: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
bff0: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
c000: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
c010: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
c020: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
c030: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
c040: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
c050: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
c060: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
c070: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
c080: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
c090: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
c0a0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74  E_AFF_NONE ) ret
c0b0: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
c0c0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
c0d0: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
c0e0: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
c0f0: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
c100: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
c110: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
c120: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
c130: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
c140: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
c150: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
c160: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
c170: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
c180: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c1a0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
c1b0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
c1c0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
c1d0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
c1e0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
c1f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
c200: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
c210: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
c220: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
c230: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
c240: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c250: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
c260: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c270: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c280: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
c290: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
c2a0: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
c2b0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
c2c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
c2d0: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
c2e0: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
c2f0: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
c300: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
c310: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
c320: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
c330: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c340: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c350: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c360: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
c370: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
c380: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
c390: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
c3a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
c3b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
c3c0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
c3d0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
c3e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
c3f0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
c400: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
c410: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
c420: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
c430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
c440: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c450: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
c460: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
c470: 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  to the IN operat
c480: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
c490: 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66  on a.** query of
c4a0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
c4b0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
c4c0: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68  CT ...).**.** Wh
c4d0: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  ere the SELECT..
c4e0: 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73  . clause is as s
c4f0: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
c500: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
c510: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  s.** routine..**
c520: 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f  .** The Select o
c530: 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20  bject passed in 
c540: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
c550: 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e   preprocessed an
c560: 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68  d no.** errors h
c570: 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a  ave been found..
c580: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c590: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c5a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
c5b0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
c5c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
c5d0: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
c5e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
c5f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
c600: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c610: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
c620: 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74          /* right
c630: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
c640: 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   is SELECT */.  
c650: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
c660: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c670: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
c680: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
c690: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
c6a0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
c6b0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
c6c0: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
c6d0: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
c6e0: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
c6f0: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
c700: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
c710: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
c720: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
c730: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
c740: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
c750: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
c760: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
c770: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
c780: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
c790: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
c7a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
c7b0: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
c7c0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
c7d0: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
c7e0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
c7f0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c810: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
c820: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
c830: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
c840: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
c850: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
c860: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
c870: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
c880: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c890: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
c8a0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
c8b0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
c8c0: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
c8d0: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
c8e0: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
c8f0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c900: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
c910: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
c920: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
c930: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
c940: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
c950: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
c960: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
c970: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
c980: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66  >a[0].pTab;.  if
c990: 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  ( NEVER(pTab==0)
c9a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
c9b0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
c9c0: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
c9d0: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
c9e0: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
c9f0: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
ca00: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
ca10: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
ca20: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
ca30: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
ca40: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
ca50: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
ca60: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
ca70: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
ca80: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d      /* One colum
ca90: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
caa0: 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c  set */.  if( pEL
cab0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
cac0: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
cad0: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
cae0: 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sult is a column
caf0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
cb00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
cb10: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
cb20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
cb30: 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
cb40: 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
cb50: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
cb60: 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
cb70: 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
cb80: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
cb90: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
cba0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
cbb0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
cbc0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
cbd0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
cbe0: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
cbf0: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
cc00: 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
cc10: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
cc20: 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
cc30: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
cc40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
cc50: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
cc60: 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
cc70: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
cc80: 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
cc90: 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
cca0: 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
ccb0: 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
ccc0: 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
ccd0: 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
cce0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
ccf0: 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
cd00: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
cd10: 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
cd20: 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
cd30: 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
cd40: 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
cd50: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
cd60: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
cd70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd80: 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
cd90: 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
cda0: 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
cdb0: 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
cdc0: 6a 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  j1;.  sqlite3Vdb
cdd0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
cde0: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
cdf0: 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20 3d 20 73 71  Null);.  j1 = sq
ce00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ce10: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
ce20: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
ce30: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
ce40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ce50: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
ce60: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
ce70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ce80: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
ce90: 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
cea0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
ceb0: 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
cec0: 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
ced0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
cee0: 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  v, j1);.}...#ifn
cef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cf00: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
cf10: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
cf20: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
cf30: 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
cf40: 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
cf50: 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
cf60: 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
cf70: 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
cf80: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
cf90: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
cfa0: 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
cfb0: 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
cfc0: 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
cfd0: 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
cfe0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
cff0: 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
d000: 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
d010: 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
d020: 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
d030: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
d040: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
d050: 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
d060: 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
d070: 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
d080: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d090: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
d0a0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
d0b0: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
d0c0: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
d0d0: 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
d0e0: 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
d0f0: 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
d100: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
d110: 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
d120: 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
d130: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
d140: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
d150: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
d160: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d170: 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
d180: 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
d190: 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
d1a0: 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
d1b0: 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
d1c0: 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
d1d0: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
d1e0: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
d1f0: 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
d200: 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
d210: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
d220: 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
d230: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
d240: 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
d250: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
d260: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
d270: 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
d280: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
d290: 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
d2a0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
d2b0: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
d2c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d2d0: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
d2e0: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
d2f0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
d300: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
d310: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
d320: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
d330: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
d340: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
d350: 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
d360: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d370: 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
d380: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
d390: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
d3a0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
d3b0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
d3c0: 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
d3d0: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
d3e0: 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
d3f0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
d400: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
d410: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
d440: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
d450: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
d460: 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
d470: 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
d480: 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
d490: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
d4c0: 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
d4d0: 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
d4e0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
d4f0: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
d500: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
d510: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
d520: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
d530: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
d540: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
d550: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
d560: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
d570: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
d580: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
d590: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
d5a0: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
d5b0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
d5c0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
d5d0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
d5e0: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
d5f0: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
d600: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
d610: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
d620: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
d630: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d640: 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
d650: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ble..**.** The i
d660: 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  nFlags parameter
d670: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78   must contain ex
d680: 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
d690: 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
d6a0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
d6b0: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20  IN_INDEX_LOOP.  
d6c0: 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
d6d0: 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
d6e0: 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
d6f0: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
d700: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
d710: 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20  d for a.** fast 
d720: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
d730: 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
d740: 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
d750: 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69  set, the.** IN i
d760: 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65  ndex will be use
d770: 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
d780: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
d790: 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49   RHS of the.** I
d7a0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
d7b0: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
d7c0: 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
d7d0: 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
d7e0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
d7f0: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
d800: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
d810: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
d820: 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
d830: 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
d840: 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
d850: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
d860: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
d870: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
d880: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
d890: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
d8a0: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
d8b0: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
d8c0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
d8d0: 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  ** has a UNIQUE 
d8e0: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e  constraint or UN
d8f0: 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  IQUE index..**.*
d900: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
d910: 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
d920: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
d930: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
d940: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
d950: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
d960: 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
d970: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
d980: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
d990: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
d9a0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
d9b0: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
d9c0: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
d9d0: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
d9e0: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
d9f0: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
da00: 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
da10: 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
da20: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
da30: 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
da40: 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
da50: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
da60: 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
da70: 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
da80: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
da90: 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
daa0: 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
dab0: 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
dac0: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
dad0: 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
dae0: 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
daf0: 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
db00: 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
db10: 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
db20: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
db30: 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
db40: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
db50: 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
db60: 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
db70: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
db80: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
db90: 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
dba0: 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
dbb0: 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
dbc0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
dbd0: 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
dbe0: 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
dbf0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
dc00: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
dc10: 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
dc20: 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
dc30: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
dc40: 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
dc50: 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
dc60: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
dc70: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
dc80: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
dc90: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
dca0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
dcb0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
dcc0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
dcd0: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
dce0: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
dcf0: 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
dd00: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
dd10: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
dd20: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
dd30: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
dd40: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
dd50: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
dd60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
dd70: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
dd80: 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
dd90: 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
dda0: 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
ddb0: 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
ddc0: 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
ddd0: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
dde0: 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
ddf0: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
de00: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
de10: 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
de20: 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
de30: 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
de40: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
de50: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
de60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
de70: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
de80: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
de90: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
dea0: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75 33 32  e, Expr *pX, u32
deb0: 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70   inFlags, int *p
dec0: 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20  rRhsHasNull){.  
ded0: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
df00: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
df10: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
df20: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
df50: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
df60: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
df70: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
df80: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
df90: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
dfa0: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
dfb0: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
dfc0: 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
dfd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
dfe0: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
dff0: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
e000: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
e010: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
e020: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
e030: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
e040: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
e050: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
e060: 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
e070: 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
e080: 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
e090: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
e0a0: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
e0b0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
e0c0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
e0d0: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
e0e0: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
e0f0: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
e100: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
e110: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
e120: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
e130: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
e140: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
e150: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
e160: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
e170: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
e180: 26 26 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  && isCandidateFo
e190: 72 49 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20  rInOpt(p) ){.   
e1a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
e1b0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
e1c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e1d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
e1e0: 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  /.    Table *pTa
e1f0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e210: 54 61 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a  Table <table>. *
e220: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  /.    Expr *pExp
e230: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e250: 45 78 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75  Expression <colu
e260: 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69  mn> */.    i16 i
e270: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
e2a0: 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f  lumn <column> */
e2b0: 0a 20 20 20 20 69 31 36 20 69 44 62 3b 20 20 20  .    i16 iDb;   
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e2e0: 61 74 61 62 61 73 65 20 69 64 78 20 66 6f 72 20  atabase idx for 
e2f0: 70 54 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73  pTab */..    ass
e300: 65 72 74 28 20 70 20 29 3b 20 20 20 20 20 20 20  ert( p );       
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e330: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e340: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
e350: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
e360: 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
e370: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e380: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e390: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
e3a0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ert( p->pEList->
e3b0: 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
e3c0: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e3d0: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e3e0: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73  pt(p) */.    ass
e3f0: 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20  ert( p->pSrc!=0 
e400: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
e410: 20 2f 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69   /* Because of i
e420: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
e430: 70 74 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61  pt(p) */.    pTa
e440: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
e450: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70  ].pTab;.    pExp
e460: 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
e470: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [0].pExpr;.    i
e480: 43 6f 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72  Col = (i16)pExpr
e490: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20  ->iColumn;.   . 
e4a0: 20 20 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50     /* Code an OP
e4b0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  _Transaction and
e4c0: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f   OP_TableLock fo
e4d0: 72 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20  r <table>. */.  
e4e0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
e4f0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
e500: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
e510: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
e520: 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
e530: 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  rse, iDb);.    s
e540: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
e550: 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
e560: 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
e570: 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f  ->zName);..    /
e580: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e590: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
e5a0: 72 6f 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20  rom two places. 
e5b0: 49 6e 20 62 6f 74 68 20 63 61 73 65 73 20 74 68  In both cases th
e5c0: 65 20 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61  e vdbe.    ** ha
e5d0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
e5e0: 6c 6c 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73  llocated. So ass
e5f0: 75 6d 65 20 73 71 6c 69 74 65 33 47 65 74 56 64  ume sqlite3GetVd
e600: 62 65 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20  be() is always. 
e610: 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
e620: 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
e630: 20 20 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20    assert(v);.   
e640: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e650: 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d       int iAddr =
e660: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
e670: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
e680: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e690: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ..      sqlite3O
e6a0: 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
e6b0: 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62   iTab, iDb, pTab
e6c0: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
e6d0: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
e6e0: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20  _INDEX_ROWID;.. 
e6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e700: 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64  JumpHere(v, iAdd
e710: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
e720: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
e730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e750: 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
e760: 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  /..      /* The 
e770: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
e780: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
e790: 6f 6d 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e  omparison. If an
e7a0: 20 69 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20   index is to.   
e7b0: 20 20 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e     ** be used in
e7c0: 20 70 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70   place of a temp
e7d0: 2d 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20  -table, it must 
e7e0: 62 65 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72  be ordered accor
e7f0: 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ding.      ** to
e800: 20 74 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   this collation 
e810: 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20  sequence.  */.  
e820: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65      CollSeq *pRe
e830: 71 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  q = sqlite3Binar
e840: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
e850: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
e860: 74 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  t, pExpr);..    
e870: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
e880: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  the affinity tha
e890: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
e8a0: 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20  o perform the . 
e8b0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
e8c0: 6f 6e 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  on is the same a
e8d0: 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  s the affinity o
e8e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66  f the column. If
e8f0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20  .      ** it is 
e900: 6e 6f 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  not, it is not p
e910: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61  ossible to use a
e920: 6e 79 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ny index..      
e930: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66  */.      int aff
e940: 69 6e 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74  inity_ok = sqlit
e950: 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
e960: 6b 28 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  k(pX, pTab->aCol
e970: 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29  [iCol].affinity)
e980: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  ;..      for(pId
e990: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
e9a0: 70 49 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30  pIdx && eType==0
e9b0: 20 26 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b   && affinity_ok;
e9c0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e9d0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
e9e0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  (pIdx->aiColumn[
e9f0: 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20  0]==iCol).      
ea00: 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e     && sqlite3Fin
ea10: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
ea20: 28 64 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  (db), pIdx->azCo
ea30: 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a  ll[0], 0)==pReq.
ea40: 20 20 20 20 20 20 20 20 20 26 26 20 28 21 6d 75           && (!mu
ea50: 73 74 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70  stBeUnique || (p
ea60: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
ea70: 26 26 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  && IsUniqueIndex
ea80: 28 70 49 64 78 29 29 29 0a 20 20 20 20 20 20 20  (pIdx))).       
ea90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
eaa0: 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65  t iAddr = sqlite
eab0: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
eac0: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
ead0: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v);.          sq
eae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
eaf0: 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
eb00: 69 54 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  iTab, pIdx->tnum
eb10: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
eb20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
eb30: 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  P4KeyInfo(pParse
eb40: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
eb50: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
eb60: 76 2c 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a  v, "%s", pIdx->z
eb70: 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Name));.        
eb80: 20 20 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44    assert( IN_IND
eb90: 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d  EX_INDEX_DESC ==
eba0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
ebb0: 41 53 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ASC+1 );.       
ebc0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
ebd0: 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20  DEX_INDEX_ASC + 
ebe0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
ebf0: 5b 30 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  [0];..          
ec00: 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
ec10: 20 26 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b   && !pTab->aCol[
ec20: 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b  iCol].notNull ){
ec30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 72  .            *pr
ec40: 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70  RhsHasNull = ++p
ec50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
ec60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ec70: 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
ec80: 2c 20 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61  , iTab, *prRhsHa
ec90: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  sNull);.        
eca0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
ecb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ecc0: 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20  e(v, iAddr);.   
ecd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ece0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
ecf0: 66 20 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67  f no preexisting
ed00: 20 69 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61   index is availa
ed10: 62 6c 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63  ble for the IN c
ed20: 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49  lause.  ** and I
ed30: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20  N_INDEX_NOOP is 
ed40: 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79  an allowed reply
ed50: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48  .  ** and the RH
ed60: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
ed70: 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20  ator is a list, 
ed80: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 0a 20  not a subquery. 
ed90: 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
eda0: 69 73 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f  is not contant o
edb0: 72 20 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77  r has two or few
edc0: 65 72 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74  er terms,.  ** t
edd0: 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f  hen it is not wo
ede0: 72 74 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20  rth creating an 
edf0: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
ee00: 74 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a  to evaluate.  **
ee10: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
ee20: 20 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e   so return IN_IN
ee30: 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20  DEX_NOOP..  */. 
ee40: 20 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20   if( eType==0.  
ee50: 20 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49   && (inFlags & I
ee60: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29  N_INDEX_NOOP_OK)
ee70: 0a 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50  .   && !ExprHasP
ee80: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
ee90: 49 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20  IsSelect).   && 
eea0: 28 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73  (!sqlite3InRhsIs
eeb0: 43 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20  Constant(pX) || 
eec0: 70 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pX->x.pList->nEx
eed0: 70 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20  pr<=2).  ){.    
eee0: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
eef0: 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20  _NOOP;.  }.     
ef00: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ..  if( eType==0
ef10: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64   ){.    /* Could
ef20: 20 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69   not find an exi
ef30: 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69  sting table or i
ef40: 6e 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74  ndex to use as t
ef50: 68 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20  he RHS b-tree.. 
ef60: 20 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61     ** We will ha
ef70: 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ve to generate a
ef80: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
ef90: 65 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e  e to do the job.
efa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20  .    */.    u32 
efb0: 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20  savedNQueryLoop 
efc0: 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79  = pParse->nQuery
efd0: 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d  Loop;.    int rM
efe0: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a  ayHaveNull = 0;.
eff0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
f000: 4e 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66  NDEX_EPH;.    if
f010: 28 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49  ( inFlags & IN_I
f020: 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20  NDEX_LOOP ){.   
f030: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
f040: 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20  yLoop = 0;.     
f050: 20 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e   if( pX->pLeft->
f060: 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78  iColumn<0 && !Ex
f070: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58  prHasProperty(pX
f080: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f090: 29 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65  ){.        eType
f0a0: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49   = IN_INDEX_ROWI
f0b0: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
f0c0: 65 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61  else if( prRhsHa
f0d0: 73 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a  sNull ){.      *
f0e0: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72  prRhsHasNull = r
f0f0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b  MayHaveNull = ++
f100: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
f110: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
f120: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
f130: 72 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76  rse, pX, rMayHav
f140: 65 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e  eNull, eType==IN
f150: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20  _INDEX_ROWID);. 
f160: 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72     pParse->nQuer
f170: 79 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75  yLoop = savedNQu
f180: 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65  eryLoop;.  }else
f190: 7b 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65  {.    pX->iTable
f1a0: 20 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72   = iTab;.  }.  r
f1b0: 65 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23  eturn eType;.}.#
f1c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
f1d0: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73  erate code for s
f1e0: 63 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73  calar subqueries
f1f0: 20 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75   used as a subqu
f200: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ery expression, 
f210: 45 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e  EXISTS,.** or IN
f220: 20 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61   operators.  Exa
f230: 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
f240: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
f250: 62 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73  b)          -- s
f260: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45  ubquery.**     E
f270: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20  XISTS (SELECT a 
f280: 46 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49  FROM b)   -- EXI
f290: 53 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20  STS subquery.** 
f2a0: 20 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31      x IN (4,5,11
f2b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  )              -
f2c0: 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  - IN operator wi
f2d0: 74 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74  th list on right
f2e0: 2d 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20  -hand side.**   
f2f0: 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61    x IN (SELECT a
f300: 20 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20   FROM b)     -- 
f310: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
f320: 20 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65   subquery on the
f330: 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65   right.**.** The
f340: 20 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72   pExpr parameter
f350: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
f360: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
f370: 6f 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a  ontains the IN.*
f380: 2a 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75  * operator or su
f390: 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  bquery..**.** If
f3a0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77   parameter isRow
f3b0: 69 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  id is non-zero, 
f3c0: 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
f3d0: 70 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74  pExpr is guarant
f3e0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20  eed.** to be of 
f3f0: 74 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64  the form "<rowid
f400: 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c  > IN (?, ?, ?)",
f410: 20 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69   where <rowid> i
f420: 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  s a reference.**
f430: 20 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72   to some integer
f440: 20 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61   key column of a
f450: 20 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49   table B-Tree. I
f460: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65  n this case, use
f470: 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d   an.** intkey B-
f480: 54 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68  Tree to store th
f490: 65 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29  e set of IN(...)
f4a0: 20 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20   values instead 
f4b0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
f4c0: 28 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c  (slower) variabl
f4d0: 65 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d  e length keys B-
f4e0: 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  Tree..**.** If r
f4f0: 4d 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e  MayHaveNull is n
f500: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65  on-zero, that me
f510: 61 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65  ans that the ope
f520: 72 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a  ration is an IN.
f530: 2a 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54  ** (not a SELECT
f540: 20 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20   or EXISTS) and 
f550: 74 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67  that the RHS mig
f560: 68 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c  ht contains NULL
f570: 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72  s..** All this r
f580: 6f 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69  outine does is i
f590: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65  nitialize the re
f5a0: 67 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20  gister given by 
f5b0: 72 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20  rMayHaveNull.** 
f5c0: 74 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e  to NULL.  Callin
f5d0: 67 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20  g routines will 
f5e0: 74 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61  take care of cha
f5f0: 6e 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73  nging this regis
f600: 74 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20  ter.** value to 
f610: 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20  non-NULL if the 
f620: 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
f630: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45  ..**.** For a SE
f640: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f  LECT or EXISTS o
f650: 70 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20  perator, return 
f660: 74 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61  the register tha
f670: 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72  t holds the.** r
f680: 65 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f  esult.  For IN o
f690: 70 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61  perators or if a
f6a0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f6b0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
f6c0: 20 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65   is 0..*/.#ifnde
f6d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
f6e0: 42 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74  BQUERY.int sqlit
f6f0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
f700: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f710: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
f720: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f730: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
f740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f750: 65 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72  e IN, SELECT, or
f760: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
f770: 20 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75   */.  int rHasNu
f780: 6c 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a  llFlag,       /*
f790: 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72   Register that r
f7a0: 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e  ecords whether N
f7b0: 55 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48  ULLs exist in RH
f7c0: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77  S */.  int isRow
f7d0: 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  id             /
f7e0: 2a 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f  * If true, LHS o
f7f0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73  f IN operator is
f800: 20 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20   a rowid */.){. 
f810: 20 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69   int jmpIfDynami
f820: 63 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  c = -1;         
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f840: 4f 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64  One-time test ad
f850: 64 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dress */.  int r
f860: 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Reg = 0;        
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73     /* Register s
f890: 74 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67  toring resulting
f8a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
f8b0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
f8c0: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45  Parse);.  if( NE
f8d0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
f8e0: 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45  rn 0;.  sqlite3E
f8f0: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
f900: 72 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rse);..  /* This
f910: 20 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75   code must be ru
f920: 6e 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74  n in its entiret
f930: 79 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20  y every time it 
f940: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  is encountered. 
f950: 20 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68   ** if any of th
f960: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  e following is t
f970: 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rue:.  **.  **  
f980: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
f990: 61 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f  and side is a co
f9a0: 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72  rrelated subquer
f9b0: 79 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  y.  **    *  The
f9c0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
f9d0: 20 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f   is an expressio
f9e0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  n list containin
f9f0: 67 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a  g variables.  **
fa00: 20 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e      *  We are in
fa10: 73 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20  side a trigger. 
fa20: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20   **.  ** If all 
fa30: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
fa40: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20   false, then we 
fa50: 63 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64  can run this cod
fa60: 65 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a  e just once.  **
fa70: 20 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74   save the result
fa80: 73 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65  s, and reuse the
fa90: 20 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20   same result on 
faa0: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63  subsequent invoc
fab0: 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ations..  */.  i
fac0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
fad0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
fae0: 72 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  rSelect) ){.    
faf0: 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73  jmpIfDynamic = s
fb00: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
fb10: 50 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65  Parse); VdbeCove
fb20: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69  rage(v);.  }..#i
fb30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fb40: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20  T_EXPLAIN.  if( 
fb50: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
fb60: 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
fb70: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
fb80: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70  rintf(.        p
fb90: 50 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43  Parse->db, "EXEC
fba0: 55 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52  UTE %s%s SUBQUER
fbb0: 59 20 25 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61  Y %d", jmpIfDyna
fbc0: 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45  mic>=0?"":"CORRE
fbd0: 4c 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20  LATED ",.       
fbe0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
fbf0: 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52  N?"LIST":"SCALAR
fc00: 22 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  ", pParse->iNext
fc10: 53 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a  SelectId.    );.
fc20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fc30: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
fc40: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
fc50: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
fc60: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
fc70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
fc80: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
fc90: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
fca0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
fcb0: 20 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20   affinity;      
fcc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
fcd0: 69 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f  ity of the LHS o
fce0: 66 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20  f the IN */.    
fcf0: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd10: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
fd20: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
fd30: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
fd40: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
fd50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a  pExpr->pLeft; /*
fd60: 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
fd70: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
fd80: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
fd90: 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20  eyInfo = 0;     
fda0: 20 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74   /* Key informat
fdb0: 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66  ion */..      af
fdc0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
fdd0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65  ExprAffinity(pLe
fde0: 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ft);..      /* W
fdf0: 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61  hether this is a
fe00: 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e  n 'x IN(SELECT..
fe10: 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28  .)' or an 'x IN(
fe20: 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20  <exprlist>)'.   
fe30: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
fe40: 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74   it is handled t
fe50: 68 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e  he same way.  An
fe60: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
fe70: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
fe80: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
fe90: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
fea0: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
feb0: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
fec0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
fed0: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
fee0: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
fef0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
ff00: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
ff10: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
ff20: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
ff30: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
ff40: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
ff50: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
ff60: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
ff70: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
ff80: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
ff90: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
ffa0: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
ffb0: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
ffc0: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
ffd0: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
ffe0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
fff0: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
10000 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
10010 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
10020 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
10030 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
10040 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
10050 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
10060 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
10070 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
10080 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
10090 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
100a0 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
100b0 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
100c0 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
100d0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
100e0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
100f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
10100 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70  nEphemeral, pExp
10110 72 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f  r->iTable, !isRo
10120 77 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79  wid);.      pKey
10130 49 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f  Info = isRowid ?
10140 20 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49   0 : sqlite3KeyI
10150 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
10160 3e 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20  >db, 1, 1);..   
10170 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
10180 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
10190 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
101a0 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
101b0 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
101c0 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
101d0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
101e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
101f0 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
10200 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
10210 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
10220 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
10230 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
10240 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
10250 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
10260 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
10270 6c 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  lect = pExpr->x.
10280 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
10290 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
102a0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  ;.        ExprLi
102b0 73 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20  st *pEList;..   
102c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73       assert( !is
102d0 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
102e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
102f0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
10300 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
10310 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64  able);.        d
10320 65 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75  est.affSdst = (u
10330 38 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  8)affinity;.    
10340 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78      assert( (pEx
10350 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30  pr->iTable&0x000
10360 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69  0FFFF)==pExpr->i
10370 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  Table );.       
10380 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
10390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65   = 0;.        te
103a0 73 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d  stcase( pSelect-
103b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
103c0 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20  istinct );.     
103d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65     testcase( pKe
103e0 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43  yInfo==0 ); /* C
103f0 61 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20  aused by OOM in 
10400 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10410 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  loc() */.       
10420 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
10430 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
10440 63 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20  ct, &dest) ){.  
10450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
10460 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
10470 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Info);.         
10480 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
10490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c     }.        pEL
104a0 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
104b0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
104c0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21  ssert( pKeyInfo!
104d0 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c  =0 ); /* OOM wil
104e0 6c 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74  l cause exit aft
104f0 65 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  er sqlite3Select
10500 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  () */.        as
10510 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
10520 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10530 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t( pEList->nExpr
10540 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
10550 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
10560 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
10570 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20  pKeyInfo) );.   
10580 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
10590 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Coll[0] = sqlite
105a0 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f  3BinaryCompareCo
105b0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
105c0 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30       pEList->a[0
10610 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
10620 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53  }else if( ALWAYS
10630 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21  (pExpr->x.pList!
10640 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  =0) ){.        /
10650 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
10660 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
10670 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
10680 20 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20      ** For each 
10690 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
106a0 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
106b0 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
106c0 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
106d0 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
106e0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
106f0 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
10700 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
10710 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
10720 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
10730 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
10740 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
10750 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
10760 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
10770 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
10780 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
10790 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
107a0 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   i;.        Expr
107b0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
107c0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
107d0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
107e0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
107f0 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  m;.        int r
10800 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20  1, r2, r3;..    
10810 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
10820 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
10830 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
10840 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  _AFF_NONE;.     
10850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10860 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
10870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
10880 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
10890 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66  riteable(pKeyInf
108a0 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o) );.          
108b0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
108c0 30 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  0] = sqlite3Expr
108d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
108e0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
108f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
10900 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
10910 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
10920 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
10930 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d   */.        r1 =
10940 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
10950 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
10960 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
10970 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
10980 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
10990 69 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65  isRowid ) sqlite
109a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
109b0 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a  P_Null, 0, r2);.
109c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c          for(i=pL
109d0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
109e0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  m=pList->a; i>0;
109f0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
10a00 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
10a10 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  pE2 = pItem->pEx
10a20 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  pr;.          in
10a30 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20  t iValToIns;..  
10a40 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
10a50 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
10a60 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65  not constant the
10a70 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  n we will need t
10a80 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  o.          ** d
10a90 69 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20  isable the test 
10aa0 74 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74  that was generat
10ab0 65 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61  ed above that ma
10ac0 6b 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20  kes sure.       
10ad0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20     ** this code 
10ae0 6f 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e  only executes on
10af0 63 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72  ce.  Because for
10b00 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a   a non-constant.
10b10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70            ** exp
10b20 72 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20  ression we need 
10b30 74 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f  to rerun this co
10b40 64 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20  de each time..  
10b50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10b60 20 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79       if( jmpIfDy
10b70 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c  namic>=0 && !sql
10b80 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
10b90 6e 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20  nt(pE2) ){.     
10ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10bb0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
10bc0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
10bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70  .            jmp
10be0 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a  IfDynamic = -1;.
10bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
10c00 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61         /* Evalua
10c10 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  te the expressio
10c20 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20  n and insert it 
10c30 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61  into the temp ta
10c40 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ble */.         
10c50 20 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20   if( isRowid && 
10c60 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10c70 65 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54  eger(pE2, &iValT
10c80 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20  oIns) ){.       
10c90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ca0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
10cb0 65 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69  ertInt, pExpr->i
10cc0 54 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54  Table, r2, iValT
10cd0 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  oIns);.         
10ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10cf0 20 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33      r3 = sqlite3
10d00 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
10d10 50 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b  Parse, pE2, r1);
10d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10d30 20 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20   isRowid ){.    
10d40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10d50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10d60 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c  P_MustBeInt, r3,
10d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10da0 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62               Vdb
10dc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10de0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10df0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70   OP_Insert, pExp
10e00 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72  r->iTable, r2, r
10e10 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
10e20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10e40 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
10e50 65 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20  eRecord, r3, 1, 
10e60 72 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31  r2, &affinity, 1
10e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
10e80 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
10e90 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
10ea0 70 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a  pParse, r3, 1);.
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10ed0 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
10ee0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
10ef0 72 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r2);.           
10f00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
10f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10f20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10f30 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10f40 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
10f50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
10f60 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
10f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10f80 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
10f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fa0 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
10fb0 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e  , (void *)pKeyIn
10fc0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
10fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10fe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10ff0 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
11000 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
11010 45 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74  ECT:.    default
11020 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
11030 74 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  this has to be a
11040 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
11050 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
11060 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
11070 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
11080 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
11090 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
110a0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
110b0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
110c0 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
110d0 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20  olumn.  If this 
110e0 69 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72  is an EXISTS, wr
110f0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ite.      ** an 
11100 69 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65  integer 0 (not e
11110 78 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69  xists) or 1 (exi
11120 73 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f  sts) into a memo
11130 72 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a  ry cell.      **
11140 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74   and record that
11150 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
11160 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
11170 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
11180 70 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSel;           
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
111b0 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20  t to encode */. 
111c0 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
111d0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
111e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
111f0 77 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  w to deal with S
11200 45 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a  ELECt result */.
11210 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11220 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
11230 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74  XISTS );.      t
11240 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
11250 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
11260 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11270 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
11280 53 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  STS || pExpr->op
11290 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a  ==TK_SELECT );..
112a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
112b0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
112c0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
112d0 74 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  t) );.      pSel
112e0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
112f0 65 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ect;.      sqlit
11300 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11310 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61  (&dest, 0, ++pPa
11320 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20  rse->nMem);.    
11330 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
11340 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
11350 20 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74        dest.eDest
11360 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20   = SRT_Mem;.    
11370 20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d      dest.iSdst =
11380 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
11390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
113a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
113b0 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44  ull, 0, dest.iSD
113c0 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56  Parm);.        V
113d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
113e0 49 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65  Init subquery re
113f0 73 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d  sult"));.      }
11400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65  else{.        de
11410 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45  st.eDest = SRT_E
11420 78 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73  xists;.        s
11430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11440 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11450 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
11460 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
11470 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
11480 45 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29  EXISTS result"))
11490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
114a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
114b0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
114c0 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20  el->pLimit);.   
114d0 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20     pSel->pLimit 
114e0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
114f0 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
11500 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  R, 0, 0,.       
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69             &sqli
11530 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29  te3IntTokens[1])
11540 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c  ;.      pSel->iL
11550 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
11560 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
11570 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
11580 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
11590 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
115a0 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29  , pSel, &dest) )
115b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
115c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
115d0 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53    rReg = dest.iS
115e0 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70  DParm;.      Exp
115f0 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
11600 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75  pExpr, EP_NoRedu
11610 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
11620 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
11630 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20  f( rHasNullFlag 
11640 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
11650 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
11660 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
11670 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20  HasNullFlag);.  
11680 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79  }..  if( jmpIfDy
11690 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20  namic>=0 ){.    
116a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
116b0 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61  ere(v, jmpIfDyna
116c0 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  mic);.  }.  sqli
116d0 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
116e0 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75  pParse);..  retu
116f0 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69  rn rReg;.}.#endi
11700 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11710 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
11720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11730 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
11740 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
11750 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73  or an IN express
11760 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ion..**.**      
11770 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
11780 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  ).**      x IN (
11790 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
117a0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  .).**.** The lef
117b0 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53  t-hand side (LHS
117c0 29 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78  ) is a scalar ex
117d0 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72  pression.  The r
117e0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28  ight-hand side (
117f0 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72  RHS).** is an ar
11800 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  ray of zero or m
11810 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65  ore values.  The
11820 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
11830 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  rue if the LHS i
11840 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77  s.** contained w
11850 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
11860 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  The value of the
11870 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75   expression is u
11880 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a  nknown (NULL).**
11890 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e   if the LHS is N
118a0 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48  ULL or if the LH
118b0 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  S is not contain
118c0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48  ed within the RH
118d0 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53  S and the.** RHS
118e0 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
118f0 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65   more NULL value
11900 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
11910 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
11920 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20  code that jumps 
11930 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69  to destIfFalse i
11940 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74  f the LHS is not
11950 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77   .** contained w
11960 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20  ithin the RHS.  
11970 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  If due to NULLs 
11980 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d  we cannot determ
11990 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a  ine if the LHS.*
119a0 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  * is contained i
119b0 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a  n the RHS then j
119c0 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c  ump to destIfNul
119d0 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  l.  If the LHS i
119e0 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77  s contained.** w
119f0 69 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68  ithin the RHS th
11a00 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e  en fall through.
11a10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11a20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
11a30 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  N(.  Parse *pPar
11a40 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
11a50 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
11a60 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
11a70 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
11a80 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pr,          /* 
11a90 54 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f  The IN expressio
11aa0 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49  n */.  int destI
11ab0 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20  fFalse,      /* 
11ac0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53  Jump here if LHS
11ad0 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
11ae0 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a  d in the RHS */.
11af0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
11b00 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
11b10 68 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75  here if the resu
11b20 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20  lts are unknown 
11b30 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a  due to NULLs */.
11b40 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73  ){.  int rRhsHas
11b50 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65  Null = 0;  /* Re
11b60 67 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74  gister that is t
11b70 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61  rue if RHS conta
11b80 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  ins NULL values 
11b90 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69  */.  char affini
11ba0 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ty;        /* Co
11bb0 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74  mparison affinit
11bc0 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e  y to use */.  in
11bd0 74 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20  t eType;        
11be0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
11bf0 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he RHS */.  int 
11c00 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
11c10 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75    /* Temporary u
11c20 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
11c30 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
11c40 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d         /* Statem
11c50 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
11c60 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  uction */..  /* 
11c70 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e  Compute the RHS.
11c80 20 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74     After this st
11c90 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69  ep, the table wi
11ca0 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70  th cursor.  ** p
11cb0 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c  Expr->iTable wil
11cc0 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  l contains the v
11cd0 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20  alues that make 
11ce0 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f  up the RHS..  */
11cf0 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
11d00 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
11d10 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
11d20 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72   OOM detected pr
11d30 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ior to this rout
11d40 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ine */.  VdbeNoo
11d50 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65  pComment((v, "be
11d60 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a  gin IN expr"));.
11d70 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65    eType = sqlite
11d80 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61  3FindInIndex(pPa
11d90 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20  rse, pExpr,.    
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45           IN_INDE
11dc0 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49  X_MEMBERSHIP | I
11dd0 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c  N_INDEX_NOOP_OK,
11de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
11e00 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49  stIfFalse==destI
11e10 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68  fNull ? 0 : &rRh
11e20 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a  sHasNull);..  /*
11e30 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
11e40 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
11e50 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
11e60 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
11e70 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70  .  ** of the exp
11e80 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74  ression. affinit
11e90 79 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74  yStr stores a st
11ea0 61 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74  atic string suit
11eb0 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34  able for.  ** P4
11ec0 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
11ed0 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69  d..  */.  affini
11ee0 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ty = comparisonA
11ef0 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
11f00 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c  .  /* Code the L
11f10 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66  HS, the <expr> f
11f20 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28  rom "<expr> IN (
11f30 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71  ...)"..  */.  sq
11f40 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
11f50 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31  sh(pParse);.  r1
11f60 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11f70 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
11f80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
11f90 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
11fa0 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a  Left, r1);..  /*
11fb0 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49   If sqlite3FindI
11fc0 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74  nIndex() did not
11fd0 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
11fe0 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
11ff0 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  .  ** suitable f
12000 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  or evaluating th
12010 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74  e IN operator, t
12020 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69  hen evaluate usi
12030 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ng a.  ** sequen
12040 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
12050 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  s..  */.  if( eT
12060 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f  ype==IN_INDEX_NO
12070 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  OP ){.    ExprLi
12080 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
12090 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
120a0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
120b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
120c0 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
120d0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
120e0 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c  nt labelOk = sql
120f0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12100 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32  l(v);.    int r2
12110 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20  , regToFree;.   
12120 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d   int regCkNull =
12130 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
12140 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
12150 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
12160 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
12170 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73  ) );.    if( des
12180 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46  tIfNull!=destIfF
12190 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65  alse ){.      re
121a0 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65  gCkNull = sqlite
121b0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
121c0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
121d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
121e0 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72  OP_BitAnd, r1, r
121f0 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20  1, regCkNull);. 
12200 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
12210 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  0; ii<pList->nEx
12220 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
12230 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
12240 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
12250 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  , pList->a[ii].p
12260 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65  Expr, &regToFree
12270 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67  );.      if( reg
12280 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65  CkNull && sqlite
12290 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70  3ExprCanBeNull(p
122a0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  List->a[ii].pExp
122b0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  r) ){.        sq
122c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
122d0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65  v, OP_BitAnd, re
122e0 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67  gCkNull, r2, reg
122f0 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  CkNull);.      }
12300 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c  .      if( ii<pL
12310 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20  ist->nExpr-1 || 
12320 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
12330 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
12340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12350 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72  dOp4(v, OP_Eq, r
12360 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a  1, labelOk, r2,.
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
12390 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
123a0 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  EQ);.        Vdb
123b0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
123c0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  i<pList->nExpr-1
123d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
123e0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d  overageIf(v, ii=
123f0 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  =pList->nExpr-1)
12400 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12410 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12420 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20   affinity);.    
12430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12440 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e   assert( destIfN
12450 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
12460 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
12470 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12480 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74   OP_Ne, r1, dest
12490 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20  IfFalse, r2,.   
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43         (void*)pC
124c0 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
124d0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
124e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
124f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12500 2c 20 61 66 66 69 6e 69 74 79 20 7c 20 53 51 4c  , affinity | SQL
12510 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
12520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12530 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
12540 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
12550 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  ToFree);.    }. 
12560 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c     if( regCkNull
12570 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12580 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12590 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e  P_IsNull, regCkN
125a0 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  ull, destIfNull)
125b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
125c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
125d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
125e0 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66  _Goto, 0, destIf
125f0 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  False);.    }.  
12600 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12610 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
12620 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  elOk);.    sqlit
12630 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12640 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75  (pParse, regCkNu
12650 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ll);.  }else{.  
12660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c  .    /* If the L
12670 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  HS is NULL, then
12680 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 65   the result is e
12690 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e  ither false or N
126a0 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20  ULL depending.  
126b0 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20    ** on whether 
126c0 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74 79  the RHS is empty
126d0 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74   or not, respect
126e0 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ively..    */.  
126f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
12700 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72  rCanBeNull(pExpr
12710 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
12720 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c    if( destIfNull
12730 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b  ==destIfFalse ){
12740 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72  .        /* Shor
12750 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d  tcut for the com
12760 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
12770 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c  he false and NUL
12780 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20  L outcomes are. 
12790 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61         ** the sa
127a0 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  me. */.        s
127b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
127c0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
127d0 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  1, destIfNull); 
127e0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
127f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12800 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31 20        int addr1 
12810 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12820 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  Op1(v, OP_NotNul
12830 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65  l, r1); VdbeCove
12840 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12850 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12860 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
12870 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
12880 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
12890 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
128a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
128b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
128c0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
128d0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
128e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
128f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12900 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
12910 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54 79  }.  .    if( eTy
12920 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57  pe==IN_INDEX_ROW
12930 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ID ){.      /* I
12940 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
12950 20 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49   RHS is the ROWI
12960 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65  D of table b-tre
12970 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
12980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12990 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
129a0 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61  nt, r1, destIfFa
129b0 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  lse); VdbeCovera
129c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
129d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
129e0 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
129f0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
12a00 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b  estIfFalse, r1);
12a10 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
12a20 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  age(v);.    }els
12a30 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  e{.      /* In t
12a40 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52 48  his case, the RH
12a50 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d  S is an index b-
12a60 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tree..      */. 
12a70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12a80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66  AddOp4(v, OP_Aff
12a90 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c  inity, r1, 1, 0,
12aa0 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a   &affinity, 1);.
12ab0 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
12ac0 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  he set membershi
12ad0 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68  p test fails, th
12ae0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12af0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22   the .      ** "
12b00 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72  x IN (...)" expr
12b10 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  ession must be e
12b20 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e  ither 0 or NULL.
12b30 20 49 66 20 74 68 65 20 73 65 74 0a 20 20 20 20   If the set.    
12b40 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
12b50 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12b60 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
12b70 20 30 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a   0. If the set .
12b80 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
12b90 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55  s one or more NU
12ba0 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20  LL values, then 
12bb0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12bc0 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
12bd0 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
12be0 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  LL..      */.   
12bf0 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
12c00 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75  fFalse!=destIfNu
12c10 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c  ll || rRhsHasNul
12c20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  l==0 );.      if
12c30 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30  ( rRhsHasNull==0
12c40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
12c50 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
12c60 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61  if it is known a
12c70 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74  t compile time t
12c80 68 61 74 20 74 68 65 20 52 48 53 0a 20 20 20 20  hat the RHS.    
12c90 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f      ** cannot co
12ca0 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65  ntain NULL value
12cb0 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  s. This happens 
12cc0 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  as the result.  
12cd0 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e        ** of a "N
12ce0 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
12cf0 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  int in the datab
12d00 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
12d10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
12d20 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20  * Also run this 
12d30 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69  branch if NULL i
12d40 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
12d50 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a  FALSE.        **
12d60 20 66 6f 72 20 74 68 69 73 20 70 61 72 74 69 63   for this partic
12d70 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72  ular IN operator
12d80 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12da0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
12db0 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
12dc0 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46  >iTable, destIfF
12dd0 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20  alse, r1, 1);.  
12de0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12df0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
12e00 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
12e10 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74  n this branch, t
12e20 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e  he RHS of the IN
12e30 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
12e40 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20   NULL and.      
12e50 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63    ** the presenc
12e60 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74  e of a NULL on t
12e70 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64  he RHS makes a d
12e80 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
12e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63  .        ** outc
12ea0 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ome..        */.
12eb0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a          int j1;.
12ec0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69    .        /* Fi
12ed0 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
12ee0 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 63   if the LHS is c
12ef0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
12f00 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20  RHS.  If so,.   
12f10 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
12f20 20 61 6e 73 77 65 72 20 69 73 20 54 52 55 45 20   answer is TRUE 
12f30 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
12f40 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53  NULLs in the RHS
12f50 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a   does.        **
12f60 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66   not matter.  If
12f70 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
12f80 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
12f90 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20   RHS, then the. 
12fa0 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72         ** answer
12fb0 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
12fc0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c  RHS contains NUL
12fd0 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65  Ls and the answe
12fe0 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  r is.        ** 
12ff0 46 41 4c 53 45 20 69 66 20 74 68 65 20 52 48 53  FALSE if the RHS
13000 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20   is NULL-free.. 
13010 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13020 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
13030 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
13040 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
13050 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31  iTable, 0, r1, 1
13060 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
13070 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13080 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13090 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
130a0 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c  ll, rRhsHasNull,
130b0 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
130c0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
130d0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
130e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
130f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
13100 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20  destIfFalse);.  
13110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13120 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
13130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13140 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
13150 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
13160 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  se, r1);.  sqlit
13170 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
13180 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f  Parse);.  VdbeCo
13190 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49  mment((v, "end I
131a0 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e  N expr"));.}.#en
131b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
131c0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
131d0 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  /*.** Duplicate 
131e0 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a  an 8-byte value.
131f0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
13200 64 75 70 38 62 79 74 65 73 28 56 64 62 65 20 2a  dup8bytes(Vdbe *
13210 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  v, const char *i
13220 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20  n){.  char *out 
13230 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
13240 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
13250 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(v), 8);.  if(
13260 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63   out ){.    memc
13270 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a  py(out, in, 8);.
13280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74    }.  return out
13290 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
132a0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
132b0 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65  G_POINT./*.** Ge
132c0 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
132d0 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
132e0 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67  put the floating
132f0 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
13300 64 65 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30  described by z[0
13310 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69  ..n-1] into regi
13320 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a  ster iMem..**.**
13330 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20   The z[] string 
13340 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f  will probably no
13350 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e  t be zero-termin
13360 61 74 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a  ated.  But the .
13370 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65  ** z[n] characte
13380 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
13390 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20  to be something 
133a0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f  that does not lo
133b0 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63  ok.** like the c
133c0 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74  ontinuation of t
133d0 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  he number..*/.st
133e0 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65  atic void codeRe
133f0 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  al(Vdbe *v, cons
13400 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
13410 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69  egateFlag, int i
13420 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Mem){.  if( ALWA
13430 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20  YS(z!=0) ){.    
13440 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20  double value;.  
13450 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
13460 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
13470 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74  value, sqlite3St
13480 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54  rlen30(z), SQLIT
13490 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73  E_UTF8);.    ass
134a0 65 72 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e  ert( !sqlite3IsN
134b0 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20  aN(value) ); /* 
134c0 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76  The new AtoF nev
134d0 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a  er returns NaN *
134e0 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61 74 65  /.    if( negate
134f0 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d  Flag ) value = -
13500 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20  value;.    zV = 
13510 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63 68  dup8bytes(v, (ch
13520 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20  ar*)&value);.   
13530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13540 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30  p4(v, OP_Real, 0
13550 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50  , iMem, 0, zV, P
13560 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  4_REAL);.  }.}.#
13570 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  endif.../*.** Ge
13580 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75  nerate an instru
13590 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ction that will 
135a0 70 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20  put the integer 
135b0 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74  describe by.** t
135c0 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e  ext z[0..n-1] in
135d0 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d  to register iMem
135e0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a  ..**.** Expr.u.z
135f0 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20  Token is always 
13600 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65  UTF8 and zero-te
13610 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  rminated..*/.sta
13620 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
13630 65 67 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  eger(Parse *pPar
13640 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
13650 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e   int negFlag, in
13660 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20  t iMem){.  Vdbe 
13670 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
13680 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  be;.  if( pExpr-
13690 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
136a0 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  alue ){.    int 
136b0 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  i = pExpr->u.iVa
136c0 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  lue;.    assert(
136d0 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28   i>=0 );.    if(
136e0 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d   negFlag ) i = -
136f0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  i;.    sqlite3Vd
13700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13710 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29  nteger, i, iMem)
13720 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
13730 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61  nt c;.    i64 va
13740 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lue;.    const c
13750 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e  har *z = pExpr->
13760 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73  u.zToken;.    as
13770 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20  sert( z!=0 );.  
13780 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63    c = sqlite3Dec
13790 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
137a0 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63  alue);.    if( c
137b0 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20  ==0 || (c==2 && 
137c0 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  negFlag) ){.    
137d0 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20    char *zV;.    
137e0 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b    if( negFlag ){
137f0 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20   value = c==2 ? 
13800 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
13810 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20   -value; }.     
13820 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65 73 28   zV = dup8bytes(
13830 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65  v, (char*)&value
13840 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13850 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
13860 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c  _Int64, 0, iMem,
13870 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34   0, zV, P4_INT64
13880 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69  );.    }else{.#i
13890 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
138a0 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
138b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
138c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
138d0 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72  versized integer
138e0 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67  : %s%s", negFlag
138f0 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b   ? "-" : "", z);
13900 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53  .#else.#ifndef S
13910 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49  QLITE_OMIT_HEX_I
13920 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69 66 28  NTEGER.      if(
13930 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
13940 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29  p(z,"0x",2)==0 )
13950 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13960 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13970 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74  , "hex literal t
13980 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b  oo big: %s", z);
13990 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
139a0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
139b0 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
139c0 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d  z, negFlag, iMem
139d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
139e0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
139f0 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63  *.** Clear a cac
13a00 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  he entry..*/.sta
13a10 74 69 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e  tic void cacheEn
13a20 74 72 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a  tryClear(Parse *
13a30 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 79  pParse, struct y
13a40 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20  ColCache *p){.  
13a50 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29  if( p->tempReg )
13a60 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  {.    if( pParse
13a70 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79  ->nTempReg<Array
13a80 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65  Size(pParse->aTe
13a90 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20  mpReg) ){.      
13aa0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
13ab0 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
13ac0 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  g++] = p->iReg;.
13ad0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d      }.    p->tem
13ae0 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pReg = 0;.  }.}.
13af0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69  ../*.** Record i
13b00 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  n the column cac
13b10 68 65 20 74 68 61 74 20 61 20 70 61 72 74 69 63  he that a partic
13b20 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  ular column from
13b30 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
13b40 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64   table is stored
13b50 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   in a particular
13b60 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f   register..*/.vo
13b70 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
13b80 63 68 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a  cheStore(Parse *
13b90 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
13ba0 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20  , int iCol, int 
13bb0 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
13bc0 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20    int minLru;.  
13bd0 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74  int idxLru;.  st
13be0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13bf0 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  p;..  /* Unless 
13c00 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
13c10 75 72 72 65 64 2c 20 72 65 67 69 73 74 65 72 20  urred, register 
13c20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
13c30 79 73 20 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a  ys positive. */.
13c40 20 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30    assert( iReg>0
13c50 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
13c60 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
13c70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
13c80 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
13c90 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38  -1 && iCol<32768
13ca0 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63   );  /* Finite c
13cb0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f  olumn numbers */
13cc0 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
13cd0 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c  E_ColumnCache fl
13ce0 61 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  ag disables the 
13cf0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54  column cache.  T
13d00 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  his is used.  **
13d10 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c   for testing onl
13d20 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68  y - to verify th
13d30 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73  at SQLite always
13d40 20 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61   gets the same a
13d50 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20  nswer.  ** with 
13d60 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  and without the 
13d70 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
13d80 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
13d90 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50  ationDisabled(pP
13da0 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45  arse->db, SQLITE
13db0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20  _ColumnCache) ) 
13dc0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69  return;..  /* Fi
13dd0 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20  rst replace any 
13de0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a  existing entry..
13df0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
13e00 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20  ly, the way the 
13e10 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20  column cache is 
13e20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20  currently used, 
13e30 77 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  we are guarantee
13e40 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  d.  ** that the 
13e50 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65  object will neve
13e60 72 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20  r already be in 
13e70 63 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74  cache.  Verify t
13e80 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20  his guarantee.. 
13e90 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
13ea0 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  UG.  for(i=0, p=
13eb0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13ec0 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13ed0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13ee0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13ef0 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e  ->iReg==0 || p->
13f00 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20  iTable!=iTab || 
13f10 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c  p->iColumn!=iCol
13f20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
13f30 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70    /* Find an emp
13f40 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c  ty slot and repl
13f50 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28  ace it */.  for(
13f60 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
13f70 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
13f80 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
13f90 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
13fa0 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a  ( p->iReg==0 ){.
13fb0 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20        p->iLevel 
13fc0 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
13fd0 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  Level;.      p->
13fe0 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20  iTable = iTab;. 
13ff0 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20       p->iColumn 
14000 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d  = iCol;.      p-
14010 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
14020 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d      p->tempReg =
14030 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75   0;.      p->lru
14040 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
14050 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  eCnt++;.      re
14060 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
14070 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
14080 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20  e last recently 
14090 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75  used */.  minLru
140a0 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   = 0x7fffffff;. 
140b0 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20   idxLru = -1;.  
140c0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
140d0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
140e0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
140f0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14100 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e    if( p->lru<min
14110 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78  Lru ){.      idx
14120 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d  Lru = i;.      m
14130 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a  inLru = p->lru;.
14140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14150 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30  ALWAYS(idxLru>=0
14160 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50  ) ){.    p = &pP
14170 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b  arse->aColCache[
14180 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e  idxLru];.    p->
14190 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
141a0 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
141b0 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54    p->iTable = iT
141c0 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ab;.    p->iColu
141d0 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  mn = iCol;.    p
141e0 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  ->iReg = iReg;. 
141f0 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
14200 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  0;.    p->lru = 
14210 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
14220 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
14230 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
14240 64 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69  dicate that regi
14250 73 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52  sters between iR
14260 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20  eg..iReg+nReg-1 
14270 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  are being overwr
14280 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20  itten..** Purge 
14290 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67  the range of reg
142a0 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20  isters from the 
142b0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f  column cache..*/
142c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
142d0 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72  rCacheRemove(Par
142e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
142f0 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b  iReg, int nReg){
14300 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
14310 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20 6e  iLast = iReg + n
14320 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75 63  Reg - 1;.  struc
14330 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
14340 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
14350 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
14360 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
14370 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
14380 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69      int r = p->i
14390 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d  Reg;.    if( r>=
143a0 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73 74  iReg && r<=iLast
143b0 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45   ){.      cacheE
143c0 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65  ntryClear(pParse
143d0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69  , p);.      p->i
143e0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
143f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65   }.}../*.** Reme
14400 6d 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  mber the current
14410 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f   column cache co
14420 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20  ntext.  Any new 
14430 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a  entries added.**
14440 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f   added to the co
14450 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72  lumn cache after
14460 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72   this call are r
14470 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a  emoved when the.
14480 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
14490 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a   pop occurs..*/.
144a0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
144b0 43 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20  CachePush(Parse 
144c0 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
144d0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b  se->iCacheLevel+
144e0 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  +;.#ifdef SQLITE
144f0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
14500 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
14510 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
14520 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
14530 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25 64  intf("PUSH to %d
14540 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
14550 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
14560 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
14570 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63  emove from the c
14580 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20  olumn cache any 
14590 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72  entries that wer
145a0 65 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68  e added since th
145b0 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  e.** the previou
145c0 73 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  s sqlite3ExprCac
145d0 68 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e  hePush operation
145e0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
145f0 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68  s, restore.** th
14600 65 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 73  e cache to the s
14610 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 70  tate it was in p
14620 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65  rior the most re
14630 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f  cent Push..*/.vo
14640 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
14650 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50  chePop(Parse *pP
14660 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
14670 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
14680 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  he *p;.  assert(
14690 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
146a0 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61  evel>=1 );.  pPa
146b0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
146c0 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  --;.#ifdef SQLIT
146d0 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50  E_DEBUG.  if( pP
146e0 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
146f0 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
14700 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70  opTrace ){.    p
14710 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25  rintf("POP  to %
14720 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43  d\n", pParse->iC
14730 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a  acheLevel);.  }.
14740 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
14750 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
14760 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
14770 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14780 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
14790 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65  ->iReg && p->iLe
147a0 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
147b0 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20  heLevel ){.     
147c0 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
147d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
147e0 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
147f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14800 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64  ** When a cached
14810 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65   column is reuse
14820 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  d, make sure tha
14830 74 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69  t its register i
14840 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61  s.** no longer a
14850 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65  vailable as a te
14860 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69  mp register.  ti
14870 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61  cket #3879:  tha
14880 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74  t same.** regist
14890 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74  er might be in t
148a0 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74  he cache in mult
148b0 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20  iple places, so 
148c0 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65  be sure to.** ge
148d0 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73  t them all..*/.s
148e0 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
148f0 65 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65  e3ExprCachePinRe
14900 67 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50  gister(Parse *pP
14910 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b  arse, int iReg){
14920 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
14930 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
14940 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
14950 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
14960 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
14970 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14980 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
14990 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
149a0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a  p->tempReg = 0;.
149b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
149c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
149d0 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   to extract the 
149e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f  value of the iCo
149f0 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  l-th column of a
14a00 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   table..*/.void 
14a10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
14a20 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28  etColumnOfTable(
14a30 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
14a40 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75     /* The VDBE u
14a50 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
14a60 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  n */.  Table *pT
14a70 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ab,    /* The ta
14a80 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
14a90 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  he value */.  in
14aa0 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a  t iTabCur,    /*
14ab0 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f   The table curso
14ac0 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75  r.  Or the PK cu
14ad0 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54  rsor for WITHOUT
14ae0 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20   ROWID */.  int 
14af0 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49  iCol,       /* I
14b00 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75  ndex of the colu
14b10 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f  mn to extract */
14b20 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20  .  int regOut   
14b30 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
14b40 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69  e value into thi
14b50 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
14b60 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c  .  if( iCol<0 ||
14b70 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b   iCol==pTab->iPK
14b80 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
14b90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14ba0 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72  P_Rowid, iTabCur
14bb0 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c  , regOut);.  }el
14bc0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d  se{.    int op =
14bd0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
14be0 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20   ? OP_VColumn : 
14bf0 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  OP_Column;.    i
14c00 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nt x = iCol;.   
14c10 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
14c20 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20  Tab) ){.      x 
14c30 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f  = sqlite3ColumnO
14c40 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72  fIndex(sqlite3Pr
14c50 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
14c60 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  ab), iCol);.    
14c70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
14c80 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69  eAddOp3(v, op, i
14c90 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75  TabCur, x, regOu
14ca0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
14cb0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ol>=0 ){.    sql
14cc0 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c  ite3ColumnDefaul
14cd0 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c  t(v, pTab, iCol,
14ce0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a   regOut);.  }.}.
14cf0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
14d00 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
14d10 78 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75  xtract the iColu
14d20 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f  mn-th column fro
14d30 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20  m.** table pTab 
14d40 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f  and store the co
14d50 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20  lumn value in a 
14d60 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66  register.  An ef
14d70 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  fort.** is made 
14d80 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
14d90 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
14da0 69 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20  ister iReg, but 
14db0 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67  this is.** not g
14dc0 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20  uaranteed.  The 
14dd0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
14de0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20  column value is 
14df0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
14e00 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
14e10 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20   open cursor to 
14e20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77  pTab in iTable w
14e30 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
14e40 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  .** is called.  
14e50 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65  If iColumn<0 the
14e60 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  n code is genera
14e70 74 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74  ted that extract
14e80 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a  s the rowid..*/.
14e90 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
14ea0 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20  odeGetColumn(.  
14eb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14ec0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
14ed0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
14ee0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
14ef0 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a  le *pTab,     /*
14f00 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
14f10 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
14f20 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f   reading from */
14f30 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20  .  int iColumn, 
14f40 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
14f50 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
14f60 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14f70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  ,      /* The cu
14f80 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
14f90 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
14fa0 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20  int iReg,       
14fb0 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74   /* Store result
14fc0 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70  s here */.  u8 p
14fd0 35 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  5            /* 
14fe0 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P5 value for OP_
14ff0 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56  Column */.){.  V
15000 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
15010 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
15020 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
15030 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69  che *p;..  for(i
15040 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
15050 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
15060 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
15070 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
15080 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d   p->iReg>0 && p-
15090 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
150a0 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69  && p->iColumn==i
150b0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
150c0 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
150d0 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
150e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
150f0 61 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28  achePinRegister(
15100 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29  pParse, p->iReg)
15110 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
15120 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ->iReg;.    }.  
15130 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21  }  .  assert( v!
15140 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  =0 );.  sqlite3E
15150 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
15160 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c  OfTable(v, pTab,
15170 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e   iTable, iColumn
15180 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70  , iReg);.  if( p
15190 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  5 ){.    sqlite3
151a0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
151b0 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20  p5);.  }else{   
151c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
151d0 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73  CacheStore(pPars
151e0 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  e, iTable, iColu
151f0 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20  mn, iReg);.  }. 
15200 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a   return iReg;.}.
15210 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c  ./*.** Clear all
15220 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e   column cache en
15230 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tries..*/.void s
15240 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
15250 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72  lear(Parse *pPar
15260 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se){.  int i;.  
15270 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
15280 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45   *p;..#if SQLITE
15290 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
152a0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
152b0 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
152c0 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
152d0 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b  intf("CLEAR\n");
152e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f  .  }.#endif.  fo
152f0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
15300 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
15310 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
15320 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
15330 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20  if( p->iReg ){. 
15340 20 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43       cacheEntryC
15350 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b  lear(pParse, p);
15360 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d  .      p->iReg =
15370 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
15380 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68  ./*.** Record th
15390 65 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61  e fact that an a
153a0 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68  ffinity change h
153b0 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69  as occurred on i
153c0 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65  Count.** registe
153d0 72 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  rs starting with
153e0 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64   iStart..*/.void
153f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15400 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
15410 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15420 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
15430 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  Count){.  sqlite
15440 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65  3ExprCacheRemove
15450 28 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c  (pParse, iStart,
15460 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a   iCount);.}../*.
15470 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15480 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74   to move content
15490 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20   from registers 
154a0 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52  iFrom...iFrom+nR
154b0 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20  eg-1.** over to 
154c0 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e  iTo..iTo+nReg-1.
154d0 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e   Keep the column
154e0 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74   cache up-to-dat
154f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
15500 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50  e3ExprCodeMove(P
15510 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
15520 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
15530 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61  , int nReg){.  a
15540 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54  ssert( iFrom>=iT
15550 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b  o+nReg || iFrom+
15560 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73  nReg<=iTo );.  s
15570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15580 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
15590 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20  OP_Move, iFrom, 
155a0 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71  iTo, nReg);.  sq
155b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65  lite3ExprCacheRe
155c0 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72  move(pParse, iFr
155d0 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69  om, nReg);.}..#i
155e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
155f0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
15600 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41  ed(SQLITE_COVERA
15610 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  GE_TEST)./*.** R
15620 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
15630 79 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68  y register in th
15640 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69  e range iFrom..i
15650 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a  To (inclusive).*
15660 2a 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  * is used as par
15670 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
15680 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
15690 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
156a0 64 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  d within assert(
156b0 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29  ) and testcase()
156c0 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20   macros only.** 
156d0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70  and does not app
156e0 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20  ear in a normal 
156f0 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
15700 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d   int usedAsColum
15710 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  nCache(Parse *pP
15720 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c  arse, int iFrom,
15730 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74   int iTo){.  int
15740 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
15750 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72  lCache *p;.  for
15760 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
15770 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
15780 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
15790 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
157a0 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a  nt r = p->iReg;.
157b0 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d      if( r>=iFrom
157c0 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74   && r<=iTo ) ret
157d0 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54  urn 1;    /*NO_T
157e0 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  EST*/.  }.  retu
157f0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
15800 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c  * SQLITE_DEBUG |
15810 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  | SQLITE_COVERAG
15820 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  E_TEST */../*.**
15830 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70 72   Convert an expr
15840 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61  ession node to a
15850 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f 0a   TK_REGISTER.*/.
15860 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
15870 54 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20  ToRegister(Expr 
15880 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  *p, int iReg){. 
15890 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b   p->op2 = p->op;
158a0 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45  .  p->op = TK_RE
158b0 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61  GISTER;.  p->iTa
158c0 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78  ble = iReg;.  Ex
158d0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
158e0 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a  p, EP_Skip);.}..
158f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15900 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
15910 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
15920 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
15930 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ** expression.  
15940 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65  Attempt to store
15950 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
15960 72 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74  register "target
15970 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  "..** Return the
15980 20 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20   register where 
15990 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
159a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74  ed..**.** With t
159b0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
159c0 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74  re is no guarant
159d0 65 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20  ee that results 
159e0 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65  will.** be store
159f0 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68  d in target.  Th
15a00 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62  e result might b
15a10 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65  e stored in some
15a20 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74   other.** regist
15a30 65 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76  er if it is conv
15a40 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e  enient to do so.
15a50 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
15a60 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63  nction.** must c
15a70 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
15a80 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  code and move th
15a90 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
15aa0 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69   desired.** regi
15ab0 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ster..*/.int sql
15ac0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
15ad0 65 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  et(Parse *pParse
15ae0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
15af0 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64  nt target){.  Vd
15b00 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
15b10 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56  pVdbe;  /* The V
15b20 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  M under construc
15b30 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
15b40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15b50 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
15b60 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
15b70 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74  .  int inReg = t
15b80 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  arget;       /* 
15b90 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69  Results stored i
15ba0 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67  n register inReg
15bb0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65   */.  int regFre
15bc0 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
15bd0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66  /* If non-zero f
15be0 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61  ree this tempora
15bf0 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ry register */. 
15c00 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20   int regFree2 = 
15c10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  0;         /* If
15c20 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74   non-zero free t
15c30 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65  his temporary re
15c40 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
15c50 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20  r1, r2, r3, r4; 
15c60 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
15c70 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
15c80 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
15c90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
15ca0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
15cb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
15cc0 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20   Expr tempX;    
15cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
15ce0 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69  mporary expressi
15cf0 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  on node */..  as
15d00 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26  sert( target>0 &
15d10 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65  & target<=pParse
15d20 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20  ->nMem );.  if( 
15d30 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  v==0 ){.    asse
15d40 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  rt( pParse->db->
15d50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
15d60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15d70 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  }..  if( pExpr==
15d80 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b  0 ){.    op = TK
15d90 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NULL;.  }else{.
15da0 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e      op = pExpr->
15db0 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  op;.  }.  switch
15dc0 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
15dd0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20   TK_AGG_COLUMN: 
15de0 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
15df0 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70  *pAggInfo = pExp
15e00 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20  r->pAggInfo;.   
15e10 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
15e20 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70  o_col *pCol = &p
15e30 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45  AggInfo->aCol[pE
15e40 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20  xpr->iAgg];.    
15e50 20 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d    if( !pAggInfo-
15e60 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20  >directMode ){. 
15e70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15e80 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20  Col->iMem>0 );. 
15e90 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70         inReg = p
15ea0 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20  Col->iMem;.     
15eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15ec0 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e  }else if( pAggIn
15ed0 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64  fo->useSortingId
15ee0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  x ){.        sql
15ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
15f00 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67  , OP_Column, pAg
15f10 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64  gInfo->sortingId
15f20 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  xPTab,.         
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
15f50 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  erColumn, target
15f60 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
15f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f80 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  /* Otherwise, fa
15f90 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65  ll thru into the
15fa0 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20   TK_COLUMN case 
15fb0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
15fc0 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
15fd0 20 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20       int iTab = 
15fe0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
15ff0 20 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20       if( iTab<0 
16000 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
16010 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20  Parse->ckBase>0 
16020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16030 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b  Generating CHECK
16040 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20   constraints or 
16050 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70  inserting into p
16060 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
16070 20 20 20 20 20 20 20 20 20 20 69 6e 52 65 67 20            inReg 
16080 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
16090 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73   + pParse->ckBas
160a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  e;.          bre
160b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
160c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
160d0 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 20  Deleting from a 
160e0 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f  partial index */
160f0 0a 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20  .          iTab 
16100 3d 20 70 50 61 72 73 65 2d 3e 69 50 61 72 74 49  = pParse->iPartI
16110 64 78 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  dxTab;.        }
16120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16130 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
16140 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
16150 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16160 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
16190 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74  mn, iTab, target
161a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20   pExpr->op2);.  
161d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
161e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
161f0 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
16200 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
16210 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67  , pExpr, 0, targ
16220 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
16230 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
16240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
16250 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63  TING_POINT.    c
16260 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
16270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
16280 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
16290 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
162a0 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  e) );.      code
162b0 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75  Real(v, pExpr->u
162c0 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67  .zToken, 0, targ
162d0 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  et);.      break
162e0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
162f0 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
16300 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
16310 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
16320 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
16330 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
16340 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16350 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(v, OP_String8
16360 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20  , 0, target, 0, 
16370 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
16380 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
16390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
163a0 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
163b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
163c0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
163d0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
163e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
163f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16400 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
16410 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
16420 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b  : {.      int n;
16430 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
16440 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72  r *z;.      char
16450 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61   *zBlob;.      a
16460 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
16470 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
16480 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
16490 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
164a0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
164b0 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75  ='x' || pExpr->u
164c0 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20  .zToken[0]=='X' 
164d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
164e0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
164f0 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [1]=='\'' );.   
16500 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75     z = &pExpr->u
16510 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20  .zToken[2];.    
16520 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
16530 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20  len30(z) - 1;.  
16540 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d      assert( z[n]
16550 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20  =='\'' );.      
16560 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48  zBlob = sqlite3H
16570 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33  exToBlob(sqlite3
16580 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29  VdbeDb(v), z, n)
16590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
165a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
165b0 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65  Blob, n/2, targe
165c0 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f  t, 0, zBlob, P4_
165d0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
165e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
165f0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
16600 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
16610 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16620 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16630 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16640 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16650 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
16660 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
16670 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
16680 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ken[0]!=0 );.   
16690 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
166a0 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61  dOp2(v, OP_Varia
166b0 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
166c0 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  umn, target);.  
166d0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75      if( pExpr->u
166e0 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b  .zToken[1]!=0 ){
166f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16700 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16710 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20  [0]=='?' .      
16720 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
16730 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
16740 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
16750 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
16760 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ])==0 );.       
16770 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16780 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72  geP4(v, -1, pPar
16790 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d  se->azVar[pExpr-
167a0 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f  >iColumn-1], P4_
167b0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d  STATIC);.      }
167c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
167d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
167e0 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
167f0 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d    inReg = pExpr-
16800 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62  >iTable;.      b
16810 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16820 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
16830 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
16840 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
16850 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
16860 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b  >pLeft, target);
16870 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16880 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
16890 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
168a0 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
168b0 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
168c0 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
168d0 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
168e0 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
168f0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
16900 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
16910 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16920 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
16930 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
16940 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20  =target ){.     
16950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16960 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
16970 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
16980 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
16990 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
169a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
169b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
169c0 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20  Cast, target,.  
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66        sqlite3Aff
169f0 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
16a00 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a  >u.zToken, 0));.
16a10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16a20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
16a30 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
16a40 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20   inReg) );.     
16a50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
16a60 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
16a70 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31  pParse, inReg, 1
16a80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16a90 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
16aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
16ab0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
16ac0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
16ad0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
16ae0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
16af0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
16b00 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
16b10 45 51 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  EQ: {.      r1 =
16b20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
16b30 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
16b40 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
16b50 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
16b60 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16b70 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
16b80 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
16b90 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63  gFree2);.      c
16ba0 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
16bb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16bc0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
16bd0 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  op,.            
16be0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e        r1, r2, in
16bf0 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52  Reg, SQLITE_STOR
16c00 45 50 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EP2);.      asse
16c10 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
16c20 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
16c30 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
16c40 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
16c50 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
16c60 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
16c70 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
16c80 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
16c90 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
16ca0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
16cb0 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
16cc0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
16cd0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
16ce0 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
16cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
16d00 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
16d10 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
16d20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16d30 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
16d40 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
16d50 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
16d60 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
16d70 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16d80 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
16d90 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
16da0 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
16db0 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
16dc0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
16dd0 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
16de0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16df0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
16e00 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16e10 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
16e20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16e30 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
16e40 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
16e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16e60 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
16e70 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16e80 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
16e90 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
16ea0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
16eb0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16ec0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
16ed0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
16ee0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16ef0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
16f00 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
16f10 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
16f20 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
16f30 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
16f40 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
16f50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
16f60 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
16f70 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
16f80 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
16f90 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
16fa0 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  P2 | SQLITE_NULL
16fb0 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  EQ);.      VdbeC
16fc0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
16fd0 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56  =TK_EQ);.      V
16fe0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
16ff0 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20   op==TK_NE);.   
17000 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17010 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17020 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17030 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17040 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17050 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
17060 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
17070 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
17080 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
17090 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
170a0 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
170b0 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
170c0 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
170d0 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
170e0 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
170f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
17100 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
17110 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
17120 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
17130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17140 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20  _AND==OP_And ); 
17150 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17160 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ase( op==TK_AND 
17170 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17180 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
171a0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f  stcase( op==TK_O
171b0 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  R );.      asser
171c0 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41  t( TK_PLUS==OP_A
171d0 64 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  dd );           
171e0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
171f0 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61  _PLUS );.      a
17200 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
17210 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20  =OP_Subtract ); 
17220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17230 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20  ==TK_MINUS );.  
17240 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
17250 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72  EM==OP_Remainder
17260 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
17270 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b  e( op==TK_REM );
17280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17290 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
172a0 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74  And );      test
172b0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
172c0 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AND );.      ass
172d0 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
172e0 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20  P_BitOr );      
172f0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
17300 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20  TK_BITOR );.    
17310 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41    assert( TK_SLA
17320 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b  SH==OP_Divide );
17330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17340 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b   op==TK_SLASH );
17350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17360 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69  K_LSHIFT==OP_Shi
17370 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74  ftLeft );   test
17380 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48  case( op==TK_LSH
17390 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  IFT );.      ass
173a0 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
173b0 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
173c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
173d0 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_RSHIFT );.   
173e0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
173f0 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
17400 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
17410 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20  ( op==TK_CONCAT 
17420 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
17430 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17440 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17450 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17460 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
17470 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17480 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17490 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
174a0 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ee2);.      sqli
174b0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
174c0 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72   op, r2, r1, tar
174d0 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  get);.      test
174e0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
174f0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
17500 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
17510 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
17520 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17530 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
17540 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d     Expr *pLeft =
17550 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
17560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
17570 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ft );.      if( 
17580 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
17590 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
175a0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
175b0 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74  rse, pLeft, 1, t
175c0 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20  arget);.#ifndef 
175d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
175e0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
175f0 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
17600 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
17610 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17620 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
17630 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
17640 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
17650 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c    codeReal(v, pL
17660 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31  eft->u.zToken, 1
17670 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69  , target);.#endi
17680 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f.      }else{. 
17690 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20         tempX.op 
176a0 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20  = TK_INTEGER;.  
176b0 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67        tempX.flag
176c0 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  s = EP_IntValue|
176d0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20  EP_TokenOnly;.  
176e0 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56        tempX.u.iV
176f0 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  alue = 0;.      
17700 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
17710 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17720 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46  e, &tempX, &regF
17730 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  ree1);.        r
17740 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
17750 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17760 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
17770 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
17780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17790 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61  Op3(v, OP_Subtra
177a0 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  ct, r2, r1, targ
177b0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  et);.        tes
177c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
177d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
177e0 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
177f0 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  et;.      break;
17800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17810 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
17820 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
17830 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
17840 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
17850 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20   );   testcase( 
17860 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b  op==TK_BITNOT );
17870 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17880 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b  K_NOT==OP_Not );
17890 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
178a0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b  e( op==TK_NOT );
178b0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
178c0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
178d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
178e0 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
178f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17900 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
17910 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
17920 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c  arget;.      sql
17930 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17940 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29  , op, r1, inReg)
17950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17960 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
17970 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
17980 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
17990 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
179a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
179b0 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75  _ISNULL==OP_IsNu
179c0 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ll );   testcase
179d0 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20  ( op==TK_ISNULL 
179e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
179f0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f   TK_NOTNULL==OP_
17a00 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63  NotNull ); testc
17a10 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  ase( op==TK_NOTN
17a20 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ULL );.      sql
17a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17a40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
17a50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17a60 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
17a70 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17a80 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
17a90 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
17aa0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
17ab0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
17ac0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
17ad0 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20  beAddOp1(v, op, 
17ae0 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  r1);.      VdbeC
17af0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
17b00 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
17b10 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
17b20 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
17b30 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ULL);.      sqli
17b40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17b50 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
17b60 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
17b70 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
17b80 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
17b90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17ba0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
17bb0 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
17bc0 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f    AggInfo *pInfo
17bd0 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e   = pExpr->pAggIn
17be0 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  fo;.      if( pI
17bf0 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
17c00 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
17c10 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17c20 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
17c30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17c40 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17c50 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
17c60 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70  regate: %s()", p
17c70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
17c80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17c90 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49        inReg = pI
17ca0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72  nfo->aFunc[pExpr
17cb0 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20  ->iAgg].iMem;.  
17cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
17cd0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17ce0 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
17cf0 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
17d00 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a  *pFarg;       /*
17d10 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f   List of functio
17d20 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
17d30 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20       int nFarg; 
17d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17d50 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f  umber of functio
17d60 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
17d70 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
17d80 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ef;         /* T
17d90 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  he function defi
17da0 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  nition object */
17db0 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17dd0 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66   Length of the f
17de0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20  unction name in 
17df0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63  bytes */.      c
17e00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
17e10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
17e20 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
17e30 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73      u32 constMas
17e40 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61  k = 0;     /* Ma
17e50 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  sk of function a
17e60 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72  rguments that ar
17e70 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20  e constant */.  
17e80 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
17e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
17ea0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
17eb0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
17ec0 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  (db);      /* Th
17ed0 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
17ee0 75 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74  used by this dat
17ef0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
17f00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
17f10 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61  0;    /* A colla
17f20 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f  ting sequence */
17f30 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
17f40 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
17f50 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
17f60 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
17f70 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
17f80 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
17f90 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  enOnly) ){.     
17fa0 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20     pFarg = 0;.  
17fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17fc0 20 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72     pFarg = pExpr
17fd0 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
17fe0 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d   }.      nFarg =
17ff0 20 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e   pFarg ? pFarg->
18000 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20  nExpr : 0;.     
18010 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
18020 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
18030 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
18040 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
18050 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
18060 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65      nId = sqlite
18070 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a  3Strlen30(zId);.
18080 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
18090 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
180a0 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  (db, zId, nId, n
180b0 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Farg, enc, 0);. 
180c0 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
180d0 20 7c 7c 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d   || pDef->xFunc=
180e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
180f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18100 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66  arse, "unknown f
18110 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22  unction: %.*s()"
18120 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
18130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18140 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74    }..      /* At
18150 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69  tempt a direct i
18160 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
18170 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f   the built-in CO
18180 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20  ALESCE() and.   
18190 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66     ** IFNULL() f
181a0 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
181b0 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61  avoids unnecessa
181c0 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  ry evaluation of
181d0 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
181e0 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72  nts past the fir
181f0 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75  st non-NULL argu
18200 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
18210 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
18220 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
18230 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20  E_FUNC_COALESCE 
18240 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
18250 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c  ndCoalesce = sql
18260 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18270 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73  l(v);.        as
18280 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29  sert( nFarg>=2 )
18290 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
182a0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
182b0 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
182c0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
182d0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
182e0 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  <nFarg; i++){.  
182f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18300 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18310 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c  NotNull, target,
18320 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20   endCoalesce);. 
18330 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
18340 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18350 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18360 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
18370 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20  e, target, 1);. 
18380 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18390 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
183a0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
183b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
183c0 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e  (pParse, pFarg->
183d0 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  a[i].pExpr, targ
183e0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  et);.          s
183f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
18400 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
18410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
18420 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
18430 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c  Label(v, endCoal
18440 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62  esce);.        b
18450 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
18460 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49       /* The UNLI
18470 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20  KELY() function 
18480 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65  is a no-op.  The
18490 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76   result is the v
184a0 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  alue.      ** of
184b0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
184c0 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
184d0 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
184e0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
184f0 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29  _FUNC_UNLIKELY )
18500 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
18510 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20  ( nFarg>=1 );.  
18520 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
18530 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
18540 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  arg->a[0].pExpr,
18550 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
18560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18570 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
18580 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
18590 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32          if( i<32
185a0 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
185b0 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d  sConstant(pFarg-
185c0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
185d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
185e0 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20  se( i==31 );.   
185f0 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b         constMask
18600 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29   |= MASKBIT32(i)
18610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18620 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
18630 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
18640 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29  E_FUNC_NEEDCOLL)
18650 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b  !=0 && !pColl ){
18660 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
18670 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
18680 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46  llSeq(pParse, pF
18690 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  arg->a[i].pExpr)
186a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
186b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46    }.      if( pF
186c0 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  arg ){.        i
186d0 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a  f( constMask ){.
186e0 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70            r1 = p
186f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
18700 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
18710 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a  >nMem += nFarg;.
18720 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18730 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71           r1 = sq
18740 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
18750 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29  e(pParse, nFarg)
18760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
18770 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67       /* For leng
18780 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28  th() and typeof(
18790 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68  ) functions with
187a0 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65   a column argume
187b0 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  nt,.        ** s
187c0 65 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65  et the P5 parame
187d0 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f  ter to the OP_Co
187e0 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f  lumn opcode to O
187f0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a  PFLAG_LENGTHARG.
18800 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50          ** or OP
18810 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72  FLAG_TYPEOFARG r
18820 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20  espectively, to 
18830 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72  avoid unnecessar
18840 79 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a  y data.        *
18850 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20  * loading..     
18860 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
18870 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
18880 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
18890 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f  C_LENGTH|SQLITE_
188a0 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30  FUNC_TYPEOF))!=0
188b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
188c0 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20   exprOp;.       
188d0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
188e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==1 );.         
188f0 20 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e   assert( pFarg->
18900 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b  a[0].pExpr!=0 );
18910 0a 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f  .          exprO
18920 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  p = pFarg->a[0].
18930 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
18940 20 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d       if( exprOp=
18950 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78  =TK_COLUMN || ex
18960 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  prOp==TK_AGG_COL
18970 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
18980 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54     assert( SQLIT
18990 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f  E_FUNC_LENGTH==O
189a0 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20  PFLAG_LENGTHARG 
189b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
189c0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
189d0 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41  NC_TYPEOF==OPFLA
189e0 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20  G_TYPEOFARG );. 
189f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
18a00 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46  ase( pDef->funcF
18a10 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45  lags & OPFLAG_LE
18a20 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20  NGTHARG );.     
18a30 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b         pFarg->a[
18a40 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20  0].pExpr->op2 = 
18a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a60 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61     pDef->funcFla
18a70 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e  gs & (OPFLAG_LEN
18a80 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59  GTHARG|OPFLAG_TY
18a90 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20  PEOFARG);.      
18aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18ac0 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
18ad0 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69  arse);     /* Ti
18ae0 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62  cket 2ea2425d34b
18af0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  e */.        sql
18b00 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
18b10 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61  List(pParse, pFa
18b20 72 67 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  rg, r1,.        
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45          SQLITE_E
18b50 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45  CEL_DUP|SQLITE_E
18b60 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20  CEL_FACTOR);.   
18b70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18b80 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
18b90 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74  ;      /* Ticket
18ba0 20 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f   2ea2425d34be */
18bb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18bc0 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20        r1 = 0;.  
18bd0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
18be0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
18bf0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20  LTABLE.      /* 
18c00 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61  Possibly overloa
18c10 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  d the function i
18c20 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
18c30 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  ment is.      **
18c40 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
18c50 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a   column..      *
18c60 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69  *.      ** For i
18c70 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28  nfix functions (
18c80 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45  LIKE, GLOB, REGE
18c90 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75  XP, and MATCH) u
18ca0 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  se the.      ** 
18cb0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
18cc0 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20   not the first, 
18cd0 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  as the argument 
18ce0 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20  to test to.     
18cf0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
18d00 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76   a column in a v
18d10 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54  irtual table.  T
18d20 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61  his is done beca
18d30 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  use.      ** the
18d40 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
18d50 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
18d60 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65   (the operand we
18d70 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a   want to.      *
18d80 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f  * control overlo
18d90 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61  ading) ends up a
18da0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
18db0 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20  ument to the.   
18dc0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
18dd0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
18de0 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71  "A glob B" is eq
18df0 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20  uivalent to .   
18e00 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29     ** "glob(B,A)
18e10 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73  .  We want to us
18e20 65 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c  e the A in "A gl
18e30 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20  ob B" to test.  
18e40 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74      ** for funct
18e50 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e  ion overloading.
18e60 20 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65    But we use the
18e70 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62   B term in "glob
18e80 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f  (B,A)"..      */
18e90 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67  .      if( nFarg
18ea0 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66  >=2 && (pExpr->f
18eb0 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46  lags & EP_InfixF
18ec0 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
18ed0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
18ee0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
18ef0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
18f00 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e  rg, pFarg->a[1].
18f10 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65  pExpr);.      }e
18f20 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20  lse if( nFarg>0 
18f30 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
18f40 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65  = sqlite3VtabOve
18f50 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62  rloadFunction(db
18f60 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70  , pDef, nFarg, p
18f70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  Farg->a[0].pExpr
18f80 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
18f90 66 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  f.      if( pDef
18fa0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18fb0 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
18fc0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  LL ){.        if
18fd0 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
18fe0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
18ff0 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
19000 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19010 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
19020 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
19030 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
19040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
19050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
19060 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c  (v, OP_Function,
19070 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20   constMask, r1, 
19080 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190a0 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f  (char*)pDef, P4_
190b0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
190c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
190d0 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67  eP5(v, (u8)nFarg
190e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  );.      if( nFa
190f0 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d  rg && constMask=
19100 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
19110 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19120 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
19130 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20  , nFarg);.      
19140 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
19150 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
19160 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19170 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  Y.    case TK_EX
19180 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54  ISTS:.    case T
19190 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
191a0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
191b0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
191c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
191d0 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20  =TK_SELECT );.  
191e0 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69      inReg = sqli
191f0 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
19200 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
19210 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
19220 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19230 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
19240 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
19250 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
19260 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
19270 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
19280 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
19290 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
192a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
192b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
192c0 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   0, target);.   
192d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
192e0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
192f0 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
19300 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
19310 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19320 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19330 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ger, 1, target);
19340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19350 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19360 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
19370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
19390 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29  dImm, target, 0)
193a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
193b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
193c0 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
193d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
193e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
193f0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19400 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20  Y */...    /*.  
19410 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
19420 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
19430 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
19440 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
19450 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
19460 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
19470 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
19480 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
19490 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
194a0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
194b0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
194c0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
194d0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
194e0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
194f0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
19500 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
19510 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
19520 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
19530 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
19540 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
19550 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
19560 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a  pr->x.pList->a;.
19570 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
19580 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
19590 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20  pr;..      r1 = 
195a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
195b0 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66  emp(pParse, pLef
195c0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
195d0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
195e0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
195f0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
19600 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
19610 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
19620 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
19630 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19640 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33  2==0 );.      r3
19650 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19660 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19670 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33      r4 = sqlite3
19680 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19690 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  e);.      codeCo
196a0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
196b0 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
196c0 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Ge,.            
196d0 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33        r1, r2, r3
196e0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
196f0 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  );  VdbeCoverage
19700 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65  (v);.      pLIte
19710 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68  m++;.      pRigh
19720 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
19730 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
19740 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
19750 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
19760 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
19770 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19780 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
19790 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
197a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
197b0 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
197c0 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
197d0 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
197e0 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20  ght, OP_Le, r1, 
197f0 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53  r2, r4, SQLITE_S
19800 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 56  TOREP2);.      V
19810 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
19820 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19830 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e  eAddOp3(v, OP_An
19840 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65  d, r3, r4, targe
19850 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19860 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
19870 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20  pParse, r3);.   
19880 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
19890 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
198a0 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r4);.      brea
198b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
198c0 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20  e TK_COLLATE: . 
198d0 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
198e0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
198f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
19900 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
19910 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
19920 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
19930 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
19940 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20  ase TK_TRIGGER: 
19950 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
19960 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54  e opcode is TK_T
19970 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65  RIGGER, then the
19980 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
19990 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20   reference.     
199a0 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20   ** to a column 
199b0 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20  in the new.* or 
199c0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
199d0 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  les available to
199e0 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65  .      ** trigge
199f0 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74  r programs. In t
19a00 68 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54  his case Expr.iT
19a10 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31  able is set to 1
19a20 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a   for the.      *
19a30 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  * new.* pseudo-t
19a40 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74  able, or 0 for t
19a50 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
19a60 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c  table. Expr.iCol
19a70 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  umn.      ** is 
19a80 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  set to the colum
19a90 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  n of the pseudo-
19aa0 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f  table to read, o
19ab0 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20  r to -1 to.     
19ac0 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77   ** read the row
19ad0 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20  id field..      
19ae0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
19af0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d  expression is im
19b00 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
19b10 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f  an OP_Param opco
19b20 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20  de. The p1.     
19b30 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73   ** parameter is
19b40 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e   set to 0 for an
19b50 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72   old.rowid refer
19b60 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31  ence, or to (i+1
19b70 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  ).      ** to re
19b80 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20  ference another 
19b90 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c  column of the ol
19ba0 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  d.* pseudo-table
19bb0 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a  , where .      *
19bc0 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78  * i is the index
19bd0 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
19be0 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20  For a new.rowid 
19bf0 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73  reference, p1 is
19c00 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f  .      ** set to
19c10 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20   (n+1), where n 
19c20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19c30 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68   columns in each
19c40 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20   pseudo-table.. 
19c50 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65       ** For a re
19c60 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f  ference to any o
19c70 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ther column in t
19c80 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d  he new.* pseudo-
19c90 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20  table, p1.      
19ca0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b  ** is set to (n+
19cb0 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e  2+i), where n an
19cc0 64 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e  d i are as defin
19cd0 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46  ed previously. F
19ce0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  or.      ** exam
19cf0 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c  ple, if the tabl
19d00 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67  e on which trigg
19d10 65 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69  ers are being fi
19d20 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  red is.      ** 
19d30 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20  declared as:.   
19d40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
19d50 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
19d60 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a  (a, b);.      **
19d70 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70  .      ** Then p
19d80 31 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  1 is interpreted
19d90 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
19da0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
19db0 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f   p1==0   ->    o
19dc0 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d  ld.rowid     p1=
19dd0 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72  =3   ->    new.r
19de0 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20  owid.      **   
19df0 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==1   ->    ol
19e00 64 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.a         p1==
19e10 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a  4   ->    new.a.
19e20 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32        **   p1==2
19e30 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20     ->    old.b  
19e40 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d         p1==5   -
19e50 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20  >    new.b      
19e60 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
19e70 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
19e80 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
19e90 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72    int p1 = pExpr
19ea0 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62  ->iTable * (pTab
19eb0 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20  ->nCol+1) + 1 + 
19ec0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
19ed0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19ee0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20  Expr->iTable==0 
19ef0 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
19f00 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==1 );.      ass
19f10 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
19f20 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72  umn>=-1 && pExpr
19f30 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e  ->iColumn<pTab->
19f40 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  nCol );.      as
19f50 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65  sert( pTab->iPKe
19f60 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43  y<0 || pExpr->iC
19f70 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b  olumn!=pTab->iPK
19f80 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ey );.      asse
19f90 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c  rt( p1>=0 && p1<
19fa0 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29  (pTab->nCol*2+2)
19fb0 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74   );..      sqlit
19fc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19fd0 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61  OP_Param, p1, ta
19fe0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  rget);.      Vdb
19ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
1a000 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20  .%s -> $%d",.   
1a010 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61       (pExpr->iTa
1a020 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f  ble ? "new" : "o
1a030 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70  ld"),.        (p
1a040 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1a050 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70  ? "rowid" : pExp
1a060 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  r->pTab->aCol[pE
1a070 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e  xpr->iColumn].zN
1a080 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61  ame),.        ta
1a090 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a  rget.      ));..
1a0a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a0b0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
1a0c0 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  NT.      /* If t
1a0d0 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45  he column has RE
1a0e0 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
1a0f0 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65  may currently be
1a100 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20   stored as an.  
1a110 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
1a120 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e  Use OP_RealAffin
1a130 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ity to make sure
1a140 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1a150 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  al..      **.   
1a160 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
1a170 46 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32  F: R-60985-57662
1a180 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e   SQLite will con
1a190 76 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62  vert the value b
1a1a0 61 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ack to.      ** 
1a1b0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77  floating point w
1a1c0 68 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69  hen extracting i
1a1d0 74 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72  t from the recor
1a1e0 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
1a1f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
1a200 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
1a210 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
1a220 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
1a230 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
1a240 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
1a250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a260 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
1a270 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
1a280 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1a290 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
1a2a0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20     }...    /*.  
1a2b0 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
1a2c0 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
1a2d0 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
1a2e0 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
1a2f0 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
1a300 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
1a310 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
1a320 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
1a330 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
1a340 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
1a350 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
1a360 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1a370 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1a380 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
1a390 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
1a3a0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
1a3b0 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
1a3c0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1a3d0 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
1a3e0 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
1a3f0 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
1a400 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
1a410 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
1a420 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1a430 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
1a440 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
1a450 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1a460 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
1a470 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
1a480 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
1a490 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
1a4a0 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
1a4b0 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
1a4c0 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
1a4d0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1a4e0 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
1a4f0 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
1a500 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
1a510 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
1a520 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
1a530 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
1a540 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
1a550 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
1a560 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
1a570 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
1a580 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
1a590 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
1a5a0 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
1a5b0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
1a5c0 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
1a5d0 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
1a5e0 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
1a5f0 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
1a600 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
1a610 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
1a620 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
1a630 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
1a640 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
1a650 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
1a660 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
1a690 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
1a6a0 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
1a6b0 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a6d0 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
1a6e0 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
1a6f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
1a700 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a720 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
1a730 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
1a740 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1a770 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
1a780 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a7a0 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
1a7b0 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
1a7c0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1a7d0 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
1a7e0 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
1a7f0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
1a800 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
1a830 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
1a840 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
1a870 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1a880 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
1a890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a8a0 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
1a8b0 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
1a8c0 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
1a8d0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1a8e0 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
1a8f0 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1a900 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
1a910 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1a920 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1a930 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
1a940 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
1a950 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
1a960 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
1a970 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
1a980 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
1a990 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
1a9a0 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
1a9b0 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
1a9c0 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
1a9d0 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
1a9e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1a9f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1aa00 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
1aa10 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
1aa20 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
1aa30 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
1aa40 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
1aa50 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
1aa60 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
1aa70 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65  r(&tempX, sqlite
1aa80 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1aa90 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72  arse, pX, &regFr
1aaa0 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74  ee1));.        t
1aab0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1aac0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
1aad0 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
1aae0 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
1aaf0 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
1ab00 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20  &tempX;.        
1ab10 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
1ab20 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
1ab30 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
1ab40 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
1ab50 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
1ab60 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
1ab70 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
1ab80 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
1ab90 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
1aba0 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
1abb0 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
1abc0 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
1abd0 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
1abe0 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
1abf0 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
1ac00 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
1ac10 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
1ac20 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
1ac30 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
1ac40 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
1ac50 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69  =0; i<nExpr-1; i
1ac60 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
1ac70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ac80 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1ac90 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
1aca0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1acb0 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
1acc0 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
1acd0 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
1ace0 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
1acf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ad00 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
1ad10 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
1ad20 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
1ad30 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
1ad40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1ad50 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
1ad60 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
1ad70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1ad80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ad90 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1ada0 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
1adb0 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
1adc0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1add0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
1ade0 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
1adf0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1ae00 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1ae10 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1ae20 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
1ae30 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
1ae40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ae50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1ae60 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c  OP_Goto, 0, endL
1ae70 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
1ae80 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1ae90 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1aea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1aeb0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
1aec0 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
1aed0 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
1aee0 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
1aef0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1af00 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1af10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1af20 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1af30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
1af40 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
1af50 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
1af60 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
1af70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1af80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1af90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1afa0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1afb0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
1afc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
1afd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1afe0 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
1aff0 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
1b000 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1b010 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
1b020 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
1b030 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1b040 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
1b050 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b060 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1b070 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1b080 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
1b090 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1b0a0 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
1b0b0 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
1b0c0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1b0d0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1b0e0 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
1b0f0 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
1b100 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
1b110 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1b120 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b130 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
1b140 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1b150 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
1b160 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b170 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b180 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1b190 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
1b1a0 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
1b1b0 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
1b1c0 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
1b1d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b1e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1b1f0 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
1b200 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
1b210 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b220 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
1b230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b240 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1b250 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1b260 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1b270 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1b280 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
1b290 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
1b2a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2b0 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
1b2c0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
1b2d0 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
1b2e0 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
1b2f0 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
1b300 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1b310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
1b330 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
1b340 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
1b350 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1b380 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
1b390 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1b3a0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
1b3b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b3c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1b3d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1b3e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1b3f0 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1b400 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1b410 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1b420 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
1b430 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
1b440 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
1b450 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
1b460 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
1b470 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
1b480 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b490 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
1b4a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1b4b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b4c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1b4d0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
1b4e0 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1b4f0 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
1b500 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
1b510 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
1b520 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st,      /* Stor
1b530 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
1b540 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1b550 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20    u8 reusable   
1b560 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1b570 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
1b580 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b  s reusable */.){
1b590 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
1b5a0 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
1b5b0 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
1b5c0 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
1b5d0 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70  >pConstExpr;.  p
1b5e0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1b5f0 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
1b600 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
1b610 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1b620 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1b630 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
1b640 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
1b650 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b660 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1b670 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
1b680 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
1b690 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
1b6a0 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  st;.     pItem->
1b6b0 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61  reusable = reusa
1b6c0 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ble;.  }.  pPars
1b6d0 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
1b6e0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  p;.}../*.** Gene
1b6f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
1b700 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
1b710 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
1b720 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1b730 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
1b740 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1b750 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
1b760 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
1b770 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1b780 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
1b790 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1b7a0 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
1b7b0 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
1b7c0 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
1b7d0 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
1b7e0 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
1b7f0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1b800 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
1b810 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
1b820 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
1b830 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
1b840 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
1b850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
1b860 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
1b870 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
1b880 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
1b890 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
1b8a0 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
1b8b0 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
1b8c0 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
1b8d0 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
1b8e0 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
1b8f0 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
1b900 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1b910 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1b920 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1b930 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
1b940 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
1b950 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1b960 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
1b970 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
1b980 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
1b990 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
1b9a0 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
1b9b0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1b9c0 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
1b9d0 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73    ){.    ExprLis
1b9e0 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  t *p = pParse->p
1b9f0 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69  ConstExpr;.    i
1ba00 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20  nt i;.    *pReg 
1ba10 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20   = 0;.    if( p 
1ba20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1ba30 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1ba40 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1ba50 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
1ba60 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
1ba70 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
1ba80 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
1ba90 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
1baa0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
1bab0 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
1bac0 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
1bad0 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
1bae0 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
1baf0 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  eg;.        }.  
1bb00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bb10 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r2 = ++pParse->n
1bb20 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1bb30 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1bb40 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32  Parse, pExpr, r2
1bb50 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1bb60 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
1bb70 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1bb80 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
1bb90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1bba0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1bbb0 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
1bbc0 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
1bbd0 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
1bbe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1bbf0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1bc00 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
1bc10 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
1bc20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1bc30 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
1bc40 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1bc50 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
1bc60 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
1bc70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
1bc80 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
1bc90 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1bca0 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
1bcb0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
1bcc0 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
1bcd0 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
1bce0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1bcf0 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
1bd00 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1bd10 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1bd20 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
1bd30 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1bd40 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1bd50 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1bd60 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72  ( pExpr && pExpr
1bd70 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
1bd80 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
1bd90 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1bda0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
1bdb0 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
1bdc0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
1bdd0 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20  se{.    inReg = 
1bde0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1bdf0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1be00 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1be10 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1be20 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73  ->pVdbe || pPars
1be30 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1be40 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
1be50 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
1be60 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
1be70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1be80 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1be90 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1bea0 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1beb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1bec0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1bed0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1bee0 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
1bef0 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
1bf00 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1bf10 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1bf20 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
1bf30 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1bf40 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
1bf50 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1bf60 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
1bf70 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
1bf80 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1bf90 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
1bfa0 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
1bfb0 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
1bfc0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1bfd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bfe0 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
1bff0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1c000 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1c010 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
1c020 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
1c030 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
1c040 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1c050 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1c060 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1c070 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1c080 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  xpr, target, 0);
1c090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1c0a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1c0b0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1c0c0 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
1c0d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c0e0 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
1c0f0 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1c100 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
1c110 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
1c120 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
1c130 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
1c140 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
1c150 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
1c160 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
1c170 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
1c180 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
1c190 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
1c1a0 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
1c1b0 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
1c1c0 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
1c1d0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
1c1e0 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
1c1f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c200 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1c210 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1c220 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
1c230 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
1c240 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
1c250 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
1c260 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
1c270 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
1c280 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
1c290 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c2a0 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
1c2b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c2c0 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1c2d0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1c2e0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1c2f0 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
1c300 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
1c310 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1c320 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
1c330 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1c340 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1c350 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1c360 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1c370 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
1c380 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c390 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
1c3a0 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
1c3b0 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
1c3c0 65 6d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  em);.}..#ifdef S
1c3d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1c3e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d  * Generate a hum
1c3f0 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c  an-readable expl
1c400 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  anation of an ex
1c410 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
1c420 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72  /.void sqlite3Tr
1c430 65 65 56 69 65 77 45 78 70 72 28 54 72 65 65 56  eeViewExpr(TreeV
1c440 69 65 77 20 2a 70 56 69 65 77 2c 20 63 6f 6e 73  iew *pView, cons
1c450 74 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 75  t Expr *pExpr, u
1c460 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 29 7b  8 moreToFollow){
1c470 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c480 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  BinOp = 0;   /* 
1c490 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20  Binary operator 
1c4a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c4b0 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f  *zUniOp = 0;   /
1c4c0 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72  * Unary operator
1c4d0 20 2a 2f 0a 20 20 70 56 69 65 77 20 3d 20 73 71   */.  pView = sq
1c4e0 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 75 73  lite3TreeViewPus
1c4f0 68 28 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46  h(pView, moreToF
1c500 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28 20 70 45  ollow);.  if( pE
1c510 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  xpr==0 ){.    sq
1c520 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1c530 65 28 70 56 69 65 77 2c 20 22 6e 69 6c 22 29 3b  e(pView, "nil");
1c540 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
1c550 56 69 65 77 50 6f 70 28 70 56 69 65 77 29 3b 0a  ViewPop(pView);.
1c560 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c570 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
1c580 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
1c590 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
1c5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1c5b0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c5c0 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22 2c 0a  , "AGG{%d:%d}",.
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1c5e0 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
1c5f0 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1c600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c610 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
1c620 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
1c630 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
1c640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
1c650 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
1c660 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65 63 6b  hen coding check
1c670 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
1c680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
1c690 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1c6a0 77 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29 22 2c  w, "COLUMN(%d)",
1c6b0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29   pExpr->iColumn)
1c6c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c6d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1c6e0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c6f0 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20  , "{%d:%d}",.   
1c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c710 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1c720 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
1c730 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1c740 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1c750 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c760 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1c770 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1c780 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
1c790 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1c7a0 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1c7b0 70 56 69 65 77 2c 20 22 25 64 22 2c 20 70 45 78  pView, "%d", pEx
1c7c0 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20  pr->u.iValue);. 
1c7d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c7e0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1c7f0 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22  iewLine(pView, "
1c800 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
1c810 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oken);.      }. 
1c820 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c830 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1c840 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
1c850 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20 54 4b  OINT.    case TK
1c860 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1c870 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c  sqlite3TreeViewL
1c880 69 6e 65 28 70 56 69 65 77 2c 22 25 73 22 2c 20  ine(pView,"%s", 
1c890 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1c8a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c8b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1c8c0 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
1c8d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
1c8e0 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1c8f0 77 2c 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75  w,"%Q", pExpr->u
1c900 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1c910 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c920 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
1c930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1c940 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c950 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
1c960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1c970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c980 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
1c990 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
1c9a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  {.      sqlite3T
1c9b0 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1c9c0 77 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75  w,"%s", pExpr->u
1c9d0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1c9e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1c9f0 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
1ca00 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
1ca10 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1ca20 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 56 41 52  wLine(pView,"VAR
1ca30 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c 0a 20  IABLE(%s,%d)",. 
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1ca60 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78 70 72 2d  u.zToken, pExpr-
1ca70 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1ca80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ca90 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
1caa0 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
1cab0 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1cac0 70 56 69 65 77 2c 22 52 45 47 49 53 54 45 52 28  pView,"REGISTER(
1cad0 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 54 61  %d)", pExpr->iTa
1cae0 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
1caf0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1cb00 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
1cb10 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1cb20 4c 69 6e 65 28 70 56 69 65 77 2c 22 41 53 20 25  Line(pView,"AS %
1cb30 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1cb40 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
1cb50 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1cb60 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
1cb70 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  eft, 0);.      b
1cb80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1cb90 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20  case TK_ID: {.  
1cba0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1cbb0 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 49  iewLine(pView,"I
1cbc0 44 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  D %Q", pExpr->u.
1cbd0 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1cbe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
1cbf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cc00 43 41 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b  CAST.    case TK
1cc10 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f  _CAST: {.      /
1cc20 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  * Expressions of
1cc30 20 74 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53   the form:   CAS
1cc40 54 28 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e  T(pLeft AS token
1cc50 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ) */.      sqlit
1cc60 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1cc70 56 69 65 77 2c 22 43 41 53 54 20 25 51 22 2c 20  View,"CAST %Q", 
1cc80 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1cc90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1cca0 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1ccb0 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
1ccc0 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
1ccd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1cce0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
1ccf0 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
1cd00 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_LT:      zBinO
1cd10 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 62 72  p = "LT";     br
1cd20 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1cd30 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _LE:      zBinOp
1cd40 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 62 72 65   = "LE";     bre
1cd50 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1cd60 47 54 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  GT:      zBinOp 
1cd70 3d 20 22 47 54 22 3b 20 20 20 20 20 62 72 65 61  = "GT";     brea
1cd80 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
1cd90 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  E:      zBinOp =
1cda0 20 22 47 45 22 3b 20 20 20 20 20 62 72 65 61 6b   "GE";     break
1cdb0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
1cdc0 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
1cdd0 22 4e 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  "NE";     break;
1cde0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
1cdf0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1ce00 45 51 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EQ";     break;.
1ce10 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
1ce20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49       zBinOp = "I
1ce30 53 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  S";     break;. 
1ce40 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
1ce50 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 49 53  :   zBinOp = "IS
1ce60 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  NOT";  break;.  
1ce70 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
1ce80 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 4e 44     zBinOp = "AND
1ce90 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1cea0 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
1ceb0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f 52 22 3b    zBinOp = "OR";
1cec0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ced0 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
1cee0 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44 44 22 3b   zBinOp = "ADD";
1cef0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1cf00 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
1cf10 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c 22 3b 20  zBinOp = "MUL"; 
1cf20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1cf30 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a  se TK_MINUS:   z
1cf40 42 69 6e 4f 70 20 3d 20 22 53 55 42 22 3b 20 20  BinOp = "SUB";  
1cf50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cf60 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 42  e TK_REM:     zB
1cf70 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20  inOp = "REM";   
1cf80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cf90 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 42 69   TK_BITAND:  zBi
1cfa0 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  nOp = "BITAND"; 
1cfb0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cfc0 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 42 69 6e  TK_BITOR:   zBin
1cfd0 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 62  Op = "BITOR";  b
1cfe0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1cff0 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42 69 6e 4f  K_SLASH:   zBinO
1d000 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 62 72  p = "DIV";    br
1d010 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1d020 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70  _LSHIFT:  zBinOp
1d030 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 62 72 65   = "LSHIFT"; bre
1d040 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d050 52 53 48 49 46 54 3a 20 20 7a 42 69 6e 4f 70 20  RSHIFT:  zBinOp 
1d060 3d 20 22 52 53 48 49 46 54 22 3b 20 62 72 65 61  = "RSHIFT"; brea
1d070 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
1d080 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d  ONCAT:  zBinOp =
1d090 20 22 43 4f 4e 43 41 54 22 3b 20 62 72 65 61 6b   "CONCAT"; break
1d0a0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  ;.    case TK_DO
1d0b0 54 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  T:     zBinOp = 
1d0c0 22 44 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b  "DOT";    break;
1d0d0 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  ..    case TK_UM
1d0e0 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70 20 3d 20  INUS:  zUniOp = 
1d0f0 22 55 4d 49 4e 55 53 22 3b 20 62 72 65 61 6b 3b  "UMINUS"; break;
1d100 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
1d110 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22  US:   zUniOp = "
1d120 55 50 4c 55 53 22 3b 20 20 62 72 65 61 6b 3b 0a  UPLUS";  break;.
1d130 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
1d140 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 42  OT:  zUniOp = "B
1d150 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b 3b 0a 20  ITNOT"; break;. 
1d160 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1d170 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f      zUniOp = "NO
1d180 54 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  T";    break;.  
1d190 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
1d1a0 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22 49 53 4e  :  zUniOp = "ISN
1d1b0 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ULL"; break;.   
1d1c0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1d1d0 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e 4f 54 4e  : zUniOp = "NOTN
1d1e0 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20  ULL"; break;..  
1d1f0 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
1d200 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1d210 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1d220 56 69 65 77 2c 20 22 43 4f 4c 4c 41 54 45 20 25  View, "COLLATE %
1d230 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1d240 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ken);.      sqli
1d250 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1d260 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
1d270 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  eft, 0);.      b
1d280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1d290 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1d2a0 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
1d2b0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1d2c0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1d2d0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1d2e0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1d2f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1d300 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1d310 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1d320 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1d330 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1d340 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d350 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1d360 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1d370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d380 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
1d390 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  GG_FUNCTION ){. 
1d3a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1d3b0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1d3c0 2c 20 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25  , "AGG_FUNCTION%
1d3d0 64 20 25 51 22 2c 0a 20 20 20 20 20 20 20 20 20  d %Q",.         
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20      pExpr->op2, 
1d400 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1d410 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1d420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1d430 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1d440 2c 20 22 46 55 4e 43 54 49 4f 4e 20 25 51 22 2c  , "FUNCTION %Q",
1d450 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1d460 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d470 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
1d480 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
1d490 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 70 56  eViewExprList(pV
1d4a0 69 65 77 2c 20 70 46 61 72 67 2c 20 30 2c 20 30  iew, pFarg, 0, 0
1d4b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d4c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
1d4d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d4e0 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
1d4f0 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b  ase TK_EXISTS: {
1d500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1d510 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1d520 2c 20 22 45 58 49 53 54 53 2d 65 78 70 72 22 29  , "EXISTS-expr")
1d530 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1d540 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56  reeViewSelect(pV
1d550 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  iew, pExpr->x.pS
1d560 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
1d570 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d580 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
1d590 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d5a0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d5b0 69 65 77 2c 20 22 53 45 4c 45 43 54 2d 65 78 70  iew, "SELECT-exp
1d5c0 72 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r");.      sqlit
1d5d0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d5e0 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d5f0 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d610 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1d620 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1d630 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1d640 65 77 2c 20 22 49 4e 22 29 3b 0a 20 20 20 20 20  ew, "IN");.     
1d650 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d660 45 78 70 72 28 70 56 69 65 77 2c 20 70 45 78 70  Expr(pView, pExp
1d670 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20  r->pLeft, 1);.  
1d680 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1d690 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1d6a0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1d6b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
1d6c0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 70 56  reeViewSelect(pV
1d6d0 69 65 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  iew, pExpr->x.pS
1d6e0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
1d6f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d700 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
1d710 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70  xprList(pView, p
1d720 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 30  Expr->x.pList, 0
1d730 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d750 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1d760 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
1d770 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
1d780 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
1d790 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
1d7a0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
1d7b0 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
1d7c0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
1d7d0 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
1d7e0 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
1d7f0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1d800 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
1d810 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1d820 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
1d830 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
1d840 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
1d850 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
1d860 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
1d870 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1d880 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
1d890 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  X = pExpr->pLeft
1d8a0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 59  ;.      Expr *pY
1d8b0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d8c0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1d8d0 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20       Expr *pZ = 
1d8e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1d8f0 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
1d900 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d910 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 42 45  wLine(pView, "BE
1d920 54 57 45 45 4e 22 29 3b 0a 20 20 20 20 20 20 73  TWEEN");.      s
1d930 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d940 70 72 28 70 56 69 65 77 2c 20 70 58 2c 20 31 29  pr(pView, pX, 1)
1d950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
1d960 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1d970 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20 20 20 20  w, pY, 1);.     
1d980 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1d990 45 78 70 72 28 70 56 69 65 77 2c 20 70 5a 2c 20  Expr(pView, pZ, 
1d9a0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1d9b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d9c0 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b 0a 20 20  TK_TRIGGER: {.  
1d9d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
1d9e0 63 6f 64 65 20 69 73 20 54 4b 5f 54 52 49 47 47  code is TK_TRIGG
1d9f0 45 52 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  ER, then the exp
1da00 72 65 73 73 69 6f 6e 20 69 73 20 61 20 72 65 66  ression is a ref
1da10 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20  erence.      ** 
1da20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  to a column in t
1da30 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e  he new.* or old.
1da40 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 73 20  * pseudo-tables 
1da50 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a 20 20 20  available to.   
1da60 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 70 72     ** trigger pr
1da70 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68 69 73 20  ograms. In this 
1da80 63 61 73 65 20 45 78 70 72 2e 69 54 61 62 6c 65  case Expr.iTable
1da90 20 69 73 20 73 65 74 20 74 6f 20 31 20 66 6f 72   is set to 1 for
1daa0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   the.      ** ne
1dab0 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  w.* pseudo-table
1dac0 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6f  , or 0 for the o
1dad0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1dae0 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 0a  e. Expr.iColumn.
1daf0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20        ** is set 
1db00 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66  to the column of
1db10 20 74 68 65 20 70 73 65 75 64 6f 2d 74 61 62 6c   the pseudo-tabl
1db20 65 20 74 6f 20 72 65 61 64 2c 20 6f 72 20 74 6f  e to read, or to
1db30 20 2d 31 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   -1 to.      ** 
1db40 72 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 66  read the rowid f
1db50 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ield..      */. 
1db60 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1db70 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1db80 22 25 73 28 25 64 29 22 2c 20 0a 20 20 20 20 20  "%s(%d)", .     
1db90 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
1dba0 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20 22 4f 4c  le ? "NEW" : "OL
1dbb0 44 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  D", pExpr->iColu
1dbc0 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
1dbd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dbe0 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
1dbf0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1dc00 77 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 43 41  wLine(pView, "CA
1dc10 53 45 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  SE");.      sqli
1dc20 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1dc30 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
1dc40 65 66 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  eft, 1);.      s
1dc50 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1dc60 70 72 4c 69 73 74 28 70 56 69 65 77 2c 20 70 45  prList(pView, pE
1dc70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c  xpr->x.pList, 0,
1dc80 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
1dc90 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1dca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1dcb0 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GER.    case TK_
1dcc0 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63  RAISE: {.      c
1dcd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1dce0 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20   = "unk";.      
1dcf0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61  switch( pExpr->a
1dd00 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
1dd10 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62     case OE_Rollb
1dd20 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22  ack:   zType = "
1dd30 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61  rollback";  brea
1dd40 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1dd50 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a  OE_Abort:      z
1dd60 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20  Type = "abort"; 
1dd70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1dd80 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a     case OE_Fail:
1dd90 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
1dda0 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61  fail";      brea
1ddb0 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
1ddc0 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a  OE_Ignore:     z
1ddd0 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b  Type = "ignore";
1dde0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ddf0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1de00 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69  TreeViewLine(pVi
1de10 65 77 2c 20 22 52 41 49 53 45 20 25 73 28 25 51  ew, "RAISE %s(%Q
1de20 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72  )", zType, pExpr
1de30 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1de40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1de50 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1de60 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
1de70 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1de80 70 56 69 65 77 2c 20 22 6f 70 3d 25 64 22 2c 20  pView, "op=%d", 
1de90 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20 20 20  pExpr->op);.    
1dea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1deb0 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e 4f 70 20   }.  if( zBinOp 
1dec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
1ded0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1dee0 2c 20 22 25 73 22 2c 20 7a 42 69 6e 4f 70 29 3b  , "%s", zBinOp);
1def0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
1df00 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20  ViewExpr(pView, 
1df10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29  pExpr->pLeft, 1)
1df20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
1df30 65 56 69 65 77 45 78 70 72 28 70 56 69 65 77 2c  eViewExpr(pView,
1df40 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1df50 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
1df60 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20 20 73 71  zUniOp ){.    sq
1df70 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1df80 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 7a  e(pView, "%s", z
1df90 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  UniOp);.    sqli
1dfa0 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28  te3TreeViewExpr(
1dfb0 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c  pView, pExpr->pL
1dfc0 65 66 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  eft, 0);.  }.  s
1dfd0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f  qlite3TreeViewPo
1dfe0 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64  p(pView);.}.#end
1dff0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1e000 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
1e010 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1e020 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61   Generate a huma
1e030 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c 61  n-readable expla
1e040 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78 70  nation of an exp
1e050 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
1e060 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 72 65  .void sqlite3Tre
1e070 65 56 69 65 77 45 78 70 72 4c 69 73 74 28 0a 20  eViewExprList(. 
1e080 20 54 72 65 65 56 69 65 77 20 2a 70 56 69 65 77   TreeView *pView
1e090 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70 72 4c 69  ,.  const ExprLi
1e0a0 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20 75 38 20  st *pList,.  u8 
1e0b0 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c 0a 20 20  moreToFollow,.  
1e0c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62  const char *zLab
1e0d0 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  el.){.  int i;. 
1e0e0 20 70 56 69 65 77 20 3d 20 73 71 6c 69 74 65 33   pView = sqlite3
1e0f0 54 72 65 65 56 69 65 77 50 75 73 68 28 70 56 69  TreeViewPush(pVi
1e100 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77  ew, moreToFollow
1e110 29 3b 0a 20 20 69 66 28 20 7a 4c 61 62 65 6c 3d  );.  if( zLabel=
1e120 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b 30 5d 3d  =0 || zLabel[0]=
1e130 3d 30 20 29 20 7a 4c 61 62 65 6c 20 3d 20 22 4c  =0 ) zLabel = "L
1e140 49 53 54 22 3b 0a 20 20 69 66 28 20 70 4c 69 73  IST";.  if( pLis
1e150 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
1e160 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1e170 70 56 69 65 77 2c 20 22 25 73 20 28 65 6d 70 74  pView, "%s (empt
1e180 79 29 22 2c 20 7a 4c 61 62 65 6c 29 3b 0a 20 20  y)", zLabel);.  
1e190 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
1e1a0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1e1b0 56 69 65 77 2c 20 22 25 73 22 2c 20 7a 4c 61 62  View, "%s", zLab
1e1c0 65 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  el);.    for(i=0
1e1d0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1e1e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
1e1f0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
1e200 72 28 70 56 69 65 77 2c 20 70 4c 69 73 74 2d 3e  r(pView, pList->
1e210 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 3c 70 4c  a[i].pExpr, i<pL
1e220 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 23  ist->nExpr-1);.#
1e230 69 66 20 30 0a 20 20 20 20 20 69 66 28 20 70 4c  if 0.     if( pL
1e240 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1e250 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e260 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1e270 70 4f 75 74 2c 20 22 20 41 53 20 25 73 22 2c 20  pOut, " AS %s", 
1e280 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1e290 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1e2a0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69    if( pList->a[i
1e2b0 5d 2e 62 53 70 61 6e 49 73 54 61 62 20 29 7b 0a  ].bSpanIsTab ){.
1e2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e2d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1e2e0 74 2c 20 22 20 28 25 73 29 22 2c 20 70 4c 69 73  t, " (%s)", pLis
1e2f0 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
1e300 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1e310 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1e320 65 33 54 72 65 65 56 69 65 77 50 6f 70 28 70 56  e3TreeViewPop(pV
1e330 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  iew);.}.#endif /
1e340 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
1e350 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  /../*.** Generat
1e360 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73 68  e code that push
1e370 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  es the value of 
1e380 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
1e390 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
1e3a0 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e  pression list in
1e3b0 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  to a sequence of
1e3c0 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69 6e   registers begin
1e3d0 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e 0a  ning at target..
1e3e0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1e3f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
1e400 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a  nts evaluated..*
1e410 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
1e420 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70 72  ECEL_DUP flag pr
1e430 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75 6d  events the argum
1e440 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a  ents from being.
1e450 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  ** filled using 
1e460 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f  OP_SCopy.  OP_Co
1e470 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  py must be used 
1e480 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  instead..**.** T
1e490 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46  he SQLITE_ECEL_F
1e4a0 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20 61  ACTOR argument a
1e4b0 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20 61  llows constant a
1e4c0 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a  rguments to be.*
1e4d0 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 69  * factored out i
1e4e0 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nto initializati
1e4f0 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  on code..*/.int 
1e500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
1e510 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
1e520 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
1e530 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1e540 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1e550 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65 20  pList,   /* The 
1e560 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
1e570 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
1e580 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20 20   int target,    
1e590 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
1e5a0 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a 2f  write results */
1e5b0 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20 20  .  u8 flags     
1e5c0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
1e5d0 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  ECEL_* flags */.
1e5e0 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  ){.  struct Expr
1e5f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e600 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20  ;.  int i, n;.  
1e610 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61  u8 copyOp = (fla
1e620 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1e630 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20  _DUP) ? OP_Copy 
1e640 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 61 73  : OP_SCopy;.  as
1e650 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1e660 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
1e670 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1e680 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
1e690 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
1e6a0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
1e6b0 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
1e6c0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1e6d0 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
1e6e0 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
1e6f0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
1e700 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
1e710 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
1e720 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
1e730 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
1e740 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
1e750 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  em->pExpr;.    i
1e760 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
1e770 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21  TE_ECEL_FACTOR)!
1e780 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  =0 && sqlite3Exp
1e790 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
1e7a0 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
1e7b0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1e7c0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1e7d0 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20   target+i, 0);. 
1e7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e7f0 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69  int inReg = sqli
1e800 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
1e810 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1e820 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
1e830 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72    if( inReg!=tar
1e840 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20  get+i ){.       
1e850 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
1e860 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
1e870 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1e880 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f         if( copyO
1e890 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20  p==OP_Copy.     
1e8a0 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69      && (pOp=sqli
1e8b0 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
1e8c0 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  -1))->opcode==OP
1e8d0 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26  _Copy.         &
1e8e0 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70  & pOp->p1+pOp->p
1e8f0 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20  3+1==inReg.     
1e900 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70      && pOp->p2+p
1e910 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74  Op->p3+1==target
1e920 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  +i.        ){.  
1e930 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b          pOp->p3+
1e940 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
1e950 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1e960 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e970 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20   copyOp, inReg, 
1e980 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
1e990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e9a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e9b0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
1e9c0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1e9d0 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
1e9e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54  ..**.**    x BET
1e9f0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a  WEEN y AND z.**.
1ea00 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
1ea10 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a  equivalent to .*
1ea20 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44  *.**    x>=y AND
1ea30 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65   x<=z.**.** Code
1ea40 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b   it as such, tak
1ea50 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74  ing care to do t
1ea60 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70  he common subexp
1ea70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69  ression.** elimi
1ea80 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a  nation of x..*/.
1ea90 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
1eaa0 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50  CodeBetween(.  P
1eab0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1eac0 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
1ead0 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
1eae0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1eaf0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
1eb00 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65 78  * The BETWEEN ex
1eb10 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1eb20 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
1eb30 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1eb40 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65  the jump is take
1eb50 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  n */.  int jumpI
1eb60 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65  fTrue,   /* Take
1eb70 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1eb80 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75 65   BETWEEN is true
1eb90 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
1eba0 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20  Null    /* Take 
1ebb0 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1ebc0 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20  BETWEEN is NULL 
1ebd0 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70  */.){.  Expr exp
1ebe0 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65  rAnd;     /* The
1ebf0 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e   AND operator in
1ec00 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20    x>=y AND x<=z 
1ec10 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c   */.  Expr compL
1ec20 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20  eft;    /* The  
1ec30 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20  x>=y  term */.  
1ec40 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20  Expr compRight; 
1ec50 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20    /* The  x<=z  
1ec60 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65  term */.  Expr e
1ec70 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54  xprX;       /* T
1ec80 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65 73  he  x  subexpres
1ec90 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sion */.  int re
1eca0 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54  gFree1 = 0; /* T
1ecb0 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65 67  emporary use reg
1ecc0 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  ister */..  asse
1ecd0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ece0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
1ecf0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65  IsSelect) );.  e
1ed00 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70  xprX = *pExpr->p
1ed10 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e  Left;.  exprAnd.
1ed20 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65  op = TK_AND;.  e
1ed30 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26  xprAnd.pLeft = &
1ed40 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  compLeft;.  expr
1ed50 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f  And.pRight = &co
1ed60 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c  mpRight;.  compL
1ed70 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a  eft.op = TK_GE;.
1ed80 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74    compLeft.pLeft
1ed90 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d   = &exprX;.  com
1eda0 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70  pLeft.pRight = p
1edb0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1edc0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d  [0].pExpr;.  com
1edd0 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c  pRight.op = TK_L
1ede0 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  E;.  compRight.p
1edf0 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1ee00 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68   compRight.pRigh
1ee10 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1ee20 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
1ee30 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1ee40 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33  (&exprX, sqlite3
1ee50 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ee60 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65  rse, &exprX, &re
1ee70 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20  gFree1));.  if( 
1ee80 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20  jumpIfTrue ){.  
1ee90 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1eea0 72 75 65 28 70 50 61 72 73 65 2c 20 26 65 78 70  rue(pParse, &exp
1eeb0 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70  rAnd, dest, jump
1eec0 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65  IfNull);.  }else
1eed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1eee0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1eef0 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c   &exprAnd, dest,
1ef00 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1ef10 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1ef20 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1ef30 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20  , regFree1);..  
1ef40 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75 61  /* Ensure adequa
1ef50 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67 65  te test coverage
1ef60 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
1ef70 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26  jumpIfTrue==0 &&
1ef80 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26   jumpIfNull==0 &
1ef90 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  & regFree1==0 );
1efa0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d  .  testcase( jum
1efb0 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75  pIfTrue==0 && ju
1efc0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72  mpIfNull==0 && r
1efd0 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20  egFree1!=0 );.  
1efe0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1eff0 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49  True==0 && jumpI
1f000 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46  fNull!=0 && regF
1f010 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73  ree1==0 );.  tes
1f020 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1f030 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1f040 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll!=0 && regFree
1f050 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1!=0 );.  testca
1f060 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d  se( jumpIfTrue!=
1f070 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1f080 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1f090 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1f0a0 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26   jumpIfTrue!=0 &
1f0b0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1f0c0 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1f0d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1f0e0 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a  mpIfTrue!=0 && j
1f0f0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1f100 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1f110 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1f120 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1f130 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1f140 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f  Free1!=0 );.}../
1f150 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1f160 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
1f170 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
1f180 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
1f190 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
1f1a0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
1f1b0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1f1c0 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
1f1d0 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
1f1e0 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
1f1f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1f200 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
1f210 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
1f220 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
1f230 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
1f240 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
1f250 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
1f260 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
1f270 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53  IfNull flag is S
1f280 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1f290 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64  ..**.** This cod
1f2a0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
1f2b0 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61   fact that certa
1f2c0 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  in token values 
1f2d0 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61  (ex: TK_EQ).** a
1f2e0 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f  re the same as o
1f2f0 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78  pcode values (ex
1f300 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d  : OP_Eq) that im
1f310 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72  plement the corr
1f320 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65  esponding.** ope
1f330 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c  ration.  Special
1f340 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62   comments in vdb
1f350 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70  e.c and the mkop
1f360 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74  codeh.awk script
1f370 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20   in.** the make 
1f380 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68  process cause th
1f390 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c  ese values to al
1f3a0 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20  ign.  Assert()s 
1f3b0 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62  in the code.** b
1f3c0 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74  elow verify that
1f3d0 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65   the numbers are
1f3e0 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74   aligned correct
1f3f0 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
1f400 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61  te3ExprIfTrue(Pa
1f410 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1f420 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
1f430 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
1f440 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
1f450 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1f460 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
1f470 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1f480 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
1f490 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
1f4a0 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
1f4b0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
1f4c0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
1f4d0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f4e0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
1f4f0 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b  0) )     return;
1f500 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f    /* Existence o
1f510 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62  f VDBE checked b
1f520 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66  y caller */.  if
1f530 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
1f540 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
1f550 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  No way this can 
1f560 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d  happen */.  op =
1f570 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77   pExpr->op;.  sw
1f580 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1f590 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
1f5a0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
1f5b0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1f5c0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73  el(v);.      tes
1f5d0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1f5e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
1f5f0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f600 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1f610 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66  pLeft, d2,jumpIf
1f620 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50  Null^SQLITE_JUMP
1f630 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
1f640 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1f650 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
1f660 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1f670 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
1f680 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1f690 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f6a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f6b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1f6c0 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d2);.      sqlit
1f6d0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1f6e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
1f6f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f700 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
1f710 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1f720 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1f730 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1f740 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1f750 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1f760 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f770 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f780 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1f790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f7a0 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1f7b0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1f7c0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f7d0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1f7e0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1f7f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
1f800 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1f810 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
1f820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1f830 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1f840 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1f850 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1f860 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
1f870 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1f880 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f890 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1f8a0 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
1f8b0 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
1f8c0 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
1f8d0 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
1f8e0 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
1f8f0 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EQ: {.      test
1f900 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f910 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20  ==0 );.      r1 
1f920 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1f930 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
1f940 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
1f950 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32  Free1);.      r2
1f960 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f970 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f980 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72  Expr->pRight, &r
1f990 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1f9a0 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
1f9b0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1f9c0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f9d0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
1f9e0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64         r1, r2, d
1f9f0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fa00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1fa10 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65  K_LT==OP_Lt); te
1fa20 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74  stcase(op==OP_Lt
1fa30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1fa40 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a  f(v,op==OP_Lt);.
1fa50 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1fa60 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74  LE==OP_Le); test
1fa70 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  case(op==OP_Le);
1fa80 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1fa90 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20  v,op==OP_Le);.  
1faa0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54      assert(TK_GT
1fab0 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61  ==OP_Gt); testca
1fac0 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56  se(op==OP_Gt); V
1fad0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1fae0 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20  op==OP_Gt);.    
1faf0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d    assert(TK_GE==
1fb00 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ge); testcase
1fb10 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62  (op==OP_Ge); Vdb
1fb20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1fb30 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ge);.      
1fb40 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50  assert(TK_EQ==OP
1fb50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Eq); testcase(o
1fb60 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43  p==OP_Eq); VdbeC
1fb70 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1fb80 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73  OP_Eq);.      as
1fb90 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e  sert(TK_NE==OP_N
1fba0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1fbb0 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Ne); VdbeCov
1fbc0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1fbd0 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _Ne);.      test
1fbe0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1fbf0 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
1fc00 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
1fc10 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1fc20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1fc30 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20  TK_IS:.    case 
1fc40 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20  TK_ISNOT: {.    
1fc50 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fc60 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  TK_IS );.      t
1fc70 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1fc80 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72  ISNOT );.      r
1fc90 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
1fca0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fcb0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
1fcc0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
1fcd0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
1fce0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1fcf0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1fd00 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
1fd10 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1fd20 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1fd30 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  NE;.      codeCo
1fd40 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
1fd50 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
1fd60 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
1fd90 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
1fda0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
1fdb0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
1fdc0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1fdd0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1fde0 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
1fdf0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1fe00 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1fe10 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1fe20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fe30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fe40 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
1fe50 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
1fe60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
1fe70 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
1fe80 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
1fe90 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
1fea0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
1feb0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
1fec0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
1fed0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
1fee0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
1fef0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ff00 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ff10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ff20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ff30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ff40 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64 65  p2(v, op, r1, de
1ff50 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  st);.      VdbeC
1ff60 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
1ff70 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
1ff80 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1ff90 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
1ffa0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
1ffb0 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
1ffc0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1ffd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ffe0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1fff0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
20000 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
20010 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
20020 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
20030 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a 75  xpr, dest, 1, ju
20040 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20050 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
20060 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20070 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
20080 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
20090 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c     int destIfFal
200a0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
200b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
200c0 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75      int destIfNu
200d0 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  ll = jumpIfNull 
200e0 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66 46  ? dest : destIfF
200f0 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  alse;.      sqli
20100 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
20110 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
20120 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49 66  tIfFalse, destIf
20130 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
20140 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20150 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
20160 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
20170 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20180 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73  el(v, destIfFals
20190 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
201a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
201b0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
201c0 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
201d0 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b 0a  sTrue(pExpr) ){.
201e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
201f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20200 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
20210 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20220 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
20230 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20240 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* No-op */.  
20250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20260 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20270 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20280 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
20290 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
202a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
202b0 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20 64  (v, OP_If, r1, d
202c0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
202d0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
202e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
202f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20300 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
20310 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20320 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20340 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
20350 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20360 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20370 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
20380 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20390 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
203a0 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  ree2);  .}../*.*
203b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
203c0 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
203d0 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
203e0 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
203f0 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
20400 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
20410 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
20420 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  lse but executio
20430 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
20440 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
20450 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
20460 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s true..**.** If
20470 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
20480 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
20490 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
204a0 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a  nor false) then.
204b0 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49  ** jump if jumpI
204c0 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45 5f  fNull is SQLITE_
204d0 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66 61  JUMPIFNULL or fa
204e0 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75  ll through if ju
204f0 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20 30  mpIfNull.** is 0
20500 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20510 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72  3ExprIfFalse(Par
20520 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
20530 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
20540 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
20550 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
20560 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
20570 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
20580 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b  nt regFree1 = 0;
20590 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
205a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72  = 0;.  int r1, r
205b0 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75  2;..  assert( ju
205c0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
205d0 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a  _JUMPIFNULL || j
205e0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
205f0 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
20600 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 45  ) ) return; /* E
20610 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45  xistence of VDBE
20620 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c   checked by call
20630 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  er */.  if( pExp
20640 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72 6e  r==0 )    return
20650 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  ;..  /* The valu
20660 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61  e of pExpr->op a
20670 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65  nd op are relate
20680 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  d as follows:.  
20690 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45  **.  **       pE
206a0 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
206b0 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20     op.  **      
206c0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20   ---------      
206d0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20      ----------. 
206e0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e   **       TK_ISN
206f0 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f  ULL          OP_
20700 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  NotNull.  **    
20710 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20     TK_NOTNULL   
20720 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a        OP_IsNull.
20730 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45    **       TK_NE
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
20750 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Eq.  **       T
20760 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20  K_EQ            
20770 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20    OP_Ne.  **    
20780 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20     TK_GT        
20790 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a        OP_Le.  **
207a0 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20         TK_LE    
207b0 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a            OP_Gt.
207c0 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45    **       TK_GE
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
207e0 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Lt.  **       T
207f0 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20  K_LT            
20800 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a    OP_Ge.  **.  *
20810 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75  * For other valu
20820 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c  es of pExpr->op,
20830 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64   op is undefined
20840 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a   and unused..  *
20850 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54  * The value of T
20860 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
20870 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65  ants are arrange
20880 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20  d such that we. 
20890 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20   ** can compute 
208a0 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76  the mapping abov
208b0 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c  e using the foll
208c0 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e  owing expression
208d0 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73  ..  ** Assert()s
208e0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
208f0 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
20900 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20  correct..  */.  
20910 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70  op = ((pExpr->op
20920 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e  +(TK_ISNULL&1))^
20930 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29  1)-(TK_ISNULL&1)
20940 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63  ;..  /* Verify c
20950 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74  orrect alignment
20960 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
20970 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20  constants.  */. 
20980 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
20990 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c  op!=TK_ISNULL ||
209a0 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20   op==OP_NotNull 
209b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
209c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55  pr->op!=TK_NOTNU
209d0 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e  LL || op==OP_IsN
209e0 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
209f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
20a00 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29  E || op==OP_Eq )
20a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
20a20 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  r->op!=TK_EQ || 
20a30 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61  op==OP_Ne );.  a
20a40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
20a50 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LT || op==O
20a60 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ge );.  assert
20a70 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
20a80 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20  LE || op==OP_Gt 
20a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
20aa0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c  pr->op!=TK_GT ||
20ab0 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20   op==OP_Le );.  
20ac0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
20ad0 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_GE || op==
20ae0 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74  OP_Lt );..  swit
20af0 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
20b00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
20b10 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
20b20 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20b30 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
20b40 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
20b50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20b60 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
20b70 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
20b80 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
20b90 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
20ba0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20bb0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
20bc0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
20bd0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20be0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
20bf0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
20c00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20c10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
20c20 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
20c30 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
20c40 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20c50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
20c60 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
20c70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20c80 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
20c90 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c  Expr->pLeft, d2,
20ca0 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49   jumpIfNull^SQLI
20cb0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
20cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20cd0 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
20ce0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
20cf0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
20d00 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
20d10 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
20d20 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
20d30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
20d40 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
20d50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
20d60 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
20d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20d80 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
20d90 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
20da0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
20db0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
20dc0 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
20dd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
20de0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
20df0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
20e00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20e10 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
20e20 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
20e30 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
20e40 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
20e50 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
20e60 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
20e70 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20e80 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
20e90 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20ea0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
20eb0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20ec0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
20ed0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
20ee0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20ef0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
20f00 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
20f10 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
20f20 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
20f30 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
20f40 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
20f60 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
20f70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
20f80 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
20f90 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
20fa0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
20fb0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20fc0 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
20fd0 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
20fe0 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
20ff0 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
21000 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
21010 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
21020 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
21030 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
21040 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
21050 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
21060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21070 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
21080 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
21090 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
210a0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
210b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
210c0 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
210d0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
210e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
210f0 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
21100 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
21110 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
21120 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
21130 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21140 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
21150 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
21160 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
21170 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
21180 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
21190 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
211a0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
211b0 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
211c0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
211d0 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
211e0 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
211f0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
21200 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
21210 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
21220 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
21230 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
21240 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
21250 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
21260 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
21270 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
21280 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
21290 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45 78  .      op = (pEx
212a0 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f  pr->op==TK_IS) ?
212b0 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a   TK_NE : TK_EQ;.
212c0 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
212d0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
212e0 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
212f0 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20  Right, op,.     
21300 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c               r1,
21310 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49 54   r2, dest, SQLIT
21320 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
21330 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
21340 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20  v, op==TK_EQ);. 
21350 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
21360 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45  eIf(v, op==TK_NE
21370 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21380 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
21390 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
213a0 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
213b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
213c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
213d0 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
213e0 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
213f0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
21400 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
21410 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
21420 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
21430 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21440 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72  eAddOp2(v, op, r
21450 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
21460 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
21470 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62  _ISNULL );   Vdb
21480 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
21490 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
214a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
214b0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
214c0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
214d0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
214e0 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  LL);.      testc
214f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
21500 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21510 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21520 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
21530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
21540 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
21550 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65 74       exprCodeBet
21560 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78  ween(pParse, pEx
21570 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d  pr, dest, 0, jum
21580 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
21590 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
215a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
215b0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
215c0 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
215d0 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c    if( jumpIfNull
215e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
215f0 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50  te3ExprCodeIN(pP
21600 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73  arse, pExpr, des
21610 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
21620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
21630 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20  nt destIfNull = 
21640 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
21650 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
21660 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
21670 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  IN(pParse, pExpr
21680 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75  , dest, destIfNu
21690 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
216a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
216b0 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
216c0 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
216d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
216e0 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
216f0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
21700 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
21710 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
21720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21730 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
21740 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
21750 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
21760 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
21770 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
21780 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
21790 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
217a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
217b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
217c0 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
217d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
217e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
217f0 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
21800 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
21810 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
21820 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
21830 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
21840 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
21850 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
21860 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
21870 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
21880 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
21890 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
218a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
218b0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
218c0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
218d0 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
218e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  );.}../*.** Do a
218f0 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
21900 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
21910 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
21920 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a 2a  n 0 if the two.*
21930 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72  * expressions ar
21940 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64 65  e completely ide
21950 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e 20  ntical.  Return 
21960 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  1 if they differ
21970 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43 4f   only.** by a CO
21980 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 61  LLATE operator a
21990 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c 2e  t the top level.
219a0 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74 68    Return 2 if th
219b0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
219c0 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68 61  ces.** other tha
219d0 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
219e0 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
219f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
21a00 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
21a10 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
21a20 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
21a30 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
21a40 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
21a50 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
21a60 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
21a70 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
21a80 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 41  ab..**.** The pA
21a90 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20 75   side might be u
21aa0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
21ab0 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
21ac0 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69 73  e case and pB is
21ad0 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54 4b  .** not using TK
21ae0 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69 73  _REGISTER but is
21af0 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69 76   otherwise equiv
21b00 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69 6c  alent, then stil
21b10 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a  l return 0..**.*
21b20 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69 73  * Sometimes this
21b30 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
21b40 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20 74  turn 2 even if t
21b50 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  he two expressio
21b60 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72 65  ns.** really are
21b70 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49 66   equivalent.  If
21b80 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76 65   we cannot prove
21b90 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
21ba0 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64 65  sions are.** ide
21bb0 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75 72  ntical, we retur
21bc0 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20 73  n 2 just to be s
21bd0 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73  afe.  So if this
21be0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
21bf0 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75 20  rns 2, then you 
21c00 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b 6e  do not really kn
21c10 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20 69  ow for certain i
21c20 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78 70  f the two.** exp
21c30 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65  ressions are the
21c40 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20 79   same.  But if y
21c50 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31 20  ou get a 0 or 1 
21c60 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f 75  return, then you
21c70 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65 20  .** can be sure 
21c80 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
21c90 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 49  are the same.  I
21ca0 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68 65  n the places whe
21cb0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
21cc0 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20 64  ne is used, it d
21cd0 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f 20  oes not hurt to 
21ce0 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20 2d  get an extra 2 -
21cf0 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d 69   that.** just mi
21d00 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73 6f  ght result in so
21d10 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  me slightly slow
21d20 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72 65  er code.  But re
21d30 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69 6e  turning.** an in
21d40 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20 63  correct 0 or 1 c
21d50 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 6d  ould lead to a m
21d60 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  alfunction..*/.i
21d70 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
21d80 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
21d90 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69 54  Expr *pB, int iT
21da0 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62 69  ab){.  u32 combi
21db0 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  nedFlags;.  if( 
21dc0 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
21dd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42 3d  {.    return pB=
21de0 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20 7d  =pA ? 0 : 2;.  }
21df0 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  .  combinedFlags
21e00 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20 70   = pA->flags | p
21e10 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28 20  B->flags;.  if( 
21e20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20  combinedFlags & 
21e30 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
21e40 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67     if( (pA->flag
21e50 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f 49  s&pB->flags&EP_I
21e60 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20 70  ntValue)!=0 && p
21e70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42 2d  A->u.iValue==pB-
21e80 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20 20  >u.iValue ){.   
21e90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
21ea0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
21eb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
21ec0 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20 20  p!=pB->op ){.   
21ed0 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f   if( pA->op==TK_
21ee0 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69 74  COLLATE && sqlit
21ef0 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
21f00 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54 61  ->pLeft, pB, iTa
21f10 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65  b)<2 ){.      re
21f20 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
21f30 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54 4b    if( pB->op==TK
21f40 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
21f50 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21f60 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54  A, pB->pLeft, iT
21f70 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
21f80 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
21f90 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d     return 2;.  }
21fa0 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 54  .  if( pA->op!=T
21fb0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
21fc0 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  YS(pA->op!=TK_AG
21fd0 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41 2d  G_COLUMN) && pA-
21fe0 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
21ff0 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d 3e   if( strcmp(pA->
22000 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e 7a  u.zToken,pB->u.z
22010 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20 20  Token)!=0 ){.   
22020 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f 70     return pA->op
22030 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20 31  ==TK_COLLATE ? 1
22040 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
22050 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67 73    if( (pA->flags
22060 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 21   & EP_Distinct)!
22070 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45 50  =(pB->flags & EP
22080 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65 74  _Distinct) ) ret
22090 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c 57  urn 2;.  if( ALW
220a0 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
220b0 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  gs & EP_TokenOnl
220c0 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  y)==0) ){.    if
220d0 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ( combinedFlags 
220e0 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
220f0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
22100 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
22110 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c  mpare(pA->pLeft,
22120 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62   pB->pLeft, iTab
22130 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
22140 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22150 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69  rCompare(pA->pRi
22160 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 2c  ght, pB->pRight,
22170 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   iTab) ) return 
22180 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  2;.    if( sqlit
22190 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
221a0 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20 70  e(pA->x.pList, p
221b0 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61 62  B->x.pList, iTab
221c0 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
221d0 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f    if( ALWAYS((co
221e0 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50  mbinedFlags & EP
221f0 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26 26  _Reduced)==0) &&
22200 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52 49   pA->op!=TK_STRI
22210 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NG ){.      if( 
22220 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
22230 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
22240 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 2;.      if( p
22250 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69  A->iTable!=pB->i
22260 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26  Table .       &&
22270 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54   (pA->iTable!=iT
22280 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e  ab || NEVER(pB->
22290 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65  iTable>=0)) ) re
222a0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
222b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
222c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
222d0 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
222e0 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69  cts.  Return 0 i
222f0 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
22300 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e  ical and .** non
22310 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69  -zero if they di
22320 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
22330 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75  .**.** If any su
22340 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68  belement of pB h
22350 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d  as Expr.iTable==
22360 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20  (-1) then it is 
22370 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f  allowed.** to co
22380 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61  mpare equal to a
22390 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65  n equivalent ele
223a0 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20  ment in pA with 
223b0 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61  Expr.iTable==iTa
223c0 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  b..**.** This ro
223d0 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75  utine might retu
223e0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  rn non-zero for 
223f0 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c  equivalent ExprL
22400 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e  ists.  The.** on
22410 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77  ly consequence w
22420 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20  ill be disabled 
22430 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20  optimizations.  
22440 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
22450 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72  .** must never r
22460 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
22470 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65  wo ExprList obje
22480 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  cts are differen
22490 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75  t, or.** a malfu
224a0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  nction will resu
224b0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  lt..**.** Two NU
224c0 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20  LL pointers are 
224d0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
224e0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
224f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a  a NULL pointer.*
22500 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73  * always differs
22510 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c   from a non-NULL
22520 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
22530 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22540 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74  Compare(ExprList
22550 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a   *pA, ExprList *
22560 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20  pB, int iTab){. 
22570 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
22580 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72  ==0 && pB==0 ) r
22590 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
225a0 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20  A==0 || pB==0 ) 
225b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
225c0 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e  pA->nExpr!=pB->n
225d0 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b  Expr ) return 1;
225e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
225f0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
22600 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20     Expr *pExprA 
22610 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  = pA->a[i].pExpr
22620 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  ;.    Expr *pExp
22630 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45  rB = pB->a[i].pE
22640 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d  xpr;.    if( pA-
22650 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21  >a[i].sortOrder!
22660 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  =pB->a[i].sortOr
22670 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  der ) return 1;.
22680 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
22690 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
226a0 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29  A, pExprB, iTab)
226b0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
226c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
226d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
226e0 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76  e if we can prov
226f0 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61  e the pE2 will a
22700 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66  lways be true if
22710 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e   pE1 is.** true.
22720 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
22730 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70  f we cannot comp
22740 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f  lete the proof o
22750 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a  r if pE2 might.*
22760 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61  * be false.  Exa
22770 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  mples:.**.**    
22780 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE1: x==5      
22790 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20   pE2: x==5      
227a0 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74         Result: t
227b0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
227c0 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20  x>0        pE2: 
227d0 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20  x==5            
227e0 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
227f0 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20  *     pE1: x=21 
22800 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20        pE2: x=21 
22810 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75  OR y=43     Resu
22820 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
22830 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20  pE1: x!=123     
22840 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
22850 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72  LL    Result: tr
22860 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
22870 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78  !=?1      pE2: x
22880 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
22890 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20  Result: true.** 
228a0 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55      pE1: x IS NU
228b0 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f  LL  pE2: x IS NO
228c0 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74  T NULL    Result
228d0 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70  : false.**     p
228e0 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70  E1: x IS ?2    p
228f0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
22900 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c  L    Reuslt: fal
22910 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f  se.**.** When co
22920 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d  mparing TK_COLUM
22930 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20  N nodes between 
22940 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20  pE1 and pE2, if 
22950 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e  pE2 has.** Expr.
22960 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73  iTable<0 then as
22970 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d  sume a table num
22980 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61  ber given by iTa
22990 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e  b..**.** When in
229a0 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66   doubt, return f
229b0 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67  alse.  Returning
229c0 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65   true might give
229d0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a   a performance.*
229e0 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20  * improvement.  
229f0 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20  Returning false 
22a00 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65  might cause a pe
22a10 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
22a20 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77  ion, but.** it w
22a30 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20  ill always give 
22a40 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  the correct answ
22a50 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20  er and is hence 
22a60 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a  always safe..*/.
22a70 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
22a80 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20  mpliesExpr(Expr 
22a90 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c  *pE1, Expr *pE2,
22aa0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66   int iTab){.  if
22ab0 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
22ac0 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69  pare(pE1, pE2, i
22ad0 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Tab)==0 ){.    r
22ae0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
22af0 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f  f( pE2->op==TK_O
22b00 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33  R.   && (sqlite3
22b10 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
22b20 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  pE1, pE2->pLeft,
22b30 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20   iTab).         
22b40 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78      || sqlite3Ex
22b50 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
22b60 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20  1, pE2->pRight, 
22b70 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20  iTab) ).  ){.   
22b80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22b90 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
22ba0 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73  _NOTNULL.   && s
22bb0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
22bc0 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45  e(pE1->pLeft, pE
22bd0 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d  2->pLeft, iTab)=
22be0 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f  =0.   && (pE1->o
22bf0 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20  p!=TK_ISNULL && 
22c00 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a  pE1->op!=TK_IS).
22c10 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
22c20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
22c30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  0;.}../*.** An i
22c40 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
22c50 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
22c60 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68  re is used by th
22c70 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a  e tree walker.**
22c80 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65   to count refere
22c90 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f  nces to table co
22ca0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67  lumns in the arg
22cb0 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a  uments of an .**
22cc0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
22cd0 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ion, in order to
22ce0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a   implement the.*
22cf0 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  * sqlite3Functio
22d00 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69  nThisSrc() routi
22d10 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72  ne..*/.struct Sr
22d20 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69  cCount {.  SrcLi
22d30 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f  st *pSrc;   /* O
22d40 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52  ne particular FR
22d50 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e  OM clause in a n
22d60 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20  ested query */. 
22d70 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20   int nThis;     
22d80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
22d90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
22da0 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74  umns in pSrcList
22db0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72   */.  int nOther
22dc0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
22dd0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
22de0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68  o columns in oth
22df0 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20  er FROM clauses 
22e00 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75  */.};../*.** Cou
22e10 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
22e20 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
22e30 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
22e40 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75  c int exprSrcCou
22e50 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  nt(Walker *pWalk
22e60 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
22e70 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52  {.  /* The NEVER
22e80 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64  () on the second
22e90 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65   term is because
22ea0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
22eb0 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20  UsesThisSrc().  
22ec0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c  ** is always cal
22ed0 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74  led before sqlit
22ee0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22ef0 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f  regates() and so
22f00 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c   the.  ** TK_COL
22f10 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65  UMNs have not ye
22f20 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64  t been converted
22f30 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
22f40 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71  UMN.  If.  ** sq
22f50 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
22f60 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73  sThisSrc() is us
22f70 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69  ed differently i
22f80 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
22f90 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77  e.  ** NEVER() w
22fa0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ill need to be r
22fb0 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28  emoved. */.  if(
22fc0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
22fd0 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70  OLUMN || NEVER(p
22fe0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
22ff0 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20  _COLUMN) ){.    
23000 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
23010 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20  t SrcCount *p = 
23020 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43  pWalker->u.pSrcC
23030 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73  ount;.    SrcLis
23040 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
23050 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20  c;.    int nSrc 
23060 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e  = pSrc ? pSrc->n
23070 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72  Src : 0;.    for
23080 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b  (i=0; i<nSrc; i+
23090 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  +){.      if( pE
230a0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72  xpr->iTable==pSr
230b0 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20  c->a[i].iCursor 
230c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
230d0 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b     if( i<nSrc ){
230e0 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b  .      p->nThis+
230f0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
23100 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b      p->nOther++;
23110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23120 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  ;.}../*.** Deter
23140 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74  mine if any of t
23150 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
23160 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74 69  the pExpr Functi
23170 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  on reference.** 
23180 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72  pSrcList.  Retur
23190 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20 64  n true if they d
231a0 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20  o.  Also return 
231b0 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e 63  true if the func
231c0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61  tion.** has no a
231d0 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20  rguments or has 
231e0 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72  only constant ar
231f0 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
23200 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a   false if pExpr.
23210 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f  ** references co
23220 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f  lumns but not co
23230 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20  lumns of tables 
23240 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73  found in pSrcLis
23250 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
23260 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
23270 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70 72  sSrc(Expr *pExpr
23280 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c  , SrcList *pSrcL
23290 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ist){.  Walker w
232a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43 6f  ;.  struct SrcCo
232b0 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72  unt cnt;.  asser
232c0 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
232d0 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
232e0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
232f0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
23300 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
23310 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20   exprSrcCount;. 
23320 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d   w.u.pSrcCount =
23330 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72   &cnt;.  cnt.pSr
23340 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20  c = pSrcList;.  
23350 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20  cnt.nThis = 0;. 
23360 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b   cnt.nOther = 0;
23370 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
23380 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72  prList(&w, pExpr
23390 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65  ->x.pList);.  re
233a0 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30  turn cnt.nThis>0
233b0 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d   || cnt.nOther==
233c0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  0;.}../*.** Add 
233d0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
233e0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
233f0 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  Col[] array.  Re
23400 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
23410 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
23420 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
23430 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
23440 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
23450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
23460 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
23470 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
23480 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
23490 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
234a0 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72  aCol = sqlite3Ar
234b0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
234c0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70      db,.       p
234d0 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20  Info->aCol,.    
234e0 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d     sizeof(pInfo-
234f0 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20  >aCol[0]),.     
23500 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d    &pInfo->nColum
23510 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  n,.       &i.  )
23520 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
23530 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61     ../*.** Add a
23540 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
23550 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  the pAggInfo->aF
23560 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65  unc[] array.  Re
23570 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
23580 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65  f.** the new ele
23590 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
235a0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
235b0 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e  if malloc fails.
235c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
235d0 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71  ddAggInfoFunc(sq
235e0 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
235f0 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
23600 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46  t i;.  pInfo->aF
23610 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72  unc = sqlite3Arr
23620 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
23630 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70     db, .       p
23640 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20  Info->aFunc,.   
23650 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
23660 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20  ->aFunc[0]),.   
23670 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e      &pInfo->nFun
23680 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29  c,.       &i.  )
23690 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20  ;.  return i;.} 
236a0 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
236b0 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c  is the xExprCall
236c0 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20  back for a tree 
236d0 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75  walker.  It is u
236e0 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d  sed to.** implem
236f0 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41  ent sqlite3ExprA
23700 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23710 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ().  See sqlite3
23720 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
23730 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64  gates.** for add
23740 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
23750 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
23760 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67  nt analyzeAggreg
23770 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ate(Walker *pWal
23780 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
23790 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61  ){.  int i;.  Na
237a0 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d  meContext *pNC =
237b0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
237c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
237d0 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
237e0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
237f0 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
23800 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a  ist;.  AggInfo *
23810 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e  pAggInfo = pNC->
23820 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69  pAggInfo;..  swi
23830 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
23840 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
23850 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
23860 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
23870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23880 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
23890 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
238a0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
238b0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
238c0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65   );.      /* Che
238d0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
238e0 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e   column is in on
238f0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
23900 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20  in the FROM.    
23910 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74    ** clause of t
23920 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
23930 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ry */.      if( 
23940 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74 21  ALWAYS(pSrcList!
23950 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  =0) ){.        s
23960 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
23970 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63  em *pItem = pSrc
23980 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20  List->a;.       
23990 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
239a0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
239b0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
239c0 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
239d0 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20  nfo_col *pCol;. 
239e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
239f0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23a00 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
23a10 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
23a20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
23a30 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  f( pExpr->iTable
23a40 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
23a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a60 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
23a70 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
23a80 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20 72  ans that pExpr r
23a90 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
23aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23ab0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 46  that is in the F
23ac0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
23ad0 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
23ae0 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  y.  .           
23af0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20   **.            
23b00 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79  ** Make an entry
23b10 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
23b20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
23b30 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20  l[] if there.   
23b40 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e           ** is n
23b50 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72  ot an entry ther
23b60 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20  e already..     
23b70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23b80 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
23b90 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20           pCol = 
23ba0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a  pAggInfo->aCol;.
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
23bc0 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d  k=0; k<pAggInfo-
23bd0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70  >nColumn; k++, p
23be0 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
23bf0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
23c00 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
23c10 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20  Table &&.       
23c20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23c30 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
23c40 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
23c50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
23c60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
23c70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
23c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23c90 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e   (k>=pAggInfo->n
23ca0 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20  Column).        
23cb0 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64       && (k = add
23cc0 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50  AggInfoColumn(pP
23cd0 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
23ce0 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20  fo))>=0 .       
23cf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
23d00 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41        pCol = &pA
23d10 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b  ggInfo->aCol[k];
23d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23d30 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70  Col->pTab = pExp
23d40 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
23d50 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61         pCol->iTa
23d60 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
23d70 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
23d80 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
23d90 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
23da0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
23db0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b   pCol->iMem = ++
23dc0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
23de0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
23df0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
23e00 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20      pCol->pExpr 
23e10 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
23e20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67 49         if( pAggI
23e30 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b  nfo->pGroupBy ){
23e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23e50 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20   int j, n;.     
23e60 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c             ExprL
23e70 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49  ist *pGB = pAggI
23e80 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  nfo->pGroupBy;. 
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23ea0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
23eb0 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42  tem *pTerm = pGB
23ec0 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->a;.           
23ed0 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45       n = pGB->nE
23ee0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
23ef0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
23f00 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  n; j++, pTerm++)
23f10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23f20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
23f30 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23f50 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( pE->op==TK_CO
23f60 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62  LUMN && pE->iTab
23f70 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
23f80 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  e &&.           
23f90 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69             pE->i
23fa0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
23fb0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23fd0 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
23fe0 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  n = j;.         
23ff0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
24000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
24020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24040 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
24050 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20  iSorterColumn<0 
24060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24070 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
24080 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66  Column = pAggInf
24090 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  o->nSortingColum
240a0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n++;.           
240b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
240c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   }.            /
240d0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61  * There is now a
240e0 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70  n entry for pExp
240f0 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  r in pAggInfo->a
24100 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20  Col[] (either.  
24110 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
24120 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65 72  ause it was ther
24130 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61  e before or beca
24140 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65 61  use we just crea
24150 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20  ted it)..       
24160 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20       ** Convert 
24170 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65 20  the pExpr to be 
24180 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  a TK_AGG_COLUMN 
24190 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61  referring to tha
241a0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  t.            **
241b0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
241c0 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20  ] entry..       
241d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
241e0 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
241f0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
24200 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20  _NoReduce);.    
24210 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
24220 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e  AggInfo = pAggIn
24230 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo;.            
24240 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
24250 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  GG_COLUMN;.     
24260 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
24270 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20  gg = (i16)k;.   
24280 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24290 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65            } /* e
242a0 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62  ndif pExpr->iTab
242b0 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
242c0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20  or */.        } 
242d0 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* end loop over
242e0 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20   pSrcList */.   
242f0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
24300 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
24310 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
24320 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
24330 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
24340 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67  cFlags & NC_InAg
24350 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20  gFunc)==0.      
24360 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c   && pWalker->wal
24370 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d  kerDepth==pExpr-
24380 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20  >op2.      ){.  
24390 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
243a0 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20 69  o see if pExpr i
243b0 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
243c0 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61   another aggrega
243d0 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  te .        ** f
243e0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
243f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
24400 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
24410 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
24420 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
24430 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20  nfo_func *pItem 
24440 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  = pAggInfo->aFun
24450 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  c;.        for(i
24460 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
24470 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65  nFunc; i++, pIte
24480 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
24490 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
244a0 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45  ompare(pItem->pE
244b0 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d  xpr, pExpr, -1)=
244c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
244d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
244e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
244f0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41         if( i>=pA
24500 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b  ggInfo->nFunc ){
24510 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45  .          /* pE
24520 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e  xpr is original.
24530 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74    Make a new ent
24540 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  ry in pAggInfo->
24550 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20  aFunc[].        
24560 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
24570 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72  8 enc = ENC(pPar
24580 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  se->db);.       
24590 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66     i = addAggInf
245a0 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62  oFunc(pParse->db
245b0 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20  , pAggInfo);.   
245c0 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20         if( i>=0 
245d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
245e0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
245f0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24600 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
24610 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
24620 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  m = &pAggInfo->a
24630 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Func[i];.       
24640 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70       pItem->pExp
24650 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
24660 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d         pItem->iM
24670 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
24680 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
24690 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
246a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
246b0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
246c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
246d0 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69  em->pFunc = sqli
246e0 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
246f0 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24710 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
24720 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
24730 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
24740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24750 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
24760 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
24770 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
24780 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
24790 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
247a0 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
247b0 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
247c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
247d0 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
247e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
247f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24800 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
24810 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
24820 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
24850 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
24860 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
24870 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
24880 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
24890 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
248a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
248b0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
248c0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
248d0 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
248e0 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
248f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24900 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
24910 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
24920 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
24930 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
24940 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
24950 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
24960 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
24970 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
24980 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
24990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
249a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
249b0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
249c0 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
249d0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
249e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
249f0 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
24a00 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
24a10 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
24a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
24a30 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
24a40 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
24a50 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
24a60 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
24a70 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
24a80 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
24a90 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
24aa0 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
24ab0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
24ac0 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
24ad0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
24ae0 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
24af0 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
24b00 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
24b10 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
24b20 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
24b30 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
24b40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24b50 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
24b60 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
24b70 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
24b80 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
24b90 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
24ba0 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
24bb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24bc0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
24bd0 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
24be0 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
24bf0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
24c00 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
24c10 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
24c20 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
24c30 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
24c40 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
24c50 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
24c60 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
24c70 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
24c80 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
24c90 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
24ca0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
24cb0 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
24cc0 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
24cd0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
24ce0 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
24cf0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
24d00 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
24d10 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
24d20 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
24d30 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
24d40 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
24d50 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
24d60 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
24d70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
24d80 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
24d90 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
24da0 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
24db0 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
24dc0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
24dd0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
24de0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
24df0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
24e00 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
24e10 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
24e20 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
24e30 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
24e40 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
24e50 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
24e60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
24e70 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
24e80 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
24e90 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
24ea0 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
24eb0 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
24ec0 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
24ed0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
24ee0 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
24ef0 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
24f00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
24f10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
24f20 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
24f30 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
24f40 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
24f50 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
24f60 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
24f70 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
24f80 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
24f90 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
24fa0 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
24fb0 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
24fc0 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
24fd0 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
24fe0 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
24ff0 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
25000 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
25010 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
25020 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
25030 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
25040 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
25050 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25060 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
25070 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
25080 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
25090 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
250a0 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
250b0 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
250c0 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
250d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
250e0 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
250f0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
25100 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
25110 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
25120 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
25130 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
25140 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
25150 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
25160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
25170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25180 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
25190 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
251a0 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
251b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
251c0 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
251d0 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
251e0 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
251f0 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
25200 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
25210 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
25220 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
25230 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
25240 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
25250 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
25260 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
25270 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
25280 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
25290 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
252a0 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
252b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
252c0 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
252d0 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
252e0 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
252f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
25300 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
25310 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
25320 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
25330 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
25340 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
25350 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
25360 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
25370 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
25380 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
25390 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
253a0 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
253b0 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
253c0 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
253d0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
253e0 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
253f0 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
25400 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
25410 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
25420 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
25430 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
25440 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
25450 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25460 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
25470 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
25480 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
25490 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
254a0 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
254b0 30 3b 0a 7d 0a                                   0;.}.