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

Artifact 8800584340a9b4f4c0ca55c360de751c6da0b11a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b60: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b70: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b90: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0ba0: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0bb0: 20 26 73 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   &s, 0);.}../*.*
0bc0: 2a 20 53 6b 69 70 20 6f 76 65 72 20 61 6e 79 20  * Skip over any 
0bd0: 54 4b 5f 43 4f 4c 4c 41 54 45 20 6f 72 20 54 4b  TK_COLLATE or TK
0be0: 5f 41 53 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  _AS operators an
0bf0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0c00: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c10: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c20: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c30: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c40: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c50: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c60: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c70: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c90: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0ca0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0cb0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cc0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cd0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0ce0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0cf0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0d00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d10: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d20: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d30: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d40: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d50: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d70: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0da0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c  p==TK_COLLATE ||
0db0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
0dc0: 53 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  S );.      pExpr
0dd0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
0de0: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20  .    }.  }   .  
0df0: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
0e00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0e10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
0e20: 65 6e 63 65 20 66 6f 72 20 74 68 65 20 65 78 70  ence for the exp
0e30: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49  ression pExpr. I
0e40: 66 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f  f.** there is no
0e50: 20 64 65 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69   defined collati
0e60: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 72 65 74  ng sequence, ret
0e70: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
0e80: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
0e90: 71 75 65 6e 63 65 20 6d 69 67 68 74 20 62 65 20  quence might be 
0ea0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 61 20  determined by a 
0eb0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0ec0: 0a 2a 2a 20 6f 72 20 62 79 20 74 68 65 20 70 72  .** or by the pr
0ed0: 65 73 65 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75  esence of a colu
0ee0: 6d 6e 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  mn with a define
0ef0: 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  d collating sequ
0f00: 65 6e 63 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45  ence..** COLLATE
0f10: 20 6f 70 65 72 61 74 6f 72 73 20 74 61 6b 65 20   operators take 
0f20: 66 69 72 73 74 20 70 72 65 63 65 64 65 6e 63 65  first precedence
0f30: 2e 20 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 73  .  Left operands
0f40: 20 74 61 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65   take.** precede
0f50: 6e 63 65 20 6f 76 65 72 20 72 69 67 68 74 20 6f  nce over right o
0f60: 70 65 72 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c  perands..*/.Coll
0f70: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
0f80: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
0f90: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0fa0: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
0fb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0fc0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
0fd0: 6c 20 3d 20 30 3b 0a 20 20 45 78 70 72 20 2a 70  l = 0;.  Expr *p
0fe0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 77 68 69 6c   = pExpr;.  whil
0ff0: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  e( p ){.    int 
1000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20  op = p->op;.    
1010: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
1020: 50 5f 47 65 6e 65 72 69 63 20 29 20 62 72 65 61  P_Generic ) brea
1030: 6b 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54  k;.    if( op==T
1040: 4b 5f 43 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b  K_CAST || op==TK
1050: 5f 55 50 4c 55 53 20 29 7b 0a 20 20 20 20 20 20  _UPLUS ){.      
1060: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20  p = p->pLeft;.  
1070: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1080: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d    }.    if( op==
1090: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f  TK_COLLATE || (o
10a0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26  p==TK_REGISTER &
10b0: 26 20 70 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c  & p->op2==TK_COL
10c0: 4c 41 54 45 29 20 29 7b 0a 20 20 20 20 20 20 70  LATE) ){.      p
10d0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
10e0: 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10f0: 20 45 4e 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e   ENC(db), 0, p->
1100: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1120: 20 20 69 66 28 20 28 6f 70 3d 3d 54 4b 5f 41 47    if( (op==TK_AG
1130: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1140: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1150: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1160: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1170: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 20 26  _TRIGGER).     &
1180: 26 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  & p->pTab!=0.   
1190: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d   ){.      /* op=
11a0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20  =TK_REGISTER && 
11b0: 70 2d 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65  p->pTab!=0 happe
11c0: 6e 73 20 77 68 65 6e 20 70 45 78 70 72 20 77 61  ns when pExpr wa
11d0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20  s originally.   
11e0: 20 20 20 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d     ** a TK_COLUM
11f0: 4e 20 62 75 74 20 77 61 73 20 70 72 65 76 69 6f  N but was previo
1200: 75 73 6c 79 20 65 76 61 6c 75 61 74 65 64 20 61  usly evaluated a
1210: 6e 64 20 63 61 63 68 65 64 20 69 6e 20 61 20 72  nd cached in a r
1220: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  egister */.     
1230: 20 69 6e 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c   int j = p->iCol
1240: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  umn;.      if( j
1250: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  >=0 ){.        c
1260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
1270: 20 3d 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c   = p->pTab->aCol
1280: 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
1290: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12b0: 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
12c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
12f0: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
1300: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1310: 4c 65 66 74 20 26 26 20 28 70 2d 3e 70 4c 65 66  Left && (p->pLef
1320: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
1330: 6c 6c 61 74 65 29 21 3d 30 20 29 7b 0a 20 20 20  llate)!=0 ){.   
1340: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
1350: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
1360: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
1370: 65 78 74 20 20 3d 20 70 2d 3e 70 52 69 67 68 74  ext  = p->pRight
1380: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
1390: 20 45 78 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73   Expr.x union is
13a0: 20 6e 65 76 65 72 20 75 73 65 64 20 61 74 20 74   never used at t
13b0: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
13c0: 45 78 70 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20  Expr.pRight */. 
13d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13e0: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
13f0: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
1400: 20 20 20 20 20 20 20 20 2f 2a 20 70 2d 3e 66 6c          /* p->fl
1410: 61 67 73 20 68 6f 6c 64 73 20 45 50 5f 43 6f 6c  ags holds EP_Col
1420: 6c 61 74 65 20 61 6e 64 20 70 2d 3e 70 4c 65 66  late and p->pLef
1430: 74 2d 3e 66 6c 61 67 73 20 64 6f 65 73 20 6e 6f  t->flags does no
1440: 74 2e 20 20 41 6e 64 0a 20 20 20 20 20 20 20 20  t.  And.        
1450: 2a 2a 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 20  ** p->x.pSelect 
1460: 63 61 6e 6e 6f 74 2e 20 20 53 6f 20 69 66 20 70  cannot.  So if p
1470: 2d 3e 78 2e 70 4c 65 66 74 20 65 78 69 73 74 73  ->x.pLeft exists
1480: 2c 20 69 74 20 6d 75 73 74 20 68 6f 6c 64 20 61  , it must hold a
1490: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61  t.        ** lea
14a0: 73 74 20 6f 6e 65 20 45 50 5f 43 6f 6c 6c 61 74  st one EP_Collat
14b0: 65 2e 20 54 68 75 73 20 74 68 65 20 66 6f 6c 6c  e. Thus the foll
14c0: 6f 77 69 6e 67 20 74 77 6f 20 41 4c 57 41 59 53  owing two ALWAYS
14d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
14e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 26   p->x.pList!=0 &
14f0: 26 20 41 4c 57 41 59 53 28 21 45 78 70 72 48 61  & ALWAYS(!ExprHa
1500: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
1510: 78 49 73 53 65 6c 65 63 74 29 29 20 29 7b 0a 20  xIsSelect)) ){. 
1520: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
1530: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1540: 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 2d 3e 78  0; ALWAYS(i<p->x
1550: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 20  .pList->nExpr); 
1560: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1570: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1580: 70 65 72 74 79 28 70 2d 3e 78 2e 70 4c 69 73 74  perty(p->x.pList
1590: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  ->a[i].pExpr, EP
15a0: 5f 43 6f 6c 6c 61 74 65 29 20 29 7b 0a 20 20 20  _Collate) ){.   
15b0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 78 74             pNext
15c0: 20 3d 20 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61   = p->x.pList->a
15d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
15e0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1610: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20    }.        p = 
1620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1630: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1640: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1650: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
1660: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
1670: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
1680: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
1690: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
16a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
16b0: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
16c0: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
16d0: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
16e0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
16f0: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
1700: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
1710: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1720: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
1730: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
1740: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
1750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
1760: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
1770: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1780: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1790: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
17a0: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
17b0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
17c0: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
17d0: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
17e0: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
17f0: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
1800: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
1810: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
1820: 72 69 63 0a 20 20 20 20 2a 2a 20 61 66 66 69 6e  ric.    ** affin
1830: 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f  ity, use that. O
1840: 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20  therwise use no 
1850: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f  affinity..    */
1860: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1870: 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74  IsNumericAffinit
1880: 79 28 61 66 66 31 29 20 7c 7c 20 73 71 6c 69 74  y(aff1) || sqlit
1890: 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69 6e  e3IsNumericAffin
18a0: 69 74 79 28 61 66 66 32 29 20 29 7b 0a 20 20 20  ity(aff2) ){.   
18b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18c0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
18d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18f0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
1900: 65 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26  else if( !aff1 &
1910: 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f  & !aff2 ){.    /
1920: 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f  * Neither side o
1930: 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
1940: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43   is a column.  C
1950: 6f 6d 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a  ompare the.    *
1960: 2a 20 72 65 73 75 6c 74 73 20 64 69 72 65 63 74  * results direct
1970: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ly..    */.    r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
1990: 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _NONE;.  }else{.
19a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20      /* One side 
19b0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
19c0: 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55   other is not. U
19d0: 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61  se the columns a
19e0: 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20  ffinity. */.    
19f0: 61 73 73 65 72 74 28 20 61 66 66 31 3d 3d 30 20  assert( aff1==0 
1a00: 7c 7c 20 61 66 66 32 3d 3d 30 20 29 3b 0a 20 20  || aff2==0 );.  
1a10: 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b    return (aff1 +
1a20: 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   aff2);.  }.}../
1a30: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20  *.** pExpr is a 
1a40: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1a50: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tor.  Return the
1a60: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
1a70: 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a80: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1a90: 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20   operands prior 
1aa0: 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  to doing the com
1ab0: 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  parison..*/.stat
1ac0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
1ad0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
1ae0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
1af0: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
1b00: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
1b10: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b20: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
1b30: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
1b40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
1b50: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
1b60: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
1b70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
1b80: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1b90: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70  ->op==TK_NE || p
1ba0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20  Expr->op==TK_IS 
1bb0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1bc0: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 61 73 73 65  _ISNOT );.  asse
1bd0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1be0: 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69   );.  aff = sqli
1bf0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
1c00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1c10: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
1c20: 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ht ){.    aff = 
1c30: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
1c40: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52  finity(pExpr->pR
1c50: 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 65  ight, aff);.  }e
1c60: 6c 73 65 20 69 66 28 20 45 78 70 72 48 61 73 50  lse if( ExprHasP
1c70: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c80: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1c90: 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65      aff = sqlite
1ca0: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
1cb0: 28 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63  (pExpr->x.pSelec
1cc0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
1cd0: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
1ce0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
1cf0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
1d00: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 0a  E_AFF_NONE;.  }.
1d10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
1d20: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
1d30: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70  a comparison exp
1d40: 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27  ression, eg. '='
1d50: 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65  , '<', IN(...) e
1d60: 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e  tc..** idx_affin
1d70: 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e  ity is the affin
1d80: 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ity of an indexe
1d90: 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e  d column. Return
1da0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20   true.** if the 
1db0: 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e  index with affin
1dc0: 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79  ity idx_affinity
1dd0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
1de0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70   comparison in p
1e00: 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
1e10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
1e20: 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c  yOk(Expr *pExpr,
1e30: 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69   char idx_affini
1e40: 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ty){.  char aff 
1e50: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
1e60: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 73  nity(pExpr);.  s
1e70: 77 69 74 63 68 28 20 61 66 66 20 29 7b 0a 20 20  witch( aff ){.  
1e80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1e90: 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20 20 20 72 65  F_NONE:.      re
1ea0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 63 61 73 65  turn 1;.    case
1eb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1ec0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  :.      return i
1ed0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
1ee0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
1ef0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1f00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
1f10: 73 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79  sNumericAffinity
1f20: 28 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  (idx_affinity);.
1f30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1f40: 75 72 6e 20 74 68 65 20 50 35 20 76 61 6c 75 65  urn the P5 value
1f50: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1f60: 75 73 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  used for a binar
1f70: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20  y comparison.** 
1f80: 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71 2c 20 4f  opcode (OP_Eq, O
1f90: 50 5f 47 65 20 65 74 63 2e 29 20 75 73 65 64 20  P_Ge etc.) used 
1fa0: 74 6f 20 63 6f 6d 70 61 72 65 20 70 45 78 70 72  to compare pExpr
1fb0: 31 20 61 6e 64 20 70 45 78 70 72 32 2e 0a 2a 2f  1 and pExpr2..*/
1fc0: 0a 73 74 61 74 69 63 20 75 38 20 62 69 6e 61 72  .static u8 binar
1fd0: 79 43 6f 6d 70 61 72 65 50 35 28 45 78 70 72 20  yCompareP5(Expr 
1fe0: 2a 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70  *pExpr1, Expr *p
1ff0: 45 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49  Expr2, int jumpI
2000: 66 4e 75 6c 6c 29 7b 0a 20 20 75 38 20 61 66 66  fNull){.  u8 aff
2010: 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33   = (char)sqlite3
2020: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
2030: 70 72 32 29 3b 0a 20 20 61 66 66 20 3d 20 28 75  pr2);.  aff = (u
2040: 38 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  8)sqlite3Compare
2050: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c  Affinity(pExpr1,
2060: 20 61 66 66 29 20 7c 20 28 75 38 29 6a 75 6d 70   aff) | (u8)jump
2070: 49 66 4e 75 6c 6c 3b 0a 20 20 72 65 74 75 72 6e  IfNull;.  return
2080: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   aff;.}../*.** R
2090: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20a0: 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  to the collation
20b0: 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20 73   sequence that s
20c0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62 79  hould be used by
20d0: 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  .** a binary com
20e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
20f0: 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66 74   comparing pLeft
2100: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a   and pRight..**.
2110: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20 68  ** If the left h
2120: 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20 68  and expression h
2130: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
2140: 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74 68  equence type, th
2150: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65 64  en it is.** used
2160: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
2170: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2180: 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ce for the right
2190: 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e   hand expression
21a0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72 20  .** is used, or 
21b0: 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49 4e  the default (BIN
21c0: 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72 20  ARY) if neither 
21d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
21e0: 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79   collating.** ty
21f0: 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  pe..**.** Argume
2200: 6e 74 20 70 52 69 67 68 74 20 28 62 75 74 20 6e  nt pRight (but n
2210: 6f 74 20 70 4c 65 66 74 29 20 6d 61 79 20 62 65  ot pLeft) may be
2220: 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e   a null pointer.
2230: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2240: 2a 20 69 74 20 69 73 20 6e 6f 74 20 63 6f 6e 73  * it is not cons
2250: 69 64 65 72 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53  idered..*/.CollS
2260: 65 71 20 2a 73 71 6c 69 74 65 33 42 69 6e 61 72  eq *sqlite3Binar
2270: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
2280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2290: 2c 20 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  , .  Expr *pLeft
22a0: 2c 20 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  , .  Expr *pRigh
22b0: 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  t.){.  CollSeq *
22c0: 70 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pColl;.  assert(
22d0: 20 70 4c 65 66 74 20 29 3b 0a 20 20 69 66 28 20   pLeft );.  if( 
22e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
22f0: 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
2300: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
2310: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
2320: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 7d 65  se, pLeft);.  }e
2330: 6c 73 65 20 69 66 28 20 70 52 69 67 68 74 20 26  lse if( pRight &
2340: 26 20 28 70 52 69 67 68 74 2d 3e 66 6c 61 67 73  & (pRight->flags
2350: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d   & EP_Collate)!=
2360: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  0 ){.    pColl =
2370: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2380: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2390: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
23a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
23b0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
23c0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
23d0: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
23e0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
23f0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2400: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2410: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2420: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
2430: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2440: 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69 73  e for a comparis
2450: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
2460: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 43  static int codeC
2470: 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73 65 20  ompare(.  Parse 
2480: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 54  *pParse,    /* T
2490: 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e 64 20  he parsing (and 
24a0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 29  code generating)
24b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
24c0: 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  pr *pLeft,      
24d0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
24e0: 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  and */.  Expr *p
24f0: 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20 54 68  Right,     /* Th
2500: 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
2510: 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64 65 2c  */.  int opcode,
2520: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2530: 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64 65 20  mparison opcode 
2540: 2a 2f 0a 20 20 69 6e 74 20 69 6e 31 2c 20 69 6e  */.  int in1, in
2550: 74 20 69 6e 32 2c 20 2f 2a 20 52 65 67 69 73 74  t in2, /* Regist
2560: 65 72 20 68 6f 6c 64 69 6e 67 20 6f 70 65 72 61  er holding opera
2570: 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  nds */.  int des
2580: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  t,         /* Ju
2590: 6d 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e  mp here if true.
25a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49    */.  int jumpI
25b0: 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74  fNull    /* If t
25c0: 72 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74  rue, jump if eit
25d0: 68 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  her operand is N
25e0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ULL */.){.  int 
25f0: 70 35 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p5;.  int addr;.
2600: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a    CollSeq *p4;..
2610: 20 20 70 34 20 3d 20 73 71 6c 69 74 65 33 42 69    p4 = sqlite3Bi
2620: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
2630: 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  eq(pParse, pLeft
2640: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 70 35 20  , pRight);.  p5 
2650: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
2660: 35 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  5(pLeft, pRight,
2670: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
2680: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2690: 62 65 41 64 64 4f 70 34 28 70 50 61 72 73 65 2d  beAddOp4(pParse-
26a0: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
26b0: 69 6e 32 2c 20 64 65 73 74 2c 20 69 6e 31 2c 0a  in2, dest, in1,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
26e0: 2a 29 70 34 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  *)p4, P4_COLLSEQ
26f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
2700: 43 68 61 6e 67 65 50 35 28 70 50 61 72 73 65 2d  ChangeP5(pParse-
2710: 3e 70 56 64 62 65 2c 20 28 75 38 29 70 35 29 3b  >pVdbe, (u8)p5);
2720: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
2730: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
2740: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 2f  X_EXPR_DEPTH>0./
2750: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2760: 61 72 67 75 6d 65 6e 74 20 6e 48 65 69 67 68 74  argument nHeight
2770: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
2780: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6d 61   equal to the ma
2790: 78 69 6d 75 6d 0a 2a 2a 20 65 78 70 72 65 73 73  ximum.** express
27a0: 69 6f 6e 20 64 65 70 74 68 20 61 6c 6c 6f 77 65  ion depth allowe
27b0: 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  d. If it is not,
27c0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
27d0: 6d 65 73 73 61 67 65 20 69 6e 0a 2a 2a 20 70 50  message in.** pP
27e0: 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  arse..*/.int sql
27f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2800: 67 68 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ght(Parse *pPars
2810: 65 2c 20 69 6e 74 20 6e 48 65 69 67 68 74 29 7b  e, int nHeight){
2820: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2830: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6d 78 48  TE_OK;.  int mxH
2840: 65 69 67 68 74 20 3d 20 70 50 61 72 73 65 2d 3e  eight = pParse->
2850: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
2860: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
2870: 54 48 5d 3b 0a 20 20 69 66 28 20 6e 48 65 69 67  TH];.  if( nHeig
2880: 68 74 3e 6d 78 48 65 69 67 68 74 20 29 7b 0a 20  ht>mxHeight ){. 
2890: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28a0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
28b0: 20 20 20 22 45 78 70 72 65 73 73 69 6f 6e 20 74     "Expression t
28c0: 72 65 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ree is too large
28d0: 20 28 6d 61 78 69 6d 75 6d 20 64 65 70 74 68 20   (maximum depth 
28e0: 25 64 29 22 2c 20 6d 78 48 65 69 67 68 74 0a 20  %d)", mxHeight. 
28f0: 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 53     );.    rc = S
2900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2920: 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ./* The followin
2930: 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  g three function
2940: 73 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  s, heightOfExpr(
2950: 29 2c 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c  ), heightOfExprL
2960: 69 73 74 28 29 0a 2a 2a 20 61 6e 64 20 68 65 69  ist().** and hei
2970: 67 68 74 4f 66 53 65 6c 65 63 74 28 29 2c 20 61  ghtOfSelect(), a
2980: 72 65 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  re used to deter
2990: 6d 69 6e 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  mine the maximum
29a0: 20 68 65 69 67 68 74 0a 2a 2a 20 6f 66 20 61 6e   height.** of an
29b0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
29c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  e referenced by 
29d0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 61  the structure pa
29e0: 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 66  ssed as the.** f
29f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
2a00: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 61 78  *.** If this max
2a10: 69 6d 75 6d 20 68 65 69 67 68 74 20 69 73 20 67  imum height is g
2a20: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
2a30: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 70 6f  current value po
2a40: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 70  inted.** to by p
2a50: 6e 48 65 69 67 68 74 2c 20 74 68 65 20 73 65 63  nHeight, the sec
2a60: 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 20 74  ond parameter, t
2a70: 68 65 6e 20 73 65 74 20 2a 70 6e 48 65 69 67 68  hen set *pnHeigh
2a80: 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
2a90: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2aa0: 69 64 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  id heightOfExpr(
2ab0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Expr *p, int *pn
2ac0: 48 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70  Height){.  if( p
2ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2ae0: 48 65 69 67 68 74 3e 2a 70 6e 48 65 69 67 68 74  Height>*pnHeight
2af0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69   ){.      *pnHei
2b00: 67 68 74 20 3d 20 70 2d 3e 6e 48 65 69 67 68 74  ght = p->nHeight
2b10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74  ;.    }.  }.}.st
2b20: 61 74 69 63 20 76 6f 69 64 20 68 65 69 67 68 74  atic void height
2b30: 4f 66 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  OfExprList(ExprL
2b40: 69 73 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ist *p, int *pnH
2b50: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2b60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
2b90: 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28     heightOfExpr(
2ba0: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  p->a[i].pExpr, p
2bb0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  nHeight);.    }.
2bc0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2bd0: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2be0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
2bf0: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2c00: 28 20 70 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ( p ){.    heigh
2c10: 74 4f 66 45 78 70 72 28 70 2d 3e 70 57 68 65 72  tOfExpr(p->pWher
2c20: 65 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  e, pnHeight);.  
2c30: 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70    heightOfExpr(p
2c40: 2d 3e 70 48 61 76 69 6e 67 2c 20 70 6e 48 65 69  ->pHaving, pnHei
2c50: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2c60: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 69 6d 69 74  OfExpr(p->pLimit
2c70: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2c80: 20 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d   heightOfExpr(p-
2c90: 3e 70 4f 66 66 73 65 74 2c 20 70 6e 48 65 69 67  >pOffset, pnHeig
2ca0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
2cb0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  fExprList(p->pEL
2cc0: 69 73 74 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a  ist, pnHeight);.
2cd0: 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70 72      heightOfExpr
2ce0: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
2cf0: 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , pnHeight);.   
2d00: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2d10: 74 28 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  t(p->pOrderBy, p
2d20: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2d30: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e  ightOfSelect(p->
2d40: 70 50 72 69 6f 72 2c 20 70 6e 48 65 69 67 68 74  pPrior, pnHeight
2d50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d60: 53 65 74 20 74 68 65 20 45 78 70 72 2e 6e 48 65  Set the Expr.nHe
2d70: 69 67 68 74 20 76 61 72 69 61 62 6c 65 20 69 6e  ight variable in
2d80: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
2d90: 61 73 73 65 64 20 61 73 20 61 6e 20 0a 2a 2a 20  assed as an .** 
2da0: 61 72 67 75 6d 65 6e 74 2e 20 41 6e 20 65 78 70  argument. An exp
2db0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 6e 6f 20  ression with no 
2dc0: 63 68 69 6c 64 72 65 6e 2c 20 45 78 70 72 2e 70  children, Expr.p
2dd0: 4c 69 73 74 20 6f 72 20 0a 2a 2a 20 45 78 70 72  List or .** Expr
2de0: 2e 70 53 65 6c 65 63 74 20 6d 65 6d 62 65 72 20  .pSelect member 
2df0: 68 61 73 20 61 20 68 65 69 67 68 74 20 6f 66 20  has a height of 
2e00: 31 2e 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  1. Any other exp
2e10: 72 65 73 73 69 6f 6e 0a 2a 2a 20 68 61 73 20 61  ression.** has a
2e20: 20 68 65 69 67 68 74 20 65 71 75 61 6c 20 74 6f   height equal to
2e30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2e40: 67 68 74 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ght of any other
2e50: 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20   .** referenced 
2e60: 45 78 70 72 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a  Expr plus one..*
2e70: 2a 0a 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67  *.** Also propag
2e80: 61 74 65 20 45 50 5f 50 72 6f 70 61 67 61 74 65  ate EP_Propagate
2e90: 20 66 6c 61 67 73 20 75 70 20 66 72 6f 6d 20 45   flags up from E
2ea0: 78 70 72 2e 78 2e 70 4c 69 73 74 20 74 6f 20 45  xpr.x.pList to E
2eb0: 78 70 72 2e 66 6c 61 67 73 2c 0a 2a 2a 20 69 66  xpr.flags,.** if
2ec0: 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
2ee0: 72 53 65 74 48 65 69 67 68 74 28 45 78 70 72 20  rSetHeight(Expr 
2ef0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67  *p){.  int nHeig
2f00: 68 74 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74  ht = 0;.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  OfExpr(p->pLeft,
2f20: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 68 65   &nHeight);.  he
2f30: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 52  ightOfExpr(p->pR
2f40: 69 67 68 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  ight, &nHeight);
2f50: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
2f60: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
2f70: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 68  Select) ){.    h
2f80: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2d  eightOfSelect(p-
2f90: 3e 78 2e 70 53 65 6c 65 63 74 2c 20 26 6e 48 65  >x.pSelect, &nHe
2fa0: 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ight);.  }else i
2fb0: 66 28 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  f( p->x.pList ){
2fc0: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2fd0: 72 4c 69 73 74 28 70 2d 3e 78 2e 70 4c 69 73 74  rList(p->x.pList
2fe0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  , &nHeight);.   
2ff0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
3000: 50 72 6f 70 61 67 61 74 65 20 26 20 73 71 6c 69  Propagate & sqli
3010: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
3020: 28 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  (p->x.pList);.  
3030: 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d  }.  p->nHeight =
3040: 20 6e 48 65 69 67 68 74 20 2b 20 31 3b 0a 7d 0a   nHeight + 1;.}.
3050: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
3060: 78 70 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69  xpr.nHeight vari
3070: 61 62 6c 65 20 75 73 69 6e 67 20 74 68 65 20 65  able using the e
3080: 78 70 72 53 65 74 48 65 69 67 68 74 28 29 20 66  xprSetHeight() f
3090: 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74  unction. If.** t
30a0: 68 65 20 68 65 69 67 68 74 20 69 73 20 67 72 65  he height is gre
30b0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6d 61  ater than the ma
30c0: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 78  ximum allowed ex
30d0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 2c 0a  pression depth,.
30e0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
30f0: 72 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  r in pParse..**.
3100: 2a 2a 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74  ** Also propagat
3110: 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61 67 61  e all EP_Propaga
3120: 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20 74 68  te flags from th
3130: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 69  e Expr.x.pList i
3140: 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c 61 67  nto.** Expr.flag
3150: 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s. .*/.void sqli
3160: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
3170: 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65 20 2a  AndFlags(Parse *
3180: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 29  pParse, Expr *p)
3190: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
31a0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
31b0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 70   exprSetHeight(p
31c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
31d0: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
31e0: 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74 29 3b  se, p->nHeight);
31f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3200: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
3210: 67 68 74 20 6f 66 20 61 6e 79 20 65 78 70 72 65  ght of any expre
3220: 73 73 69 6f 6e 20 74 72 65 65 20 72 65 66 65 72  ssion tree refer
3230: 65 6e 63 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  enced.** by the 
3240: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
3250: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
3260: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
3270: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
3280: 48 65 69 67 68 74 28 53 65 6c 65 63 74 20 2a 70  Height(Select *p
3290: 29 7b 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74  ){.  int nHeight
32a0: 20 3d 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66   = 0;.  heightOf
32b0: 53 65 6c 65 63 74 28 70 2c 20 26 6e 48 65 69 67  Select(p, &nHeig
32c0: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 48  ht);.  return nH
32d0: 65 69 67 68 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f  eight;.}.#else /
32e0: 2a 20 41 42 4f 56 45 3a 20 20 48 65 69 67 68 74  * ABOVE:  Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 65 6e 61   enforcement ena
3300: 62 6c 65 64 2e 20 20 42 45 4c 4f 57 3a 20 48 65  bled.  BELOW: He
3310: 69 67 68 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74  ight enforcement
3320: 20 6f 66 66 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72   off */./*.** Pr
3330: 6f 70 61 67 61 74 65 20 61 6c 6c 20 45 50 5f 50  opagate all EP_P
3340: 72 6f 70 61 67 61 74 65 20 66 6c 61 67 73 20 66  ropagate flags f
3350: 72 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70  rom the Expr.x.p
3360: 4c 69 73 74 20 69 6e 74 6f 0a 2a 2a 20 45 78 70  List into.** Exp
3370: 72 2e 66 6c 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69  r.flags. .*/.voi
3380: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  d sqlite3ExprSet
3390: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 50  HeightAndFlags(P
33a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
33b0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  pr *p){.  if( p 
33c0: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 26 26  && p->x.pList &&
33d0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
33e0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
33f0: 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 66 6c 61  t) ){.    p->fla
3400: 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61  gs |= EP_Propaga
3410: 74 65 20 26 20 73 71 6c 69 74 65 33 45 78 70 72  te & sqlite3Expr
3420: 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 78 2e 70  ListFlags(p->x.p
3430: 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65  List);.  }.}.#de
3440: 66 69 6e 65 20 65 78 70 72 53 65 74 48 65 69 67  fine exprSetHeig
3450: 68 74 28 79 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ht(y).#endif /* 
3460: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
3470: 44 45 50 54 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  DEPTH>0 */../*.*
3480: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3490: 73 20 74 68 65 20 63 6f 72 65 20 61 6c 6c 6f 63  s the core alloc
34a0: 61 74 6f 72 20 66 6f 72 20 45 78 70 72 20 6e 6f  ator for Expr no
34b0: 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74  des..**.** Const
34c0: 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72 65  ruct a new expre
34d0: 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20 72  ssion node and r
34e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34f0: 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a  to it.  Memory.*
3500: 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65 20  * for this node 
3510: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 54 6f 6b  and for the pTok
3520: 65 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  en argument is a
3530: 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69   single allocati
3540: 6f 6e 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  on.** obtained f
3550: 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
3560: 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c  loc().  The call
3570: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
3580: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
3590: 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74  or making sure t
35a0: 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c  he node eventual
35b0: 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a  ly gets freed..*
35c0: 2a 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20  *.** If dequote 
35d0: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
35e0: 65 20 74 6f 6b 65 6e 20 28 69 66 20 69 74 20 65  e token (if it e
35f0: 78 69 73 74 73 29 20 69 73 20 64 65 71 75 6f 74  xists) is dequot
3600: 65 64 2e 0a 2a 2a 20 49 66 20 64 65 71 75 6f 74  ed..** If dequot
3610: 65 20 69 73 20 66 61 6c 73 65 2c 20 6e 6f 20 64  e is false, no d
3620: 65 71 75 6f 74 69 6e 67 20 69 73 20 70 65 72 66  equoting is perf
3630: 6f 72 6d 61 6e 63 65 2e 20 20 54 68 65 20 64 65  ormance.  The de
3640: 51 75 6f 74 65 0a 2a 2a 20 70 61 72 61 6d 65 74  Quote.** paramet
3650: 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  er is ignored if
3660: 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20   pToken is NULL 
3670: 6f 72 20 69 66 20 74 68 65 20 74 6f 6b 65 6e 20  or if the token 
3680: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 61 70 70 65  does not.** appe
3690: 61 72 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ar to be quoted.
36a0: 20 20 49 66 20 74 68 65 20 71 75 6f 74 65 73 20    If the quotes 
36b0: 77 65 72 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  were of the form
36c0: 20 22 2e 2e 2e 22 20 28 64 6f 75 62 6c 65 2d 71   "..." (double-q
36d0: 75 6f 74 65 73 29 0a 2a 2a 20 74 68 65 6e 20 74  uotes).** then t
36e0: 68 65 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 20  he EP_DblQuoted 
36f0: 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
3700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  he expression no
3710: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 61  de..**.** Specia
3720: 6c 20 63 61 73 65 3a 20 20 49 66 20 6f 70 3d 3d  l case:  If op==
3730: 54 4b 5f 49 4e 54 45 47 45 52 20 61 6e 64 20 70  TK_INTEGER and p
3740: 54 6f 6b 65 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Token points to 
3750: 61 20 73 74 72 69 6e 67 20 74 68 61 74 0a 2a 2a  a string that.**
3760: 20 63 61 6e 20 62 65 20 74 72 61 6e 73 6c 61 74   can be translat
3770: 65 64 20 69 6e 74 6f 20 61 20 33 32 2d 62 69 74  ed into a 32-bit
3780: 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20 74   integer, then t
3790: 68 65 20 74 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a  he token is not.
37a0: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 75 2e 7a  ** stored in u.z
37b0: 54 6f 6b 65 6e 2e 20 20 49 6e 73 74 65 61 64 2c  Token.  Instead,
37c0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
37d0: 75 65 73 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ues is written.*
37e0: 2a 20 69 6e 74 6f 20 75 2e 69 56 61 6c 75 65 20  * into u.iValue 
37f0: 61 6e 64 20 74 68 65 20 45 50 5f 49 6e 74 56 61  and the EP_IntVa
3800: 6c 75 65 20 66 6c 61 67 20 69 73 20 73 65 74 2e  lue flag is set.
3810: 20 20 4e 6f 20 65 78 74 72 61 20 73 74 6f 72 61    No extra stora
3820: 67 65 0a 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74  ge.** is allocat
3830: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 69  ed to hold the i
3840: 6e 74 65 67 65 72 20 74 65 78 74 20 61 6e 64 20  nteger text and 
3850: 74 68 65 20 64 65 71 75 6f 74 65 20 66 6c 61 67  the dequote flag
3860: 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a   is ignored..*/.
3870: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
3880: 72 41 6c 6c 6f 63 28 0a 20 20 73 71 6c 69 74 65  rAlloc(.  sqlite
3890: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
38a0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
38b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
38c0: 65 72 6f 28 29 20 28 6d 61 79 20 62 65 20 6e 75  ero() (may be nu
38d0: 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ll) */.  int op,
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6f   /* Expression o
3900: 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pcode */.  const
3910: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20   Token *pToken, 
3920: 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61 72 67 75     /* Token argu
3930: 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20 62 65 20  ment.  Might be 
3940: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 65  NULL */.  int de
3950: 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20 20  quote           
3960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 71    /* True to deq
3970: 75 6f 74 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uote */.){.  Exp
3980: 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
3990: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 69 6e 74  Extra = 0;.  int
39a0: 20 69 56 61 6c 75 65 20 3d 20 30 3b 0a 0a 20 20   iValue = 0;..  
39b0: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
39c0: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54    if( op!=TK_INT
39d0: 45 47 45 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e  EGER || pToken->
39e0: 7a 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c  z==0.          |
39f0: 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  | sqlite3GetInt3
3a00: 32 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56  2(pToken->z, &iV
3a10: 61 6c 75 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alue)==0 ){.    
3a20: 20 20 6e 45 78 74 72 61 20 3d 20 70 54 6f 6b 65    nExtra = pToke
3a30: 6e 2d 3e 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73  n->n+1;.      as
3a40: 73 65 72 74 28 20 69 56 61 6c 75 65 3e 3d 30 20  sert( iValue>=0 
3a50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
3a60: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
3a70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
3a80: 7a 65 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72  zeof(Expr)+nExtr
3a90: 61 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  a);.  if( pNew )
3aa0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  {.    pNew->op =
3ab0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e 65   (u8)op;.    pNe
3ac0: 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  w->iAgg = -1;.  
3ad0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
3ae0: 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61        if( nExtra
3af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3b00: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3b10: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
3b20: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
3b30: 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20 20  e = iValue;.    
3b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3b50: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
3b60: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  pNew->u.zToken =
3b70: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
3b80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3b90: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c  ( pToken->z!=0 |
3ba0: 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29  | pToken->n==0 )
3bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
3bc0: 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70 79  oken->n ) memcpy
3bd0: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  (pNew->u.zToken,
3be0: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b   pToken->z, pTok
3bf0: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  en->n);.        
3c00: 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70  pNew->u.zToken[p
3c10: 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  Token->n] = 0;. 
3c20: 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75 6f         if( dequo
3c30: 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33 20  te && nExtra>=3 
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
3c50: 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a   ((c = pToken->z
3c60: 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  [0])=='\'' || c=
3c70: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c  ='"' || c=='[' |
3c80: 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20 20  | c=='`') ){.   
3c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
3ca0: 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a 54  quote(pNew->u.zT
3cb0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  oken);.         
3cc0: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70 4e   if( c=='"' ) pN
3cd0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
3ce0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
3cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d00: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3d10: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d20: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d30: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d60: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d70: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d80: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d90: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3da0: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3db0: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3dc0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3df0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3e00: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3e10: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e20: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e40: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e60: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e70: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e80: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e90: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3ea0: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3eb0: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ec0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3ed0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ef0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3f00: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3f10: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f20: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f30: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f40: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f50: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f60: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f80: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f90: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3fa0: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3fb0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fc0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fd0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fe0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3ff0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
4000: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
4010: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4020: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4030: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4040: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4060: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4070: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4090: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
40a0: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
40b0: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40c0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40d0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40e0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40f0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
4100: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
4110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4120: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4130: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4140: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4150: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4160: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4170: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4180: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4190: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
41a0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
41b0: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41c0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41d0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41e0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41f0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
4200: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
4210: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4220: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4230: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4240: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4250: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4260: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4270: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4280: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4290: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
42a0: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
42b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42c0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42d0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42e0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
4300: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
4310: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4320: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4330: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4340: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4360: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4370: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4380: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4390: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
43a0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
43b0: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43c0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
43d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b  =0 ){.    /* Tak
43f0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73  e advantage of s
4400: 68 6f 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c  hort-circuit fal
4410: 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
4420: 66 6f 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70  for AND */.    p
4430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4440: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  d(pParse->db, pL
4450: 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
4460: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73  }else{.    p = s
4470: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4480: 70 50 61 72 73 65 2d 3e 64 62 2c 20 6f 70 2c 20  pParse->db, op, 
4490: 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20  pToken, 1);.    
44a0: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
44b0: 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73 65  hSubtrees(pParse
44c0: 2d 3e 64 62 2c 20 70 2c 20 70 4c 65 66 74 2c 20  ->db, p, pLeft, 
44d0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 69  pRight);.  }.  i
44e0: 66 28 20 70 20 29 20 7b 0a 20 20 20 20 73 71 6c  f( p ) {.    sql
44f0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
4500: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
4510: 48 65 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  Height);.  }.  r
4520: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4530: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
4540: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4550: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4560: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4570: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4580: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4590: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
45a0: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
45b0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
45c0: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
45d0: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
45e0: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
45f0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
4600: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
4610: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
4620: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
4630: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
4640: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4650: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4660: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4670: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4680: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4690: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
46a0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
46b0: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
46c0: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
46d0: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
46e0: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
46f0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
4700: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4710: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
4720: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
4730: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
4740: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4750: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4760: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4770: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4780: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4790: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
47a0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
47b0: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
47c0: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
47d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
47e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
47f0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
4800: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
4810: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
4820: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
4830: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
4840: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4850: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4860: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4870: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4880: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4890: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
48a0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
48b0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
48c0: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
48d0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
48e0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
48f0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4900: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4910: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4920: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4930: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4950: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4960: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4970: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4980: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4990: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
49a0: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
49b0: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
49c0: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
49d0: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
49e0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
49f0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4a00: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4a10: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4a20: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4a30: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4a40: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4a50: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4a60: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4a70: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4a80: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4a90: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4ab0: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4ac0: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4ad0: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4ae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4af0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4b00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4b10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4b20: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4b30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4b40: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4b50: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4b60: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4b70: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4b80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4b90: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4ba0: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4bb0: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4bc0: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4bd0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4be0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4bf0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4c00: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4c10: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4c20: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4c30: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4c40: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4c50: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4c60: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4c70: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4c80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4c90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4ca0: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4cc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4cd0: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4ce0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4cf0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4d00: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4d10: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4d30: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4d40: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4d50: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4d60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4d80: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4d90: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4da0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4db0: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4dc0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4dd0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4de0: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4df0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4e00: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4e10: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4e20: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4e30: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4e40: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
4e50: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
4e60: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
4e70: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
4e80: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
4e90: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
4ea0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
4eb0: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
4ec0: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
4ed0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
4ee0: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4ef0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
4f00: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
4f10: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
4f20: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
4f30: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
4f40: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
4f50: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
4f60: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
4f70: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
4f80: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
4f90: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
4fa0: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
4fb0: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
4fc0: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
4fd0: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
4fe0: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
4ff0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
5000: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5010: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
5020: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
5030: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
5040: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5050: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5060: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5070: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5080: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5090: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
50a0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
50b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
50c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
50d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
50e0: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
50f0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
5100: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
5110: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
5120: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5130: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
5140: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5150: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5160: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5170: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5190: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
51a0: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
51b0: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
51c0: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
51d0: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
51e0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
51f0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
5200: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
5210: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
5220: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
5230: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
5240: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5250: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5260: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5270: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5280: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5290: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
52a0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
52b0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
52c0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
52d0: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
52e0: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
52f0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
5300: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
5310: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
5320: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
5330: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
5340: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5350: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5360: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5370: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5380: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5390: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
53a0: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
53b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53c0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53d0: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
53e0: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
53f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5400: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
5410: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
5420: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
5430: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
5440: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5450: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5470: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5480: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5490: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
54a0: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
54b0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
54c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
54d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
54e0: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
54f0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5500: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
5510: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
5520: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
5530: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
5540: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5550: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5560: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5570: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5580: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5590: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
55a0: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
55b0: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
55c0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
55d0: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
55e0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
55f0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
5600: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
5610: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
5620: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5630: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
5640: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5650: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5660: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5670: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5680: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5690: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
56a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
56b0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
56c0: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
56d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56f0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
5700: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
5710: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
5720: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
5730: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
5740: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5750: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5760: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5780: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5790: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
57a0: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
57b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
57c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
57d0: 20 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20   Error reported 
57e0: 74 68 72 6f 75 67 68 20 64 62 2d 3e 6d 61 6c 6c  through db->mall
57f0: 6f 63 46 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ocFailed */.    
5800: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61      pParse->azVa
5810: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 6d  r = a;.        m
5820: 65 6d 73 65 74 28 26 61 5b 70 50 61 72 73 65 2d  emset(&a[pParse-
5830: 3e 6e 7a 56 61 72 5d 2c 20 30 2c 20 28 78 2d 70  >nzVar], 0, (x-p
5840: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 29 2a 73 69  Parse->nzVar)*si
5850: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56       pParse->nzV
5870: 61 72 20 3d 20 78 3b 0a 20 20 20 20 20 20 7d 0a  ar = x;.      }.
5880: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
5890: 27 3f 27 20 7c 7c 20 70 50 61 72 73 65 2d 3e 61  '?' || pParse->a
58a0: 7a 56 61 72 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a  zVar[x-1]==0 ){.
58b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
58c0: 62 46 72 65 65 28 64 62 2c 20 70 50 61 72 73 65  bFree(db, pParse
58d0: 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 29 3b 0a 20  ->azVar[x-1]);. 
58e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
58f0: 7a 56 61 72 5b 78 2d 31 5d 20 3d 20 73 71 6c 69  zVar[x-1] = sqli
5900: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
5910: 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
5920: 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 28      }.  } .  if(
5930: 20 21 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 26   !pParse->nErr &
5940: 26 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 64  & pParse->nVar>d
5950: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5960: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
5970: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 73  NUMBER] ){.    s
5980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5990: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
59a0: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 22 29   SQL variables")
59b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
59c0: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
59d0: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
59e0: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
59f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5a00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
5a10: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
5a20: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a  0 ) return;.  /*
5a30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 3a 20 41   Sanity check: A
5a40: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 49  ssert that the I
5a50: 6e 74 56 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e  ntValue is non-n
5a60: 65 67 61 74 69 76 65 20 69 66 20 69 74 20 65 78  egative if it ex
5a70: 69 73 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ists */.  assert
5a80: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a90: 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75  ty(p, EP_IntValu
5aa0: 65 29 20 7c 7c 20 70 2d 3e 75 2e 69 56 61 6c 75  e) || p->u.iValu
5ab0: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 45  e>=0 );.  if( !E
5ac0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5ad0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  , EP_TokenOnly) 
5ae0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 45 78  ){.    /* The Ex
5af0: 70 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65  pr.x union is ne
5b00: 76 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20  ver used at the 
5b10: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70  same time as Exp
5b20: 72 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20  r.pRight */.    
5b30: 61 73 73 65 72 74 28 20 70 2d 3e 78 2e 70 4c 69  assert( p->x.pLi
5b40: 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  st==0 || p->pRig
5b50: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ht==0 );.    sql
5b60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5b70: 62 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  b, p->pLeft);.  
5b80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
5b90: 65 74 65 28 64 62 2c 20 70 2d 3e 70 52 69 67 68  ete(db, p->pRigh
5ba0: 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
5bb0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5bc0: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 20 73 71  P_MemToken) ) sq
5bd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5be0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
5bf0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5c00: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
5c10: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
5c20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
5c30: 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65  ete(db, p->x.pSe
5c40: 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lect);.    }else
5c50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
5c60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
5c70: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
5c80: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21     }.  }.  if( !
5c90: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5ca0: 70 2c 20 45 50 5f 53 74 61 74 69 63 29 20 29 7b  p, EP_Static) ){
5cb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5cc0: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
5cd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5cf0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5d00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5d10: 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 70 61  structure .** pa
5d20: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5d30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  t argument. This
5d40: 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f   is always one o
5d50: 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c  f EXPR_FULLSIZE,
5d60: 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43 45 44  .** EXPR_REDUCED
5d70: 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54 4f 4b  SIZE or EXPR_TOK
5d80: 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73  ENONLYSIZE..*/.s
5d90: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 74  tatic int exprSt
5da0: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
5db0: 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ){.  if( ExprHas
5dc0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
5dd0: 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65 74 75  okenOnly) ) retu
5de0: 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  rn EXPR_TOKENONL
5df0: 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45 78 70  YSIZE;.  if( Exp
5e00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e10: 45 50 5f 52 65 64 75 63 65 64 29 20 29 20 72 65  EP_Reduced) ) re
5e20: 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55 43 45  turn EXPR_REDUCE
5e30: 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  DSIZE;.  return 
5e40: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d  EXPR_FULLSIZE;.}
5e50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65  ../*.** The dupe
5e60: 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72 6f 75  dExpr*Size() rou
5e70: 74 69 6e 65 73 20 65 61 63 68 20 72 65 74 75 72  tines each retur
5e80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
5e90: 62 79 74 65 73 20 72 65 71 75 69 72 65 64 0a 2a  bytes required.*
5ea0: 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63 6f 70  * to store a cop
5eb0: 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  y of an expressi
5ec0: 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  on or expression
5ed0: 20 74 72 65 65 2e 20 20 54 68 65 79 20 64 69 66   tree.  They dif
5ee0: 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75  fer in.** how mu
5ef0: 63 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 69  ch of the tree i
5f00: 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a  s measured..**.*
5f10: 2a 20 20 20 20 20 64 75 70 65 64 45 78 70 72 53  *     dupedExprS
5f20: 74 72 75 63 74 53 69 7a 65 28 29 20 20 20 20 20  tructSize()     
5f30: 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74 68 65  Size of only the
5f40: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
5f50: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5f60: 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20 20 20  rNodeSize()     
5f70: 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72 20 2b    Size of Expr +
5f80: 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b 65 6e   space for token
5f90: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
5fa0: 72 53 69 7a 65 28 29 20 20 20 20 20 20 20 20 20  rSize()         
5fb0: 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e 20 2b    Expr + token +
5fc0: 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f 6e 65   subtree compone
5fd0: 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nts.**.*********
5fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6020: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 75 70  **.**.** The dup
6030: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6040: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
6050: 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73 20 4f  rns two values O
6060: 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a 20 20  R-ed together:  
6070: 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70 61 63  .** (1) the spac
6080: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
6090: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70   copy of the Exp
60a0: 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e 6c 79  r structure only
60b0: 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74 68 65   and .** (2) the
60c0: 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20 74 68   EP_xxx flags th
60d0: 61 74 20 69 6e 64 69 63 61 74 65 20 77 68 61 74  at indicate what
60e0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 73   the structure s
60f0: 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e 0a 2a  ize should be..*
6100: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
6110: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ues is always on
6120: 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e of:.**.**     
6130: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a   EXPR_FULLSIZE.*
6140: 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45 44 55  *      EXPR_REDU
6150: 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50 5f 52  CEDSIZE   | EP_R
6160: 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20 20 45  educed.**      E
6170: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
6180: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
6190: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  .**.** The size 
61a0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
61b0: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79   can be found by
61c0: 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72 65 74   masking the ret
61d0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  urn value.** of 
61e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
61f0: 68 20 30 78 66 66 66 2e 20 20 54 68 65 20 66 6c  h 0xfff.  The fl
6200: 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ags can be found
6210: 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 0a   by masking the.
6220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
6230: 77 69 74 68 20 45 50 5f 52 65 64 75 63 65 64 7c  with EP_Reduced|
6240: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a  EP_TokenOnly..**
6250: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
6260: 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52 44 55  th flags==EXPRDU
6270: 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73 20 72  P_REDUCE, this r
6280: 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20 6f 6e  outines works on
6290: 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75   full-size.** (u
62a0: 6e 72 65 64 75 63 65 64 29 20 45 78 70 72 20 6f  nreduced) Expr o
62b0: 62 6a 65 63 74 73 20 61 73 20 74 68 65 79 20 6f  bjects as they o
62c0: 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e  r originally con
62d0: 73 74 72 75 63 74 65 64 20 62 79 20 74 68 65 20  structed by the 
62e0: 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72 69 6e  parser..** Durin
62f0: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  g expression ana
6300: 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69 6e 66  lysis, extra inf
6310: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  ormation is comp
6320: 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64 20 69  uted and moved i
6330: 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70 61 72  nto.** later par
6340: 74 73 20 6f 66 20 74 65 68 20 45 78 70 72 20 6f  ts of teh Expr o
6350: 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74 20 65  bject and that e
6360: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
6370: 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f 70 70   might get chopp
6380: 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74 68 65  ed.** off if the
6390: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72   expression is r
63a0: 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20 61 6c  educed.  Note al
63b0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
63c0: 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d  not work to.** m
63d0: 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50 5f 52  ake an EXPRDUP_R
63e0: 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20 61 20  EDUCE copy of a 
63f0: 72 65 64 75 63 65 64 20 65 78 70 72 65 73 73 69  reduced expressi
6400: 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  on.  It is only 
6410: 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65 64 75  legal.** to redu
6420: 63 65 20 61 20 70 72 69 73 74 69 6e 65 20 65 78  ce a pristine ex
6430: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 66 72  pression tree fr
6440: 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e 20 20  om the parser.  
6450: 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
6460: 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64 45 78  on.** of dupedEx
6470: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 63  prStructSize() c
6480: 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
6490: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
64a0: 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d 70 74  nts that attempt
64b0: 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65 20 74  .** to enforce t
64c0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a  his constraint..
64d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
64e0: 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a  pedExprStructSiz
64f0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6500: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 53 69  lags){.  int nSi
6510: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c  ze;.  assert( fl
6520: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
6530: 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d 30 20  UCE || flags==0 
6540: 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66  ); /* Only one f
6550: 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f 77 65  lag value allowe
6560: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  d */.  assert( E
6570: 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d 30 78  XPR_FULLSIZE<=0x
6580: 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fff );.  assert(
6590: 20 28 30 78 66 66 66 20 26 20 28 45 50 5f 52 65   (0xfff & (EP_Re
65a0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
65b0: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ly))==0 );.  if(
65c0: 20 30 3d 3d 28 66 6c 61 67 73 26 45 58 50 52 44   0==(flags&EXPRD
65d0: 55 50 5f 52 45 44 55 43 45 29 20 29 7b 0a 20 20  UP_REDUCE) ){.  
65e0: 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 46    nSize = EXPR_F
65f0: 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73 65  ULLSIZE;.  }else
6600: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  {.    assert( !E
6610: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6620: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
6630: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
6640: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6650: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6660: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20  _FromJoin) ); . 
6670: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
6690: 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20  P_MemToken) );. 
66a0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
66b0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
66c0: 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a 20  P_NoReduce) );. 
66d0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
66e0: 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  || p->x.pList ){
66f0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
6700: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
6710: 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20 20  | EP_Reduced;.  
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6730: 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
6740: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53 69  ==0 );.      nSi
6750: 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  ze = EXPR_TOKENO
6760: 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f 6b  NLYSIZE | EP_Tok
6770: 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20 20  enOnly;.    }.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65  }.  return nSize
6790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
67a0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
67b0: 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62 79   the space in by
67c0: 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  tes required to 
67d0: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 0a  store the copy .
67e0: 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20 73  ** of the Expr s
67f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 63  tructure and a c
6800: 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72 2e  opy of the Expr.
6810: 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20  u.zToken string 
6820: 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72 69  (if that.** stri
6830: 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29 0a  ng is defined.).
6840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6850: 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28  pedExprNodeSize(
6860: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61  Expr *p, int fla
6870: 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  gs){.  int nByte
6880: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
6890: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
68a0: 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28 20   & 0xfff;.  if( 
68b0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
68c0: 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  (p, EP_IntValue)
68d0: 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   && p->u.zToken 
68e0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  ){.    nByte += 
68f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6900: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a  p->u.zToken)+1;.
6910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f 55    }.  return ROU
6920: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  ND8(nByte);.}../
6930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6940: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6950: 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65 61  required to crea
6960: 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  te a duplicate o
6970: 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65 73  f the .** expres
6980: 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74  sion passed as t
6990: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
69a0: 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  t. The second ar
69b0: 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 6d  gument is a.** m
69c0: 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20 45  ask containing E
69d0: 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73  XPRDUP_XXX flags
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
69f0: 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75  e returned inclu
6a00: 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72 65  des space to cre
6a10: 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ate a copy of th
6a20: 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a 2a  e Expr struct.**
6a30: 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65 20   itself and the 
6a40: 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64 20  buffer referred 
6a50: 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54 6f  to by Expr.u.zTo
6a60: 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  ken, if any..**.
6a70: 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44 55  ** If the EXPRDU
6a80: 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69 73  P_REDUCE flag is
6a90: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
6aa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63 6c  eturn value incl
6ab0: 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20 74  udes .** space t
6ac0: 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c 20  o duplicate all 
6ad0: 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74 68  Expr nodes in th
6ae0: 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62 79  e tree formed by
6af0: 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a 20   Expr.pLeft .** 
6b00: 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74 20  and Expr.pRight 
6b10: 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20 6e  variables (but n
6b20: 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75 63  ot for any struc
6b30: 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74 6f  tures pointed to
6b40: 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 65   or .** descende
6b50: 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72 2e  d from the Expr.
6b60: 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72 2e  x.pList or Expr.
6b70: 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61 62  x.pSelect variab
6b80: 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  les)..*/.static 
6b90: 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69 7a  int dupedExprSiz
6ba0: 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  e(Expr *p, int f
6bb0: 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79  lags){.  int nBy
6bc0: 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20  te = 0;.  if( p 
6bd0: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 64  ){.    nByte = d
6be0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6bf0: 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  (p, flags);.    
6c00: 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44 55  if( flags&EXPRDU
6c10: 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  P_REDUCE ){.    
6c20: 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65 64    nByte += duped
6c30: 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65 66  ExprSize(p->pLef
6c40: 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70 65  t, flags) + dupe
6c50: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52 69  dExprSize(p->pRi
6c60: 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ght, flags);.   
6c70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6c80: 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nByte;.}../*.** 
6c90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6ca0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
6cb0: 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65 78  te3ExprDup(), ex
6cc0: 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a 42  cept that if pzB
6cd0: 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f 74  uffer .** is not
6ce0: 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42 75   NULL then *pzBu
6cf0: 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ffer is assumed 
6d00: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
6d10: 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75 67  ffer large enoug
6d20: 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74  h .** to store t
6d30: 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72 65  he copy of expre
6d40: 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f 70  ssion p, the cop
6d50: 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b  ies of p->u.zTok
6d60: 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69 63  en.** (if applic
6d70: 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20 63  able), and the c
6d80: 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d 3e  opies of the p->
6d90: 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52 69  pLeft and p->pRi
6da0: 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ght expressions,
6db0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66 6f  .** if any. Befo
6dc0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
6dd0: 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20 74  zBuffer is set t
6de0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
6df0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f 72   past the.** por
6e00: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66 66  tion of the buff
6e10: 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 62  er copied into b
6e20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
6e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
6e40: 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65 33  *exprDup(sqlite3
6e50: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69   *db, Expr *p, i
6e60: 6e 74 20 66 6c 61 67 73 2c 20 75 38 20 2a 2a 70  nt flags, u8 **p
6e70: 7a 42 75 66 66 65 72 29 7b 0a 20 20 45 78 70 72  zBuffer){.  Expr
6e80: 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
6eb0: 75 72 6e 20 2a 2f 0a 20 20 69 66 28 20 70 20 29  urn */.  if( p )
6ec0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
6ed0: 69 73 52 65 64 75 63 65 64 20 3d 20 28 66 6c 61  isReduced = (fla
6ee0: 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43  gs&EXPRDUP_REDUC
6ef0: 45 29 3b 0a 20 20 20 20 75 38 20 2a 7a 41 6c 6c  E);.    u8 *zAll
6f00: 6f 63 3b 0a 20 20 20 20 75 33 32 20 73 74 61 74  oc;.    u32 stat
6f10: 69 63 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20  icFlag = 0;..   
6f20: 20 61 73 73 65 72 74 28 20 70 7a 42 75 66 66 65   assert( pzBuffe
6f30: 72 3d 3d 30 20 7c 7c 20 69 73 52 65 64 75 63 65  r==0 || isReduce
6f40: 64 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  d );..    /* Fig
6f50: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 6f  ure out where to
6f60: 20 77 72 69 74 65 20 74 68 65 20 6e 65 77 20 45   write the new E
6f70: 78 70 72 20 73 74 72 75 63 74 75 72 65 2e 20 2a  xpr structure. *
6f80: 2f 0a 20 20 20 20 69 66 28 20 70 7a 42 75 66 66  /.    if( pzBuff
6f90: 65 72 20 29 7b 0a 20 20 20 20 20 20 7a 41 6c 6c  er ){.      zAll
6fa0: 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65 72 3b 0a  oc = *pzBuffer;.
6fb0: 20 20 20 20 20 20 73 74 61 74 69 63 46 6c 61 67        staticFlag
6fc0: 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20 20   = EP_Static;.  
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
6fe0: 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44  Alloc = sqlite3D
6ff0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 64  bMallocRaw(db, d
7000: 75 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20  upedExprSize(p, 
7010: 66 6c 61 67 73 29 29 3b 0a 20 20 20 20 7d 0a 20  flags));.    }. 
7020: 20 20 20 70 4e 65 77 20 3d 20 28 45 78 70 72 20     pNew = (Expr 
7030: 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69  *)zAlloc;..    i
7040: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
7050: 20 2f 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65   /* Set nNewSize
7060: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c   to the size all
7070: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  ocated for the s
7080: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
7090: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 79 20   to.      ** by 
70a0: 70 4e 65 77 2e 20 54 68 69 73 20 69 73 20 65 69  pNew. This is ei
70b0: 74 68 65 72 20 45 58 50 52 5f 46 55 4c 4c 53 49  ther EXPR_FULLSI
70c0: 5a 45 2c 20 45 58 50 52 5f 52 45 44 55 43 45 44  ZE, EXPR_REDUCED
70d0: 53 49 5a 45 20 6f 72 0a 20 20 20 20 20 20 2a 2a  SIZE or.      **
70e0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
70f0: 49 5a 45 2e 20 6e 54 6f 6b 65 6e 20 69 73 20 73  IZE. nToken is s
7100: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
7110: 20 6f 66 20 62 79 74 65 73 20 63 6f 6e 73 75 6d   of bytes consum
7120: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 74  ed.      ** by t
7130: 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70  he copy of the p
7140: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e  ->u.zToken strin
7150: 67 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20  g (if any)..    
7160: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74    */.      const
7170: 20 75 6e 73 69 67 6e 65 64 20 6e 53 74 72 75 63   unsigned nStruc
7180: 74 53 69 7a 65 20 3d 20 64 75 70 65 64 45 78 70  tSize = dupedExp
7190: 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c 20 66  rStructSize(p, f
71a0: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 63 6f 6e  lags);.      con
71b0: 73 74 20 69 6e 74 20 6e 4e 65 77 53 69 7a 65 20  st int nNewSize 
71c0: 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26 20  = nStructSize & 
71d0: 30 78 66 66 66 3b 0a 20 20 20 20 20 20 69 6e 74  0xfff;.      int
71e0: 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69   nToken;.      i
71f0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7200: 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c  rty(p, EP_IntVal
7210: 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b  ue) && p->u.zTok
7220: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 54  en ){.        nT
7230: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  oken = sqlite3St
7240: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
7250: 65 6e 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7d  en) + 1;.      }
7260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 54  else{.        nT
7270: 6f 6b 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  oken = 0;.      
7280: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 52 65  }.      if( isRe
7290: 64 75 63 65 64 20 29 7b 0a 20 20 20 20 20 20 20  duced ){.       
72a0: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
72b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
72c0: 65 64 75 63 65 64 29 3d 3d 30 20 29 3b 0a 20 20  educed)==0 );.  
72d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 41 6c        memcpy(zAl
72e0: 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69 7a 65  loc, p, nNewSize
72f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 69 7a          int nSiz
7310: 65 20 3d 20 65 78 70 72 53 74 72 75 63 74 53 69  e = exprStructSi
7320: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7330: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
7340: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
7350: 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c 6f 63 5b   memset(&zAlloc[
7360: 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58 50 52 5f  nSize], 0, EXPR_
7370: 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a 65 29 3b  FULLSIZE-nSize);
7380: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7390: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
73a0: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
73b0: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
73c0: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
73d0: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
73e0: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
73f0: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7400: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
7410: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
7420: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
7430: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
7440: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
7450: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
7460: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7470: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7480: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7490: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
74a0: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
74b0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
74c0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
74d0: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
74e0: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
74f0: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7500: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
7510: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
7520: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
7530: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
7540: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
7550: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
7560: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7570: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7580: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7590: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
75a0: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
75b0: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
75c0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
75d0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
75e0: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
75f0: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7600: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
7610: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
7620: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
7630: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
7640: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
7650: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
7660: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7670: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7680: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76a0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
76b0: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
76c0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
76d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
76e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
76f0: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7700: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
7710: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
7720: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
7730: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
7740: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7750: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7760: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7770: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7780: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7790: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
77a0: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
77b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
77c0: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
77d0: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
77e0: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
77f0: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7810: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7820: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7830: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7860: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7870: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7880: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7890: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
78a0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
78b0: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
78c0: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
78d0: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
78e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
78f0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7910: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7920: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7930: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7940: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7950: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7960: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7970: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7980: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7990: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
79a0: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
79b0: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
79c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
79d0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
79e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79f0: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7a00: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7a10: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7a20: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7a30: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7a40: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7a50: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7a60: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7a70: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7a80: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7a90: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7aa0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7ab0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7ac0: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7ad0: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7af0: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7b00: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7b10: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7b20: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7b30: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7b50: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7b60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7b70: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7b80: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7b90: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7ba0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7bb0: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7bc0: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7bd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7be0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7bf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7c00: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7c10: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7c20: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7c30: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7c40: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7c50: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7c60: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7c70: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7c80: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7c90: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7ca0: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7cb0: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7cc0: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7cd0: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7ce0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7cf0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7d00: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7d10: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7d20: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7d30: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7d40: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7d50: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7d60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
7d70: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
7d80: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
7d90: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
7da0: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
7db0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
7dc0: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
7dd0: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
7de0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
7df0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
7e00: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
7e10: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
7e20: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
7e30: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
7e40: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
7e50: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
7e60: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
7e70: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
7e80: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
7e90: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
7ea0: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
7eb0: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
7ec0: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
7ed0: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
7ee0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
7ef0: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
7f00: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
7f10: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
7f20: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
7f30: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
7f40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
7f50: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
7f60: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
7f70: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
7f80: 72 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70  rn exprDup(db, p
7f90: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45  , flags, 0);.}.E
7fa0: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
7fb0: 45 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69  ExprListDup(sqli
7fc0: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73  te3 *db, ExprLis
7fd0: 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29  t *p, int flags)
7fe0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
7ff0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
8000: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8010: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
8020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
8030: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8040: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8050: 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69  MallocRaw(db, si
8060: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
8070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
8080: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
8090: 3e 6e 45 78 70 72 20 3d 20 69 20 3d 20 70 2d 3e  >nExpr = i = p->
80a0: 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 28 66 6c  nExpr;.  if( (fl
80b0: 61 67 73 20 26 20 45 58 50 52 44 55 50 5f 52 45  ags & EXPRDUP_RE
80c0: 44 55 43 45 29 3d 3d 30 20 29 20 66 6f 72 28 69  DUCE)==0 ) for(i
80d0: 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =1; i<p->nExpr; 
80e0: 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e  i+=i){}.  pNew->
80f0: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
8100: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
8110: 62 2c 20 20 69 2a 73 69 7a 65 6f 66 28 70 2d 3e  b,  i*sizeof(p->
8120: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
8130: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
8140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8150: 20 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75   pNew);.    retu
8160: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
8170: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
8180: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
8190: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
81a0: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
81b0: 20 20 20 20 45 78 70 72 20 2a 70 4f 6c 64 45 78      Expr *pOldEx
81c0: 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70  pr = pOldItem->p
81d0: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
81e0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
81f0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c 64  ExprDup(db, pOld
8200: 45 78 70 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Expr, flags);.  
8210: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
8220: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8230: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8240: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
8250: 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
8260: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 4f  3DbStrDup(db, pO
8270: 6c 64 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a  ldItem->zSpan);.
8280: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
8290: 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rder = pOldItem-
82a0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
82b0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
82c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 62 53 70 61  .    pItem->bSpa
82d0: 6e 49 73 54 61 62 20 3d 20 70 4f 6c 64 49 74 65  nIsTab = pOldIte
82e0: 6d 2d 3e 62 53 70 61 6e 49 73 54 61 62 3b 0a 20  m->bSpanIsTab;. 
82f0: 20 20 20 70 49 74 65 6d 2d 3e 75 20 3d 20 70 4f     pItem->u = pO
8300: 6c 64 49 74 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20  ldItem->u;.  }. 
8310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8320: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72 73 6f 72  ./*.** If cursor
8330: 73 2c 20 74 72 69 67 67 65 72 73 2c 20 76 69 65  s, triggers, vie
8340: 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
8350: 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69 74 74 65  s are all omitte
8360: 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 62 75  d from.** the bu
8370: 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e 65 20 6f  ild, then none o
8380: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8390: 72 6f 75 74 69 6e 65 73 2c 20 65 78 63 65 70 74  routines, except
83a0: 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69 74 65 33   for .** sqlite3
83b0: 53 65 6c 65 63 74 44 75 70 28 29 2c 20 63 61 6e  SelectDup(), can
83c0: 20 62 65 20 63 61 6c 6c 65 64 2e 20 73 71 6c 69   be called. sqli
83d0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 20 69  te3SelectDup() i
83e0: 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 63  s sometimes.** c
83f0: 61 6c 6c 65 64 20 77 69 74 68 20 61 20 4e 55 4c  alled with a NUL
8400: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  L argument..*/.#
8410: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8420: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
8430: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8440: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 5c  _OMIT_TRIGGER) \
8450: 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  . || !defined(SQ
8460: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
8470: 52 59 29 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  RY).SrcList *sql
8480: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 73  ite3SrcListDup(s
8490: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
84a0: 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67  ist *p, int flag
84b0: 73 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  s){.  SrcList *p
84c0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
84d0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
84e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
84f0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
8500: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
8510: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
8520: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
8530: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
8540: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8550: 6f 63 52 61 77 28 64 62 2c 20 6e 42 79 74 65 20  ocRaw(db, nByte 
8560: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8570: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8580: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
8590: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
85a0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
85b0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
85c0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
85d0: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
85e0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
85f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8600: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8610: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8620: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8630: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8640: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8650: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
8660: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
8670: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
8680: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8690: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
86a0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
86b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
86c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
86d0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
86e0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
86f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8700: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8710: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8720: 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  wItem->jointype 
8730: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e  = pOldItem->join
8740: 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49 74  type;.    pNewIt
8750: 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f  em->iCursor = pO
8760: 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ldItem->iCursor;
8770: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61  .    pNewItem->a
8780: 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c  ddrFillSub = pOl
8790: 64 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  dItem->addrFillS
87a0: 75 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ub;.    pNewItem
87b0: 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f  ->regReturn = pO
87c0: 6c 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72  ldItem->regRetur
87d0: 6e 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  n;.    pNewItem-
87e0: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  >isCorrelated = 
87f0: 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 43 6f 72 72  pOldItem->isCorr
8800: 65 6c 61 74 65 64 3b 0a 20 20 20 20 70 4e 65 77  elated;.    pNew
8810: 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69  Item->viaCorouti
8820: 6e 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 76  ne = pOldItem->v
8830: 69 61 43 6f 72 6f 75 74 69 6e 65 3b 0a 20 20 20  iaCoroutine;.   
8840: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 52 65 63   pNewItem->isRec
8850: 75 72 73 69 76 65 20 3d 20 70 4f 6c 64 49 74 65  ursive = pOldIte
8860: 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3b 0a  m->isRecursive;.
8870: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 49      pNewItem->zI
8880: 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
8890: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
88a0: 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
88b0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6e 6f 74 49    pNewItem->notI
88c0: 6e 64 65 78 65 64 20 3d 20 70 4f 6c 64 49 74 65  ndexed = pOldIte
88d0: 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3b 0a 20  m->notIndexed;. 
88e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 6e     pNewItem->pIn
88f0: 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  dex = pOldItem->
8900: 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 54 61 62  pIndex;.    pTab
8910: 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61   = pNewItem->pTa
8920: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 54  b = pOldItem->pT
8930: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
8940: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
8950: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
8960: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c    pNewItem->pSel
8970: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
8980: 65 63 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  ectDup(db, pOldI
8990: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 66 6c  tem->pSelect, fl
89a0: 61 67 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ags);.    pNewIt
89b0: 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65  em->pOn = sqlite
89c0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 6c  3ExprDup(db, pOl
89d0: 64 49 74 65 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67  dItem->pOn, flag
89e0: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
89f0: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
8a00: 65 33 49 64 4c 69 73 74 44 75 70 28 64 62 2c 20  e3IdListDup(db, 
8a10: 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pOldItem->pUsing
8a20: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
8a30: 3e 63 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49  >colUsed = pOldI
8a40: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20  tem->colUsed;.  
8a50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
8a60: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
8a70: 65 33 49 64 4c 69 73 74 44 75 70 28 73 71 6c 69  e3IdListDup(sqli
8a80: 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
8a90: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
8aa0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
8ab0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8ac0: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8ad0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8ae0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8af0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
8b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8b10: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
8b20: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
8b30: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8b40: 63 52 61 77 28 64 62 2c 20 70 2d 3e 6e 49 64 2a  cRaw(db, p->nId*
8b50: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
8b60: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
8b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
8b90: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
8ba0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20  ;.  }.  /* Note 
8bb0: 74 68 61 74 20 62 65 63 61 75 73 65 20 74 68 65  that because the
8bc0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c   size of the all
8bd0: 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61  ocation for p->a
8be0: 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e  [] is not.  ** n
8bf0: 65 63 65 73 73 61 72 69 6c 79 20 61 20 70 6f 77  ecessarily a pow
8c00: 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74  er of two, sqlit
8c10: 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29  e3IdListAppend()
8c20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c   may not be call
8c30: 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ed.  ** on the d
8c40: 75 70 6c 69 63 61 74 65 20 63 72 65 61 74 65 64  uplicate created
8c50: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8c60: 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  n. */.  for(i=0;
8c70: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
8c80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8c90: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8ca0: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8cb0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
8cc0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
8cd0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
8ce0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
8cf0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
8d00: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8d10: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
8d20: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
8d30: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
8d40: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
8d50: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
8d60: 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74  3SelectDup(sqlit
8d70: 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a  e3 *db, Select *
8d80: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
8d90: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a   Select *pNew, *
8da0: 70 50 72 69 6f 72 3b 0a 20 20 69 66 28 20 70 3d  pPrior;.  if( p=
8db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8dc0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
8dd0: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8de0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
8df0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8e00: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  urn 0;.  pNew->p
8e10: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
8e20: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8e30: 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67 73 29  ->pEList, flags)
8e40: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d  ;.  pNew->pSrc =
8e50: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
8e60: 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63 2c 20  up(db, p->pSrc, 
8e70: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
8e80: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
8e90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ea0: 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Where, flags);. 
8eb0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
8ec0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8ed0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47 72 6f  tDup(db, p->pGro
8ee0: 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20  upBy, flags);.  
8ef0: 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20  pNew->pHaving = 
8f00: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8f10: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 66  b, p->pHaving, f
8f20: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8f30: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
8f40: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
8f50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 66 6c   p->pOrderBy, fl
8f60: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70  ags);.  pNew->op
8f70: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77   = p->op;.  pNew
8f80: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
8f90: 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  r = sqlite3Selec
8fa0: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 72 69  tDup(db, p->pPri
8fb0: 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  or, flags);.  if
8fc0: 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f  ( pPrior ) pPrio
8fd0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
8fe0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
8ff0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
9000: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
9010: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  Dup(db, p->pLimi
9020: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
9030: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73 71 6c  w->pOffset = sql
9040: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9050: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c 61 67  p->pOffset, flag
9060: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  s);.  pNew->iLim
9070: 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  it = 0;.  pNew->
9080: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70  iOffset = 0;.  p
9090: 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20  New->selFlags = 
90a0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 7e 53  p->selFlags & ~S
90b0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
90c0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
90d0: 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20  nEphm[0] = -1;. 
90e0: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
90f0: 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[1] = -1;.  p
9100: 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  New->nSelectRow 
9110: 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  = p->nSelectRow;
9120: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d  .  pNew->pWith =
9130: 20 77 69 74 68 44 75 70 28 64 62 2c 20 70 2d 3e   withDup(db, p->
9140: 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  pWith);.  sqlite
9150: 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
9160: 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65  New, p->zSelName
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
9180: 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74  ;.}.#else.Select
9190: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
91a0: 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
91b0: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66  Select *p, int f
91c0: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
91d0: 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   p==0 );.  retur
91e0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  n 0;.}.#endif...
91f0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
9200: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
9210: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
9220: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
9230: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
9240: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
9250: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
9260: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9270: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
9280: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
9290: 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69  occurs, the enti
92a0: 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64  re list is freed
92b0: 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20   and.** NULL is 
92c0: 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f  returned.  If no
92d0: 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  n-NULL is return
92e0: 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  ed, then it is g
92f0: 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61  uaranteed.** tha
9300: 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  t the new entry 
9310: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
9320: 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78   appended..*/.Ex
9330: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
9340: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20  xprListAppend(. 
9350: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9370: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9380: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9390: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
93a0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
93b0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
93c0: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  LL */.  Expr *pE
93d0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
93e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
93f0: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69   be appended. Mi
9400: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
9410: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
9420: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9430: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
9440: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
9450: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
9460: 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  db, sizeof(ExprL
9470: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
9480: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
9490: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
94a0: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
94b0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
94c0: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
94d0: 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b  f(pList->a[0]));
94e0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
94f0: 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d  a==0 ) goto no_m
9500: 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  em;.  }else if( 
9510: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20  (pList->nExpr & 
9520: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  (pList->nExpr-1)
9530: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  )==0 ){.    stru
9540: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9550: 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *a;.    assert(
9560: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20   pList->nExpr>0 
9570: 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74  );.    a = sqlit
9580: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
9590: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
95a0: 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28  >nExpr*2*sizeof(
95b0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
95c0: 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20     if( a==0 ){. 
95d0: 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d       goto no_mem
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
95f0: 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20  t->a = a;.  }.  
9600: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
9610: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29  !=0 );.  if( 1 )
9620: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
9630: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
9640: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9650: 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20  ist->nExpr++];. 
9660: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c     memset(pItem,
9670: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
9680: 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  m));.    pItem->
9690: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
96a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
96b0: 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20  t;..no_mem:     
96c0: 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b  .  /* Avoid leak
96d0: 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  ing memory if ma
96e0: 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e  lloc has failed.
96f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70   */.  sqlite3Exp
9700: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
9710: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  r);.  sqlite3Exp
9720: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
9730: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
9740: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
9750: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9760: 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20  ].zName element 
9770: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9780: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9790: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
97a0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
97b0: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
97c0: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
97d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
97e0: 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  t pName should n
97f0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
9800: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9810: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
9820: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9830: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9840: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9850: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9860: 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50  ListSetName(.  P
9870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9880: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9890: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
98a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
98b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
98c0: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
98d0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f  he span. */.  To
98e0: 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20  ken *pName,     
98f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f        /* Name to
9900: 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69   be added */.  i
9910: 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20  nt dequote      
9920: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
9930: 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65  o cause the name
9940: 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20   to be dequoted 
9950: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9960: 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72  pList!=0 || pPar
9970: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9980: 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  iled!=0 );.  if(
9990: 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74   pList ){.    st
99a0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
99b0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
99c0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
99d0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74  xpr>0 );.    pIt
99e0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
99f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
9a00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
9a10: 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  m->zName==0 );. 
9a20: 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20     pItem->zName 
9a30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9a40: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
9a50: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
9a60: 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75  n);.    if( dequ
9a70: 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e  ote && pItem->zN
9a80: 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71  ame ) sqlite3Deq
9a90: 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  uote(pItem->zNam
9aa0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
9ab0: 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73   Set the ExprLis
9ac0: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d  t.a[].zSpan elem
9ad0: 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ent of the most 
9ae0: 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69  recently added i
9af0: 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78  tem.** on the ex
9b00: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9b10: 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74  *.** pList might
9b20: 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69   be NULL followi
9b30: 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  ng an OOM error.
9b40: 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75    But pSpan shou
9b50: 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e  ld never be.** N
9b60: 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ULL.  If a memor
9b70: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
9b80: 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e  ls, the pParse->
9b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9ba0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e   flag.** is set.
9bb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9bc0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
9bd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9bf0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9c00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9c10: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
9c20: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
9c30: 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a  dd the span. */.
9c40: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61    ExprSpan *pSpa
9c50: 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  n         /* The
9c60: 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65   span to be adde
9c70: 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
9c80: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9c90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  db;.  assert( pL
9ca0: 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ist!=0 || db->ma
9cb0: 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b  llocFailed!=0 );
9cc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
9cd0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9ce0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
9cf0: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
9d00: 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  t->nExpr-1];.   
9d10: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9d20: 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61  nExpr>0 );.    a
9d30: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
9d40: 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d  cFailed || pItem
9d50: 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e  ->pExpr==pSpan->
9d60: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c  pExpr );.    sql
9d70: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9d80: 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20  Item->zSpan);.  
9d90: 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d    pItem->zSpan =
9da0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9db0: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
9dc0: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e  (int)(pSpan->zEn
9e00: 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72  d - pSpan->zStar
9e10: 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t));.  }.}../*.*
9e20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9e30: 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20  ion list pEList 
9e40: 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68  contains more th
9e50: 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e  an iLimit elemen
9e60: 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  ts,.** leave an 
9e70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
9e80: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
9e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ea0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50  CheckLength(.  P
9eb0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
9ec0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9ed0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9ee0: 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74  zObject.){.  int
9ef0: 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   mx = pParse->db
9f00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
9f10: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20  LIMIT_COLUMN];. 
9f20: 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73   testcase( pELis
9f30: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9f40: 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74  pr==mx );.  test
9f50: 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20  case( pEList && 
9f60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d  pEList->nExpr==m
9f70: 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  x+1 );.  if( pEL
9f80: 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
9f90: 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73  Expr>mx ){.    s
9fa0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9fb0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
9fc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c   columns in %s",
9fd0: 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d   zObject);.  }.}
9fe0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
9ff0: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
a000: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
a010: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
a020: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
a030: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
a040: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
a050: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a060: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
a070: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
a080: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
a090: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
a0a0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30   pList->nExpr==0
a0b0: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
a0c0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
a0d0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
a0e0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
a0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a100: 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
a110: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
a120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a130: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
a140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a150: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
a160: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
a170: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
a180: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
a190: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
a1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a1b0: 74 68 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f  the bitwise-OR o
a1c0: 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73  f all Expr.flags
a1d0: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67   fields in the g
a1e0: 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74  iven.** ExprList
a1f0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
a200: 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f  ExprListFlags(co
a210: 6e 73 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  nst ExprList *pL
a220: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
a230: 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66   u32 m = 0;.  if
a240: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
a250: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
a260: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a270: 20 20 20 20 20 6d 20 7c 3d 20 70 4c 69 73 74 2d       m |= pList-
a280: 3e 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61  >a[i].pExpr->fla
a290: 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  gs;.    }.  }.  
a2a0: 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 0a  return m;.}../*.
a2b0: 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
a2c0: 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63 61 6c  s are Walker cal
a2d0: 6c 62 61 63 6b 73 20 75 73 65 64 20 74 6f 20 63  lbacks used to c
a2e0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 73  heck expressions
a2f0: 20 74 6f 0a 2a 2a 20 73 65 65 20 69 66 20 74 68   to.** see if th
a300: 65 79 20 61 72 65 20 22 63 6f 6e 73 74 61 6e 74  ey are "constant
a310: 22 20 66 6f 72 20 73 6f 6d 65 20 64 65 66 69 6e  " for some defin
a320: 69 74 69 6f 6e 20 6f 66 20 63 6f 6e 73 74 61 6e  ition of constan
a330: 74 2e 20 20 54 68 65 0a 2a 2a 20 57 61 6c 6b 65  t.  The.** Walke
a340: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 64 65  r.eCode value de
a350: 74 65 72 6d 69 6e 65 73 20 74 68 65 20 74 79 70  termines the typ
a360: 65 20 6f 66 20 22 63 6f 6e 73 74 61 6e 74 22 20  e of "constant" 
a370: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 0a 2a  we are looking.*
a380: 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  * for..**.** The
a390: 73 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  se callback rout
a3a0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
a3b0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 66   implement the f
a3c0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
a3d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
a3e0: 73 43 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20  sConstant()     
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 61               pWa
a400: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 31 0a 2a  lker->eCode==1.*
a410: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  *     sqlite3Exp
a420: 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
a430: 69 6e 28 29 20 20 20 20 20 20 20 20 20 20 20 70  in()           p
a440: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 32  Walker->eCode==2
a450: 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 45  .**     sqlite3E
a460: 78 70 72 52 65 66 4f 6e 65 54 61 62 6c 65 4f 6e  xprRefOneTableOn
a470: 6c 79 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ly()            
a480: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a490: 3d 33 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  =3.**     sqlite
a4a0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
a4b0: 72 46 75 6e 63 74 69 6f 6e 28 29 20 20 20 20 20  rFunction()     
a4c0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64     pWalker->eCod
a4d0: 65 3d 3d 34 20 6f 72 20 35 0a 2a 2a 0a 2a 2a 20  e==4 or 5.**.** 
a4e0: 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 20 74 68  In all cases, th
a4f0: 65 20 63 61 6c 6c 62 61 63 6b 73 20 73 65 74 20  e callbacks set 
a500: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 3d 30 20 61  Walker.eCode=0 a
a510: 6e 64 20 61 62 6f 72 74 20 69 66 20 74 68 65 20  nd abort if the 
a520: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
a530: 20 66 6f 75 6e 64 20 74 6f 20 6e 6f 74 20 62 65   found to not be
a540: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a   a constant..**.
a550: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
a560: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75  prIsConstantOrFu
a570: 6e 63 74 69 6f 6e 28 29 20 69 73 20 75 73 65 64  nction() is used
a580: 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
a590: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 69  expressions.** i
a5a0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
a5b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
a5c0: 20 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61   Walker.eCode va
a5d0: 6c 75 65 20 69 73 20 35 20 77 68 65 6e 20 70 61  lue is 5 when pa
a5e0: 72 73 69 6e 67 0a 2a 2a 20 61 6e 20 65 78 69 73  rsing.** an exis
a5f0: 74 69 6e 67 20 73 63 68 65 6d 61 20 61 6e 64 20  ting schema and 
a600: 34 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  4 when processin
a610: 67 20 61 20 6e 65 77 20 73 74 61 74 65 6d 65 6e  g a new statemen
a620: 74 2e 20 20 41 20 62 6f 75 6e 64 0a 2a 2a 20 70  t.  A bound.** p
a630: 61 72 61 6d 65 74 65 72 20 72 61 69 73 65 73 20  arameter raises 
a640: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 6e 65 77  an error for new
a650: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 62 75 74   statements, but
a660: 20 69 73 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e   is silently con
a670: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 4e 55 4c  verted.** to NUL
a680: 4c 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 73  L for existing s
a690: 63 68 65 6d 61 73 2e 20 20 54 68 69 73 20 61 6c  chemas.  This al
a6a0: 6c 6f 77 73 20 73 71 6c 69 74 65 5f 6d 61 73 74  lows sqlite_mast
a6b0: 65 72 20 74 61 62 6c 65 73 20 74 68 61 74 20 0a  er tables that .
a6c0: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 6f 75  ** contain a bou
a6d0: 6e 64 20 70 61 72 61 6d 65 74 65 72 20 62 65 63  nd parameter bec
a6e0: 61 75 73 65 20 74 68 65 79 20 77 65 72 65 20 67  ause they were g
a6f0: 65 6e 65 72 61 74 65 64 20 62 79 20 6f 6c 64 65  enerated by olde
a700: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
a710: 20 53 51 4c 69 74 65 20 74 6f 20 62 65 20 70 61   SQLite to be pa
a720: 72 73 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  rsed by newer ve
a730: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
a740: 20 77 69 74 68 6f 75 74 20 72 61 69 73 69 6e 67   without raising
a750: 20 61 0a 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20   a.** malformed 
a760: 73 63 68 65 6d 61 20 65 72 72 6f 72 2e 0a 2a 2f  schema error..*/
a770: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
a780: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57  NodeIsConstant(W
a790: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
a7a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 0a 20  Expr *pExpr){.. 
a7b0: 20 2f 2a 20 49 66 20 70 57 61 6c 6b 65 72 2d 3e   /* If pWalker->
a7c0: 65 43 6f 64 65 20 69 73 20 32 20 74 68 65 6e 20  eCode is 2 then 
a7d0: 61 6e 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  any term of the 
a7e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
a7f0: 63 6f 6d 65 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  comes from.  ** 
a800: 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  the ON or USING 
a810: 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6c 65 66  clauses of a lef
a820: 74 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66  t join disqualif
a830: 69 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69  ies the expressi
a840: 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69  on.  ** from bei
a850: 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  ng considered co
a860: 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  nstant. */.  if(
a870: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
a880: 3d 32 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =2 && ExprHasPro
a890: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a8a0: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
a8b0: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
a8c0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
a8d0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
a8e0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
a8f0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
a900: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
a910: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
a920: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
a930: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
a940: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
a950: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 65  ither pWalker->e
a960: 43 6f 64 65 3d 3d 34 20 6f 72 20 35 20 6f 72 20  Code==4 or 5 or 
a970: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  the function has
a980: 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 49   the.    ** SQLI
a990: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 20 66 6c  TE_FUNC_CONST fl
a9a0: 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ag. */.    case 
a9b0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  TK_FUNCTION:.   
a9c0: 20 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e     if( pWalker->
a9d0: 65 43 6f 64 65 3e 3d 34 20 7c 7c 20 45 78 70 72  eCode>=4 || Expr
a9e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
a9f0: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 20  r,EP_ConstFunc) 
aa00: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
aa10: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aa20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa30: 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43       pWalker->eC
aa40: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
aa50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
aa60: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63  t;.      }.    c
aa70: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
aa80: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
aa90: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
aaa0: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73  UNCTION:.    cas
aab0: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
aac0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aad0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
aae0: 44 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  D );.      testc
aaf0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
ab00: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  TK_COLUMN );.   
ab10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
ab20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
ab30: 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 20  UNCTION );.     
ab40: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
ab50: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
ab60: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  UMN );.      if(
ab70: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d   pWalker->eCode=
ab80: 3d 33 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  =3 && pExpr->iTa
ab90: 62 6c 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 75 2e  ble==pWalker->u.
aba0: 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iCur ){.        
abb0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
abc0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
abd0: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
abe0: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
abf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ac00: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
ac10: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
ac20: 41 42 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  ABLE:.      if( 
ac30: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
ac40: 35 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  5 ){.        /* 
ac50: 53 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74  Silently convert
ac60: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
ac70: 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
ac80: 73 69 64 65 20 6f 66 20 43 52 45 41 54 45 0a 20  side of CREATE. 
ac90: 20 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d         ** statem
aca0: 65 6e 74 73 20 69 6e 74 6f 20 61 20 4e 55 4c 4c  ents into a NULL
acb0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 74 68   when parsing th
acc0: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
acd0: 6e 74 20 74 65 78 74 20 6f 75 74 0a 20 20 20 20  nt text out.    
ace0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 71      ** of the sq
acf0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
ad00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78  e */.        pEx
ad10: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
ad20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ad30: 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65  ( pWalker->eCode
ad40: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==4 ){.        /
ad50: 2a 20 41 20 62 6f 75 6e 64 20 70 61 72 61 6d 65  * A bound parame
ad60: 74 65 72 20 69 6e 20 61 20 43 52 45 41 54 45 20  ter in a CREATE 
ad70: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 6f  statement that o
ad80: 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 0a 20  riginates from. 
ad90: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
ada0: 33 5f 70 72 65 70 61 72 65 28 29 20 63 61 75 73  3_prepare() caus
adb0: 65 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  es an error */. 
adc0: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
add0: 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  eCode = 0;.     
ade0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
adf0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
ae00: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
ae10: 67 68 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c  gh */.    defaul
ae20: 74 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t:.      testcas
ae30: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
ae40: 5f 53 45 4c 45 43 54 20 29 3b 20 2f 2a 20 73 65  _SELECT ); /* se
ae50: 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61  lectNodeIsConsta
ae60: 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77  nt will disallow
ae70: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
ae80: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
ae90: 4b 5f 45 58 49 53 54 53 20 29 3b 20 2f 2a 20 73  K_EXISTS ); /* s
aea0: 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74  electNodeIsConst
aeb0: 61 6e 74 20 77 69 6c 6c 20 64 69 73 61 6c 6c 6f  ant will disallo
aec0: 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
aed0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
aee0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74    }.}.static int
aef0: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
af00: 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57  stant(Walker *pW
af10: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 4e  alker, Select *N
af20: 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45  otUsed){.  UNUSE
af30: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
af40: 73 65 64 29 3b 0a 20 20 70 57 61 6c 6b 65 72 2d  sed);.  pWalker-
af50: 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 72 65  >eCode = 0;.  re
af60: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
af70: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  }.static int exp
af80: 72 49 73 43 6f 6e 73 74 28 45 78 70 72 20 2a 70  rIsConst(Expr *p
af90: 2c 20 69 6e 74 20 69 6e 69 74 46 6c 61 67 2c 20  , int initFlag, 
afa0: 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 57 61 6c  int iCur){.  Wal
afb0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
afc0: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
afd0: 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 69  );.  w.eCode = i
afe0: 6e 69 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78  nitFlag;.  w.xEx
aff0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
b000: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b  rNodeIsConstant;
b010: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
b020: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64  back = selectNod
b030: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
b040: 2e 75 2e 69 43 75 72 20 3d 20 69 43 75 72 3b 0a  .u.iCur = iCur;.
b050: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
b060: 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
b070: 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
b080: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
b090: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
b0a0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69  eturn non-zero i
b0b0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b0c0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
b0d0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
b0e0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
b0f0: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
b100: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
b110: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
b120: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
b130: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
b140: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
b150: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
b160: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
b170: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
b180: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
b190: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
b1a0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
b1b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
b1c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
b1d0: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
b1e0: 2c 20 31 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 1, 0);.}../*.*
b1f0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b200: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b210: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b230: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 61   constant.** tha
b240: 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69 67 69 6e  t does no origin
b250: 61 74 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ate from the ON 
b260: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
b270: 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 20 52   of a join..** R
b280: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 6e  eturn 0 if it in
b290: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
b2a0: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
b2b0: 6c 73 20 6f 72 20 74 65 72 6d 73 20 66 72 6f 6d  ls or terms from
b2c0: 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20 55 53 49  .** an ON or USI
b2d0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 69 6e  NG clause..*/.in
b2e0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
b2f0: 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 45  onstantNotJoin(E
b300: 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  xpr *p){.  retur
b310: 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c  n exprIsConst(p,
b320: 20 32 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   2, 0);.}../*.**
b330: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
b340: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
b350: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
b360: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  e expression con
b370: 73 74 61 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79  stant.** for any
b380: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
b390: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
b3a0: 72 73 6f 72 20 69 43 75 72 2e 20 20 49 6e 20 6f  rsor iCur.  In o
b3b0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 0a  ther words, the.
b3c0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  ** expression mu
b3d0: 73 74 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  st not refer to 
b3e0: 61 6e 79 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  any non-determin
b3f0: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e  istic function n
b400: 6f 72 20 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20  or any.** table 
b410: 6f 74 68 65 72 20 74 68 61 6e 20 69 43 75 72 2e  other than iCur.
b420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b430: 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
b440: 6e 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  nt(Expr *p, int 
b450: 69 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  iCur){.  return 
b460: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 33  exprIsConst(p, 3
b470: 2c 20 69 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iCur);.}../*.*
b480: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
b490: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
b4a0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  rn non-zero if t
b4b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b4c0: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20   constant.** or 
b4d0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  a function call 
b4e0: 77 69 74 68 20 63 6f 6e 73 74 61 6e 74 20 61 72  with constant ar
b4f0: 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e  guments.  Return
b500: 20 61 6e 64 20 30 20 69 66 20 74 68 65 72 65 0a   and 0 if there.
b510: 2a 2a 20 61 72 65 20 61 6e 79 20 76 61 72 69 61  ** are any varia
b520: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
b530: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
b540: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
b550: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
b560: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
b570: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
b580: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
b590: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
b5a0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
b5b0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
b5c0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
b5d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
b5e0: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78  antOrFunction(Ex
b5f0: 70 72 20 2a 70 2c 20 75 38 20 69 73 49 6e 69 74  pr *p, u8 isInit
b600: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 49  ){.  assert( isI
b610: 6e 69 74 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74  nit==0 || isInit
b620: 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
b630: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 34  exprIsConst(p, 4
b640: 2b 69 73 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a  +isInit, 0);.}..
b650: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
b660: 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20  ression p codes 
b670: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
b680: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
b690: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
b6a0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
b6b0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
b6c0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
b6d0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
b6e0: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
b6f0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b700: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
b710: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
b720: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
b730: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
b740: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
b750: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
b760: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
b770: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
b780: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
b790: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
b7a0: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63  Value){.  int rc
b7b0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
b7c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
b7d0: 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72  an integer liter
b7e0: 61 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20  al that fits in 
b7f0: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a  a signed 32-bit.
b800: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68    ** integer, th
b810: 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c  en the EP_IntVal
b820: 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76  ue flag will hav
b830: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
b840: 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  et */.  assert( 
b850: 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  p->op!=TK_INTEGE
b860: 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26  R || (p->flags &
b870: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30   EP_IntValue)!=0
b880: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
b890: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
b8a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29  ->u.zToken, &rc)
b8b0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
b8c0: 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56  >flags & EP_IntV
b8d0: 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61  alue ){.    *pVa
b8e0: 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75  lue = p->u.iValu
b8f0: 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e;.    return 1;
b900: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
b910: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b920: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
b930: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45     rc = sqlite3E
b940: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
b950: 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a  pLeft, pValue);.
b960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b970: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
b980: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  MINUS: {.      i
b990: 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20  nt v;.      if( 
b9a0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
b9b0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26  eger(p->pLeft, &
b9c0: 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  v) ){.        as
b9d0: 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34  sert( v!=(-21474
b9e0: 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20  83647-1) );.    
b9f0: 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76      *pValue = -v
ba00: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
ba10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ba20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ba30: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
ba40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ba50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ba60: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65  n FALSE if there
ba70: 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
ba80: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
ba90: 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a  n can be NULL..*
baa0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
bab0: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20  ession might be 
bac0: 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65  NULL or if the e
bad0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f  xpression is too
bae0: 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74   complex.** to t
baf0: 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e  ell return TRUE.
bb00: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
bb10: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73  utine is used as
bb20: 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
bb30: 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e  , to skip OP_IsN
bb40: 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77  ull opcodes.** w
bb50: 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  hen we know that
bb60: 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20   a value cannot 
bb70: 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c  be NULL.  Hence,
bb80: 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
bb90: 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  e.** (returning 
bba0: 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63  TRUE when in fac
bbb0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
bbc0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55   can never be NU
bbd0: 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  LL) might.** be 
bbe0: 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61  a small performa
bbf0: 6e 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f  nce hit but is o
bc00: 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73  therwise harmles
bc10: 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  s.  On the other
bc20: 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73  .** hand, a fals
bc30: 65 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75  e negative (retu
bc40: 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e  rning FALSE when
bc50: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c   the result coul
bc60: 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69  d be NULL).** wi
bc70: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
bc80: 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74   in an incorrect
bc90: 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65   answer.  So whe
bca0: 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75  n in doubt, retu
bcb0: 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69  rn.** TRUE..*/.i
bcc0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  nt sqlite3ExprCa
bcd0: 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78  nBeNull(const Ex
bce0: 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b  pr *p){.  u8 op;
bcf0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d  .  while( p->op=
bd00: 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e  =TK_UPLUS || p->
bd10: 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b  op==TK_UMINUS ){
bd20: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d   p = p->pLeft; }
bd30: 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  .  op = p->op;. 
bd40: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49   if( op==TK_REGI
bd50: 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f  STER ) op = p->o
bd60: 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p2;.  switch( op
bd70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bd80: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
bd90: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20  e TK_STRING:.   
bda0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
bdb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
bdc0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
bdd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  ;.    case TK_CO
bde0: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  LUMN:.      asse
bdf0: 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29  rt( p->pTab!=0 )
be00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 45  ;.      return E
be10: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
be20: 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 20  , EP_CanBeNull) 
be30: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
be40: 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  (p->iColumn>=0 &
be50: 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  & p->pTab->aCol[
be60: 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  p->iColumn].notN
be70: 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64 65 66  ull==0);.    def
be80: 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
be90: 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
bea0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
beb0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
bec0: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73  ession is a cons
bed0: 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64  tant which would
bee0: 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64   be.** unchanged
bef0: 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20   by OP_Affinity 
bf00: 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74  with the affinit
bf10: 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  y given in the s
bf20: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
bf30: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
bf40: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
bf50: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
bf60: 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70  e OP_Affinity op
bf70: 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  eration.** can b
bf80: 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e  e omitted.  When
bf90: 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e   in doubt return
bfa0: 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65   FALSE.  A false
bfb0: 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20   negative.** is 
bfc0: 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c  harmless.  A fal
bfd0: 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77  se positive, how
bfe0: 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74  ever, can result
bff0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a   in the wrong.**
c000: 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20   answer..*/.int 
c010: 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73  sqlite3ExprNeeds
c020: 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  NoAffinityChange
c030: 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20  (const Expr *p, 
c040: 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20  char aff){.  u8 
c050: 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53  op;.  if( aff==S
c060: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
c070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69   return 1;.  whi
c080: 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50  le( p->op==TK_UP
c090: 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  LUS || p->op==TK
c0a0: 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70  _UMINUS ){ p = p
c0b0: 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20  ->pLeft; }.  op 
c0c0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  = p->op;.  if( o
c0d0: 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29  p==TK_REGISTER )
c0e0: 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20   op = p->op2;.  
c0f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
c100: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
c110: 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R: {.      retur
c120: 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  n aff==SQLITE_AF
c130: 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66  F_INTEGER || aff
c140: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
c150: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
c160: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
c170: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
c180: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
c190: 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  AL || aff==SQLIT
c1a0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
c1b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c1c0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
c1d0: 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c   return aff==SQL
c1e0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
c1f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c200: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65  BLOB: {.      re
c210: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
c220: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
c230: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
c240: 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29  ( p->iTable>=0 )
c250: 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62  ;  /* p cannot b
c260: 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43  e part of a CHEC
c270: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  K constraint */.
c280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e        return p->
c290: 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20  iColumn<0.      
c2a0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
c2b0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c2c0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
c2d0: 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20  FF_NUMERIC);.   
c2e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
c2f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c310: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
c320: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
c330: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
c340: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
c350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
c360: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
c370: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
c380: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
c390: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
c3a0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
c3b0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
c3c0: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
c3d0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
c3e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
c3f0: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
c400: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
c410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c420: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
c430: 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70  ble to the IN op
c440: 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74  erator optimizat
c450: 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72  ion on a.** quer
c460: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  y of the form.**
c470: 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28  .**       x IN (
c480: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
c490: 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45  * Where the SELE
c4a0: 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20  CT... clause is 
c4b0: 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
c4c0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f  the parameter to
c4d0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
c4e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65  ..**.** The Sele
c4f0: 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  ct object passed
c500: 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20   in has already 
c510: 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65  been preprocesse
c520: 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f  d and no.** erro
c530: 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75  rs have been fou
c540: 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nd..*/.#ifndef S
c550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c560: 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ERY.static int i
c570: 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f  sCandidateForInO
c580: 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  pt(Select *p){. 
c590: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
c5a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
c5b0: 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  st;.  Table *pTa
c5c0: 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
c5d0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
c5f0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
c600: 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a  f IN is SELECT *
c610: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
c620: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
c630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
c640: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
c650: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
c660: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
c670: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
c680: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
c690: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
c6a0: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
c6b0: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
c6c0: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
c6d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c6e0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
c6f0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
c700: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
c710: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
c720: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
c730: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
c740: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
c750: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
c760: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
c770: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
c780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
c790: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
c7a0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
c7b0: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
c7c0: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
c7d0: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
c7e0: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
c7f0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
c800: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
c810: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
c820: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
c830: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
c840: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c860: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
c870: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
c880: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
c890: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
c8a0: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
c8b0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
c8c0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
c8d0: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
c8e0: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
c8f0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
c900: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
c910: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
c920: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
c930: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
c940: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
c950: 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62    if( NEVER(pTab
c960: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
c970: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
c980: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20  >pSelect==0 );  
c990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
c9a0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  M clause is not 
c9b0: 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20  a view */.  if( 
c9c0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
c9d0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
c9e0: 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
c9f0: 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20  e not a virtual 
ca00: 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73  table */.  pELis
ca10: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
ca20: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78   if( pEList->nEx
ca30: 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  pr!=1 ) return 0
ca40: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63  ;       /* One c
ca50: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ca60: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28  ult set */.  if(
ca70: 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
ca80: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
ca90: 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  MN ) return 0; /
caa0: 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f  * Result is a co
cab0: 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  lumn */.  return
cac0: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
cad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
cae0: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UERY */../*.** C
caf0: 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69  ode an OP_Once i
cb00: 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61  nstruction and a
cb10: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
cb20: 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75  r its flag. Retu
cb30: 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65  rn the .** addre
cb40: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
cb50: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  struction..*/.in
cb60: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  t sqlite3CodeOnc
cb70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
cb80: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
cb90: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cba0: 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69  rse);      /* Vi
cbb0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
cbc0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72  ing coded */.  r
cbd0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
cbe0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
cbf0: 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  ce, pParse->nOnc
cc00: 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  e++);.}../*.** G
cc10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
cc20: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
cc30: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
cc40: 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
cc50: 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
cc60: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
cc70: 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
cc80: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
cc90: 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
cca0: 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
ccb0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
ccc0: 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
ccd0: 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
cce0: 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
ccf0: 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
cd00: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
cd10: 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
cd20: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
cd30: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
cd40: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
cd50: 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
cd60: 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
cd70: 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
cd80: 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74 65  int j1;.  sqlite
cd90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
cda0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
cdb0: 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20  gHasNull);.  j1 
cdc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
cdd0: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
cde0: 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76  , iCur); VdbeCov
cdf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
ce00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ce10: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72   OP_Column, iCur
ce20: 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29  , 0, regHasNull)
ce30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
ce40: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
ce50: 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20  G_TYPEOFARG);.  
ce60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ce70: 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28  "first_entry_in(
ce80: 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20  %d)", iCur));.  
ce90: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
cea0: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a  ere(v, j1);.}...
ceb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cec0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
ced0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
cee0: 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
cef0: 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e  r with a list (n
cf00: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f  ot a subquery) o
cf10: 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d  n the .** right-
cf20: 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75  hand side.  Retu
cf30: 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20  rn TRUE if that 
cf40: 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74  list is constant
cf50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cf60: 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f  sqlite3InRhsIsCo
cf70: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e  nstant(Expr *pIn
cf80: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b  ){.  Expr *pLHS;
cf90: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
cfa0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
cfb0: 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78  operty(pIn, EP_x
cfc0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70  IsSelect) );.  p
cfd0: 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74  LHS = pIn->pLeft
cfe0: 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d  ;.  pIn->pLeft =
cff0: 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69   0;.  res = sqli
d000: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
d010: 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70  t(pIn);.  pIn->p
d020: 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72  Left = pLHS;.  r
d030: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e  eturn res;.}.#en
d040: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
d050: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
d060: 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   by the implemen
d070: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e  tation of the IN
d080: 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e   (...) operator.
d090: 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d  .** The pX param
d0a0: 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72  eter is the expr
d0b0: 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48  ession on the RH
d0c0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
d0d0: 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d  ator, which.** m
d0e0: 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61  ight be either a
d0f0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
d100: 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65  ions or a subque
d110: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  ry..**.** The jo
d120: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
d130: 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20  e is to find or 
d140: 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20  create a b-tree 
d150: 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a  object that can.
d160: 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65  ** be used eithe
d170: 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65  r to test for me
d180: 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20  mbership in the 
d190: 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74  RHS set or to it
d1a0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a  erate through.**
d1b0: 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
d1c0: 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69  the RHS set, ski
d1d0: 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73  pping duplicates
d1e0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72  ..**.** A cursor
d1f0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
d200: 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  e b-tree object 
d210: 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20  that is the RHS 
d220: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d230: 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54  or.** and pX->iT
d240: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
d250: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
d260: 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
d270: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
d280: 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
d290: 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65  on indicates the
d2a0: 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73   b-tree type, as
d2b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
d2c0: 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44    IN_INDEX_ROWID
d2d0: 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73        - The curs
d2e0: 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  or was opened on
d2f0: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
d300: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
d310: 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68  _INDEX_ASC  - Th
d320: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d330: 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  ned on an ascend
d340: 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20  ing index..**   
d350: 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44  IN_INDEX_INDEX_D
d360: 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72  ESC - The cursor
d370: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
d380: 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65   descending inde
d390: 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  x..**   IN_INDEX
d3a0: 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68  _EPH        - Th
d3b0: 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
d3c0: 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c  ned on a special
d3d0: 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  ly created and.*
d3e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d3f0: 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61            popula
d400: 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61  ted epheremal ta
d410: 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44  ble..**   IN_IND
d420: 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20  EX_NOOP       - 
d430: 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c  No cursor was al
d440: 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e  located.  The IN
d450: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
d460: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70               imp
d480: 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65  lemented as a se
d490: 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72  quence of compar
d4a0: 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  isons..**.** An 
d4b0: 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20  existing b-tree 
d4c0: 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66  might be used if
d4d0: 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73   the RHS express
d4e0: 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70  ion pX is a simp
d4f0: 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73  le.** subquery s
d500: 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  uch as:.**.**   
d510: 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e    SELECT <column
d520: 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a  > FROM <table>.*
d530: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20  *.** If the RHS 
d540: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d550: 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20  or is a list or 
d560: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73  a more complex s
d570: 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  ubquery, then.**
d580: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
d590: 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ble might need t
d5a0: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66  o be generated f
d5b0: 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20  rom the RHS and 
d5c0: 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62  then.** pX->iTab
d5d0: 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  le made to point
d5e0: 20 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61   to the ephemera
d5f0: 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  l table instead 
d600: 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  of an.** existin
d610: 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  g table..**.** T
d620: 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d  he inFlags param
d630: 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69  eter must contai
d640: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  n exactly one of
d650: 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f   the bits.** IN_
d660: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
d670: 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f   or IN_INDEX_LOO
d680: 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63  P.  If inFlags c
d690: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e  ontains.** IN_IN
d6a0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20  DEX_MEMBERSHIP, 
d6b0: 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74  then the generat
d6c0: 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  ed table will be
d6d0: 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66   used for a.** f
d6e0: 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  ast membership t
d6f0: 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49  est.  When the I
d700: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74  N_INDEX_LOOP bit
d710: 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20   is set, the.** 
d720: 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  IN index will be
d730: 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76   used to loop ov
d740: 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
d750: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
d760: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ** IN operator..
d770: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
d780: 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64  DEX_LOOP is used
d790: 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65   (and the b-tree
d7a0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
d7b0: 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f   iterate.** thro
d7c0: 75 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62  ugh the set memb
d7d0: 65 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d  ers) then the b-
d7e0: 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f  tree must not co
d7f0: 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73  ntain duplicates
d800: 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61  ..** An epherema
d810: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  l table must be 
d820: 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20  used unless the 
d830: 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e  selected <column
d840: 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a  > is guaranteed.
d850: 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20  ** to be unique 
d860: 2d 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  - either because
d870: 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45   it is an INTEGE
d880: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  R PRIMARY KEY or
d890: 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49   it.** has a UNI
d8a0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  QUE constraint o
d8b0: 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a  r UNIQUE index..
d8c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e  **.** When IN_IN
d8d0: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69  DEX_MEMBERSHIP i
d8e0: 73 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20  s used (and the 
d8f0: 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75  b-tree will be u
d900: 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74  sed .** for fast
d910: 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
d920: 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65  tests) then an e
d930: 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d  pheremal table m
d940: 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20  ust .** be used 
d950: 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20  unless <column> 
d960: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
d970: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20  IMARY KEY or an 
d980: 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65  index can .** be
d990: 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c   found with <col
d9a0: 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74  umn> as its left
d9b0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  -most column..**
d9c0: 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e  .** If the IN_IN
d9d0: 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20  DEX_NOOP_OK and 
d9e0: 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53  IN_INDEX_MEMBERS
d9f0: 48 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74  HIP are both set
da00: 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52   and.** if the R
da10: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
da20: 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20  rator is a list 
da30: 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29  (not a subquery)
da40: 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
da50: 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69  utine might deci
da60: 64 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67  de that creating
da70: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d   an ephemeral b-
da80: 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73  tree for members
da90: 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69  hip.** testing i
daa0: 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20  s too expensive 
dab0: 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e  and return IN_IN
dac0: 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68  DEX_NOOP.  In th
dad0: 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20  at case, the.** 
dae0: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
daf0: 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74  should implement
db00: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
db10: 20 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63   using a sequenc
db20: 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65  e.** of Eq or Ne
db30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
db40: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ations..**.** Wh
db50: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  en the b-tree is
db60: 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
db70: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73  membership tests
db80: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
db90: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20  nction.** might 
dba0: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65  need to know whe
dbb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
dbc0: 52 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20  RHS side of the 
dbd0: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63  IN operator.** c
dbe0: 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20  ontains a NULL. 
dbf0: 20 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c   If prRhsHasNull
dc00: 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70   is not a NULL p
dc10: 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69  ointer and .** i
dc20: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63  f there is any c
dc30: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
dc40: 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61  ...) might conta
dc50: 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  in a NULL value 
dc60: 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74  at.** runtime, t
dc70: 68 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69  hen a register i
dc80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
dc90: 74 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d  the register num
dca0: 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ber written.** t
dcb0: 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e  o *prRhsHasNull.
dcc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
dcd0: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
dce0: 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61  (...) contains a
dcf0: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20  .** NULL value, 
dd00: 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75  then *prRhsHasNu
dd10: 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ll is left uncha
dd20: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nged..**.** If a
dd30: 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c   register is all
dd40: 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c  ocated and its l
dd50: 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69  ocation stored i
dd60: 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c  n *prRhsHasNull,
dd70: 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
dd80: 75 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73  ue in that regis
dd90: 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ter will be NULL
dda0: 20 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63   if the b-tree c
ddb0: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
ddc0: 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75  ore.** NULL valu
ddd0: 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20  es, and it will 
dde0: 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c  be some non-NULL
ddf0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d   value if the b-
de00: 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  tree contains no
de10: 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  .** NULL values.
de20: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
de30: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
de40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
de50: 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  InIndex(Parse *p
de60: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c  Parse, Expr *pX,
de70: 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e   u32 inFlags, in
de80: 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29  t *prRhsHasNull)
de90: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20  {.  Select *p;  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c            /* SEL
dec0: 45 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74  ECT to the right
ded0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
dee0: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  */.  int eType =
def0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
df00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
df10: 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e  pe of RHS table.
df20: 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20   IN_INDEX_* */. 
df30: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
df40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
df50: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
df60: 20 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c   of the RHS tabl
df70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42  e */.  int mustB
df80: 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20  eUnique;        
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dfa0: 54 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74  True if RHS must
dfb0: 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20   be unique */.  
dfc0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
dfd0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
dfe0: 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c  ;     /* Virtual
dff0: 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63   machine being c
e000: 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  oded */..  asser
e010: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
e020: 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71   );.  mustBeUniq
e030: 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20  ue = (inFlags & 
e040: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d  IN_INDEX_LOOP)!=
e050: 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  0;..  /* Check t
e060: 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73  o see if an exis
e070: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
e080: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
e090: 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20  to.  ** satisfy 
e0a0: 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
e0b0: 20 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74   is preferable t
e0c0: 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e  o generating a n
e0d0: 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72  ew .  ** ephemer
e0e0: 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  al table..  */. 
e0f0: 20 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f   p = (ExprHasPro
e100: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
e110: 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e  Select) ? pX->x.
e120: 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20  pSelect : 0);.  
e130: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
e140: 3d 3d 30 20 26 26 20 69 73 43 61 6e 64 69 64 61  ==0 && isCandida
e150: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 29 7b  teForInOpt(p) ){
e160: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
e170: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
e180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e190: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e1a0: 6f 6e 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  on */.    Table 
e1b0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 2f 2a 20 54 61 62 6c 65 20 3c 74 61 62 6c 65   /* Table <table
e1e0: 3e 2e 20 2a 2f 0a 20 20 20 20 45 78 70 72 20 2a  >. */.    Expr *
e1f0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  pExpr;          
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 3c   /* Expression <
e220: 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69  column> */.    i
e230: 31 36 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  16 iCol;        
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
e260: 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f 6c 75 6d 6e  f column <column
e270: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 44 62  > */.    i16 iDb
e280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 64 78 20  /* Database idx 
e2b0: 66 6f 72 20 70 54 61 62 20 2a 2f 0a 0a 20 20 20  for pTab */..   
e2c0: 20 61 73 73 65 72 74 28 20 70 20 29 3b 20 20 20   assert( p );   
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
e2f0: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
e300: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
e310: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e320: 73 74 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  st!=0 );        
e330: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
e340: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
e350: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
e360: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
e370: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d  st->a[0].pExpr!=
e380: 30 20 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  0 ); /* Because 
e390: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
e3a0: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
e3b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
e3c0: 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  !=0 );          
e3d0: 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
e3e0: 6f 66 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f  of isCandidateFo
e3f0: 72 49 6e 4f 70 74 28 70 29 20 2a 2f 0a 20 20 20  rInOpt(p) */.   
e400: 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
e410: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[0].pTab;.    
e420: 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
e430: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
e440: 20 20 20 69 43 6f 6c 20 3d 20 28 69 31 36 29 70     iCol = (i16)p
e450: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
e460: 20 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61    .    /* Code a
e470: 6e 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  n OP_Transaction
e480: 20 61 6e 64 20 4f 50 5f 54 61 62 6c 65 4c 6f 63   and OP_TableLoc
e490: 6b 20 66 6f 72 20 3c 74 61 62 6c 65 3e 2e 20 2a  k for <table>. *
e4a0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  /.    iDb = sqli
e4b0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e4c0: 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
e4d0: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
e4e0: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
e4f0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
e500: 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
e510: 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
e520: 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
e530: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
e540: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
e550: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
e560: 65 64 20 66 72 6f 6d 20 74 77 6f 20 70 6c 61 63  ed from two plac
e570: 65 73 2e 20 49 6e 20 62 6f 74 68 20 63 61 73 65  es. In both case
e580: 73 20 74 68 65 20 76 64 62 65 0a 20 20 20 20 2a  s the vdbe.    *
e590: 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
e5a0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 20 53 6f  en allocated. So
e5b0: 20 61 73 73 75 6d 65 20 73 71 6c 69 74 65 33 47   assume sqlite3G
e5c0: 65 74 56 64 62 65 28 29 20 69 73 20 61 6c 77 61  etVdbe() is alwa
e5d0: 79 73 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  ys.    ** succes
e5e0: 73 66 75 6c 20 68 65 72 65 2e 0a 20 20 20 20 2a  sful here..    *
e5f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 76 29 3b  /.    assert(v);
e600: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  .    if( iCol<0 
e610: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 41 64  ){.      int iAd
e620: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
e630: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Once(pParse);.  
e640: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e650: 28 76 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  (v);..      sqli
e660: 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
e670: 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
e680: 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
e690: 64 29 3b 0a 20 20 20 20 20 20 65 54 79 70 65 20  d);.      eType 
e6a0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
e6b0: 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
e6c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e6d0: 69 41 64 64 72 29 3b 0a 20 20 20 20 7d 65 6c 73  iAddr);.    }els
e6e0: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
e6f0: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e710: 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
e720: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
e730: 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
e740: 71 75 65 6e 63 65 20 75 73 65 64 20 62 79 20 74  quence used by t
e750: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 49  he comparison. I
e760: 66 20 61 6e 20 69 6e 64 65 78 20 69 73 20 74 6f  f an index is to
e770: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73 65  .      ** be use
e780: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
e790: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 74 20 6d  temp-table, it m
e7a0: 75 73 74 20 62 65 20 6f 72 64 65 72 65 64 20 61  ust be ordered a
e7b0: 63 63 6f 72 64 69 6e 67 0a 20 20 20 20 20 20 2a  ccording.      *
e7c0: 2a 20 74 6f 20 74 68 69 73 20 63 6f 6c 6c 61 74  * to this collat
e7d0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 20 2a  ion sequence.  *
e7e0: 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  /.      CollSeq 
e7f0: 2a 70 52 65 71 20 3d 20 73 71 6c 69 74 65 33 42  *pReq = sqlite3B
e800: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
e810: 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  Seq(pParse, pX->
e820: 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 0a  pLeft, pExpr);..
e830: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
e840: 68 61 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  hat the affinity
e850: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
e860: 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  ed to perform th
e870: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  e .      ** comp
e880: 61 72 69 73 6f 6e 20 69 73 20 74 68 65 20 73 61  arison is the sa
e890: 6d 65 20 61 73 20 74 68 65 20 61 66 66 69 6e 69  me as the affini
e8a0: 74 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ty of the column
e8b0: 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 69 74  . If.      ** it
e8c0: 20 69 73 20 6e 6f 74 2c 20 69 74 20 69 73 20 6e   is not, it is n
e8d0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
e8e0: 73 65 20 61 6e 79 20 69 6e 64 65 78 2e 0a 20 20  se any index..  
e8f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
e900: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 20 3d 20 73   affinity_ok = s
e910: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
e920: 69 74 79 4f 6b 28 70 58 2c 20 70 54 61 62 2d 3e  ityOk(pX, pTab->
e930: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61 66 66 69 6e  aCol[iCol].affin
e940: 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  ity);..      for
e950: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
e960: 65 78 3b 20 70 49 64 78 20 26 26 20 65 54 79 70  ex; pIdx && eTyp
e970: 65 3d 3d 30 20 26 26 20 61 66 66 69 6e 69 74 79  e==0 && affinity
e980: 5f 6f 6b 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  _ok; pIdx=pIdx->
e990: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
e9a0: 69 66 28 20 28 70 49 64 78 2d 3e 61 69 43 6f 6c  if( (pIdx->aiCol
e9b0: 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c 29 0a 20 20  umn[0]==iCol).  
e9c0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e9d0: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
e9e0: 20 45 4e 43 28 64 62 29 2c 20 70 49 64 78 2d 3e   ENC(db), pIdx->
e9f0: 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30 29 3d 3d 70  azColl[0], 0)==p
ea00: 52 65 71 0a 20 20 20 20 20 20 20 20 20 26 26 20  Req.         && 
ea10: 28 21 6d 75 73 74 42 65 55 6e 69 71 75 65 20 7c  (!mustBeUnique |
ea20: 7c 20 28 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  | (pIdx->nKeyCol
ea30: 3d 3d 31 20 26 26 20 49 73 55 6e 69 71 75 65 49  ==1 && IsUniqueI
ea40: 6e 64 65 78 28 70 49 64 78 29 29 29 0a 20 20 20  ndex(pIdx))).   
ea50: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
ea60: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
ea70: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
ea80: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
ea90: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
eaa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eab0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
eac0: 61 64 2c 20 69 54 61 62 2c 20 70 49 64 78 2d 3e  ad, iTab, pIdx->
ead0: 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
eae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
eaf0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
eb00: 61 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 20  arse, pIdx);.   
eb10: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
eb20: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 64  nt((v, "%s", pId
eb30: 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
eb40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49 4e        assert( IN
eb50: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
eb60: 43 20 3d 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  C == IN_INDEX_IN
eb70: 44 45 58 5f 41 53 43 2b 31 20 29 3b 0a 20 20 20  DEX_ASC+1 );.   
eb80: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49         eType = I
eb90: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
eba0: 43 20 2b 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  C + pIdx->aSortO
ebb0: 72 64 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 20 20  rder[0];..      
ebc0: 20 20 20 20 69 66 28 20 70 72 52 68 73 48 61 73      if( prRhsHas
ebd0: 4e 75 6c 6c 20 26 26 20 21 70 54 61 62 2d 3e 61  Null && !pTab->a
ebe0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f 74 4e 75 6c  Col[iCol].notNul
ebf0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
ec00: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d   *prRhsHasNull =
ec10: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
ec20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ec30: 69 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c  ite3SetHasNullFl
ec40: 61 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52  ag(v, iTab, *prR
ec50: 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20  hsHasNull);.    
ec60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ec80: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
ec90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
ecb0: 2f 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73  /* If no preexis
ecc0: 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76  ting index is av
ecd0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
ece0: 49 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61  IN clause.  ** a
ecf0: 6e 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  nd IN_INDEX_NOOP
ed00: 20 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72   is an allowed r
ed10: 65 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  eply.  ** and th
ed20: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
ed30: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69  operator is a li
ed40: 73 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65  st, not a subque
ed50: 72 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ry.  ** and the 
ed60: 52 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  RHS is not conta
ed70: 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72  nt or has two or
ed80: 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20   fewer terms,.  
ed90: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
eda0: 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67  t worth creating
edb0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
edc0: 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ble to evaluate.
edd0: 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72    ** the IN oper
ede0: 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49  ator so return I
edf0: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20  N_INDEX_NOOP..  
ee00: 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
ee10: 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73  0.   && (inFlags
ee20: 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   & IN_INDEX_NOOP
ee30: 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72  _OK).   && !Expr
ee40: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
ee50: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
ee60: 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52   && (!sqlite3InR
ee70: 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29  hsIsConstant(pX)
ee80: 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d   || pX->x.pList-
ee90: 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a  >nExpr<=2).  ){.
eea0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
eeb0: 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20  NDEX_NOOP;.  }. 
eec0: 20 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79 70      ..  if( eTyp
eed0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
eee0: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e  ould not find an
eef0: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
ef00: 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  or index to use 
ef10: 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65  as the RHS b-tre
ef20: 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c  e..    ** We wil
ef30: 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61  l have to genera
ef40: 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
ef50: 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20  table to do the 
ef60: 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  job..    */.    
ef70: 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c  u32 savedNQueryL
ef80: 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
ef90: 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ueryLoop;.    in
efa0: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
efb0: 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   0;.    eType = 
efc0: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
efd0: 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20    if( inFlags & 
efe0: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b  IN_INDEX_LOOP ){
eff0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
f000: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
f010: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
f020: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
f030: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f040: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
f050: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ct) ){.        e
f060: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
f070: 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
f080: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52     }else if( prR
f090: 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
f0a0: 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
f0b0: 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
f0c0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f0d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f0e0: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
f0f0: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
f100: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
f110: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
f120: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
f130: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
f140: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
f150: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
f160: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
f170: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
f180: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f190: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
f1a0: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
f1b0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
f1c0: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
f1d0: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
f1e0: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
f1f0: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
f200: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
f210: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
f220: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
f230: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
f240: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
f250: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
f260: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
f270: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
f280: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
f290: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
f2a0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
f2b0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
f2c0: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
f2d0: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
f2e0: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
f2f0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
f300: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
f310: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
f320: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
f330: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
f340: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
f350: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
f360: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
f370: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
f380: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
f390: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
f3a0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
f3b0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
f3c0: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
f3d0: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
f3e0: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
f3f0: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
f400: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
f410: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
f420: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
f430: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
f440: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
f450: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
f460: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
f470: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
f480: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
f490: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
f4a0: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
f4b0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
f4c0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
f4d0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
f4e0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
f4f0: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
f500: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
f510: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
f520: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
f530: 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68  NULLs..** All th
f540: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
f550: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  is initialize th
f560: 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
f570: 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
f580: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  .** to NULL.  Ca
f590: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
f5a0: 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ill take care of
f5b0: 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
f5c0: 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65  egister.** value
f5d0: 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
f5e0: 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
f5f0: 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  free..**.** For 
f600: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
f610: 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
f620: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
f630: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
f640: 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
f650: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
f660: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
f670: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  rs, the return v
f680: 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69  alue is 0..*/.#i
f690: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f6a0: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
f6b0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
f6c0: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
f6d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
f6e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
f6f0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
f700: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
f710: 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
f720: 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
f730: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48  ator */.  int rH
f740: 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20  asNullFlag,     
f750: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
f760: 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
f770: 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
f780: 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
f790: 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
f7a0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
f7b0: 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
f7c0: 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
f7d0: 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79  ){.  int jmpIfDy
f7e0: 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20  namic = -1;     
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
f810: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
f820: 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f850: 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
f860: 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
f870: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f880: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
f890: 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
f8a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
f8b0: 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
f8c0: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
f8d0: 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
f8e0: 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
f8f0: 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
f900: 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
f910: 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
f920: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
f930: 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
f940: 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
f950: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
f960: 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
f970: 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
f980: 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
f990: 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
f9a0: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
f9b0: 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
f9c0: 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
f9d0: 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
f9e0: 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
f9f0: 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
fa00: 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
fa10: 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
fa20: 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
fa30: 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
fa40: 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
fa50: 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
fa60: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
fa70: 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
fa80: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
fa90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
faa0: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
fab0: 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
fac0: 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
fad0: 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
fae0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
faf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fb00: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
fb10: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
fb20: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
fb30: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
fb40: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
fb50: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
fb60: 45 58 45 43 55 54 45 20 25 73 25 73 20 53 55 42  EXECUTE %s%s SUB
fb70: 51 55 45 52 59 20 25 64 22 2c 20 6a 6d 70 49 66  QUERY %d", jmpIf
fb80: 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43  Dynamic>=0?"":"C
fb90: 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20  ORRELATED ",.   
fba0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
fbb0: 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43  TK_IN?"LIST":"SC
fbc0: 41 4c 41 52 22 2c 20 70 50 61 72 73 65 2d 3e 69  ALAR", pParse->i
fbd0: 4e 65 78 74 53 65 6c 65 63 74 49 64 0a 20 20 20  NextSelectId.   
fbe0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
fbf0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
fc00: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
fc10: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
fc20: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
fc30: 49 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  IC);.  }.#endif.
fc40: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
fc50: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
fc60: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
fc70: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fc90: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 4c  ffinity of the L
fca0: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 2a 2f 0a  HS of the IN */.
fcb0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20        int addr; 
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
fce0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fcf0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a   instruction */.
fd00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
fd10: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
fd20: 3b 20 2f 2a 20 74 68 65 20 4c 48 53 20 6f 66 20  ; /* the LHS of 
fd30: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
fd40: 2a 2f 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  */.      KeyInfo
fd50: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
fd60: 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e 66 6f       /* Key info
fd70: 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  rmation */..    
fd80: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
fd90: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
fda0: 28 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20  (pLeft);..      
fdb0: 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20  /* Whether this 
fdc0: 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45  is an 'x IN(SELE
fdd0: 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78  CT...)' or an 'x
fde0: 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27   IN(<exprlist>)'
fdf0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
fe00: 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c  sion it is handl
fe10: 65 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e  ed the same way.
fe20: 20 20 41 6e 20 65 70 68 65 6d 65 72 61 6c 20 74    An ephemeral t
fe30: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
fe40: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
fe50: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
fe60: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
fe70: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
fe80: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
fe90: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
fea0: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
feb0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
fec0: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
fed0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
fee0: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
fef0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
ff00: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
ff10: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
ff20: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
ff30: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
ff40: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
ff50: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
ff60: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
ff70: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
ff80: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
ff90: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
ffa0: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
ffb0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
ffc0: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
ffd0: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
ffe0: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
fff0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
10000 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
10010 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
10020 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
10030 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
10040 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
10050 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
10060 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
10070 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
10080 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
10090 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
100a0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
100b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
100c0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
100d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 21  pExpr->iTable, !
100e0 69 73 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  isRowid);.      
100f0 70 4b 65 79 49 6e 66 6f 20 3d 20 69 73 52 6f 77  pKeyInfo = isRow
10100 69 64 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  id ? 0 : sqlite3
10110 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
10120 72 73 65 2d 3e 64 62 2c 20 31 2c 20 31 29 3b 0a  rse->db, 1, 1);.
10130 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
10140 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
10150 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
10160 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
10170 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
10180 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
10190 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
101a0 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
101b0 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
101c0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
101d0 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
101e0 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
101f0 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
10200 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
10210 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
10220 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
10230 2a 70 53 65 6c 65 63 74 20 3d 20 70 45 78 70 72  *pSelect = pExpr
10240 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
10250 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
10260 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 45 78  dest;.        Ex
10270 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
10280 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10290 20 21 69 73 52 6f 77 69 64 20 29 3b 0a 20 20 20   !isRowid );.   
102a0 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
102b0 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
102c0 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
102d0 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
102e0 20 20 20 64 65 73 74 2e 61 66 66 53 64 73 74 20     dest.affSdst 
102f0 3d 20 28 75 38 29 61 66 66 69 6e 69 74 79 3b 0a  = (u8)affinity;.
10300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10310 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30  (pExpr->iTable&0
10320 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70  x0000FFFF)==pExp
10330 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
10340 20 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c       pSelect->iL
10350 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
10360 20 20 74 65 73 74 63 61 73 65 28 20 70 53 65 6c    testcase( pSel
10370 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
10380 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
10390 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
103a0 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20   pKeyInfo==0 ); 
103b0 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d  /* Caused by OOM
103c0 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e   in sqlite3KeyIn
103d0 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20  foAlloc() */.   
103e0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
103f0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10400 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29  Select, &dest) )
10410 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10420 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
10430 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pKeyInfo);.     
10440 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10460 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
10470 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
10480 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
10490 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d  nfo!=0 ); /* OOM
104a0 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74   will cause exit
104b0 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65   after sqlite3Se
104c0 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  lect() */.      
104d0 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
104e0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
104f0 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e  ssert( pEList->n
10500 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
10510 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10520 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
10530 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
10540 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
10550 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71  o->aColl[0] = sq
10560 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
10570 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
10580 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a  , pExpr->pLeft,.
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d           pEList-
105d0 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
105e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c      }else if( AL
105f0 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c  WAYS(pExpr->x.pL
10600 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ist!=0) ){.     
10610 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
10620 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
10630 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
10640 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65          ** For e
10650 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
10660 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
10670 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
10680 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
10690 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
106a0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
106b0 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
106c0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
106d0 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
106e0 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
106f0 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
10700 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
10710 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
10720 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
10730 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
10740 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
10750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
10760 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
10770 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
10780 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
10790 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
107a0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
107b0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69  pItem;.        i
107c0 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a  nt r1, r2, r3;..
107d0 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
107e0 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
107f0 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
10800 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
10810 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10820 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
10830 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
10840 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
10850 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
10860 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20  yInfo) );.      
10870 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
10880 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
10890 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
108a0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
108b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
108c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
108d0 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
108e0 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
108f0 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
10900 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
10910 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
10920 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
10930 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
10940 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
10950 69 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71  if( isRowid ) sq
10960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10970 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
10980 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  2);.        for(
10990 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  i=pList->nExpr, 
109a0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
109b0 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
109c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
109d0 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d  pr *pE2 = pItem-
109e0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
109f0 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b    int iValToIns;
10a00 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
10a10 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10a20 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74   is not constant
10a30 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65   then we will ne
10a40 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
10a50 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ** disable the t
10a60 65 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e  est that was gen
10a70 65 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61  erated above tha
10a80 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20  t makes sure.   
10a90 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
10aa0 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65  ode only execute
10ab0 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65  s once.  Because
10ac0 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74   for a non-const
10ad0 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ant.          **
10ae0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e   expression we n
10af0 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69  eed to rerun thi
10b00 73 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65  s code each time
10b10 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
10b20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70           if( jmp
10b30 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20  IfDynamic>=0 && 
10b40 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
10b50 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
10b60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10b70 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
10b80 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  op(v, jmpIfDynam
10b90 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ic);.           
10ba0 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20   jmpIfDynamic = 
10bb0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  -1;.          }.
10bc0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
10bd0 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
10be0 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
10bf0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
10c00 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
10c10 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64       if( isRowid
10c20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
10c30 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69  sInteger(pE2, &i
10c40 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20  ValToIns) ){.   
10c50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10c60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10c70 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70  _InsertInt, pExp
10c80 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69  r->iTable, r2, i
10c90 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20  ValToIns);.     
10ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10cb0 20 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c          r3 = sql
10cc0 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
10cd0 65 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  et(pParse, pE2, 
10ce0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
10cf0 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a   if( isRowid ){.
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
10d10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10d20 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10d30 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20   r3,.           
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10d60 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
10d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
10d80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10da0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10db0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
10dc0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
10dd0 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20  2, r3);.        
10de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10df0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10e00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
10e10 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c  _MakeRecord, r3,
10e20 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74   1, r2, &affinit
10e30 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
10e40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10e50 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
10e60 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20  nge(pParse, r3, 
10e70 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
10e80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10e90 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
10ea0 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ert, pExpr->iTab
10eb0 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  le, r2);.       
10ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10ed0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
10ee0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
10ef0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
10f00 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
10f10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
10f20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
10f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10f40 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
10f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10f60 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
10f70 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b  addr, (void *)pK
10f80 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
10f90 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
10fa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10fb0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
10fc0 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
10fd0 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66  _SELECT:.    def
10fe0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
10ff0 20 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20   If this has to 
11000 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
11010 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
11020 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
11030 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
11040 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
11050 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
11060 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
11070 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
11080 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
11090 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74  n iColumn.  If t
110a0 68 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53  his is an EXISTS
110b0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
110c0 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e   an integer 0 (n
110d0 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20  ot exists) or 1 
110e0 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20  (exists) into a 
110f0 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20  memory cell.    
11100 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20    ** and record 
11110 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
11120 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20   in iColumn..   
11130 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65     */.      Sele
11140 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20  ct *pSel;       
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
11170 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20  ement to encode 
11180 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  */.      SelectD
11190 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20  est dest;       
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
111b0 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69  * How to deal wi
111c0 74 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74  th SELECt result
111d0 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63   */..      testc
111e0 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
111f0 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20  TK_EXISTS );.   
11200 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
11210 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
11220 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
11230 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
11240 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72  _EXISTS || pExpr
11250 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
11260 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  );..      assert
11270 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
11280 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
11290 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
112a0 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e  pSel = pExpr->x.
112b0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73  pSelect;.      s
112c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
112d0 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b  Init(&dest, 0, +
112e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a  +pParse->nMem);.
112f0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
11300 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
11310 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65  {.        dest.e
11320 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a  Dest = SRT_Mem;.
11330 20 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64          dest.iSd
11340 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  st = dest.iSDPar
11350 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  m;.        sqlit
11360 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11370 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74  OP_Null, 0, dest
11380 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  .iSDParm);.     
11390 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
113a0 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72  v, "Init subquer
113b0 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
113c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113d0 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
113e0 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20  RT_Exists;.     
113f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11400 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
11410 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  er, 0, dest.iSDP
11420 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
11430 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
11440 6e 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c  nit EXISTS resul
11450 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t"));.      }.  
11460 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
11470 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
11480 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b  , pSel->pLimit);
11490 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69  .      pSel->pLi
114a0 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mit = sqlite3PEx
114b0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
114c0 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20  TEGER, 0, 0,.   
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
114f0 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
11500 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c  [1]);.      pSel
11510 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
11520 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
11530 67 73 20 26 3d 20 7e 53 46 5f 41 6c 6c 56 61 6c  gs &= ~SF_AllVal
11540 75 65 73 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ues;.      if( s
11550 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
11560 72 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74  rse, pSel, &dest
11570 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
11580 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
11590 20 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74       rReg = dest
115a0 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
115b0 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
115c0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
115d0 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72  educe);.      br
115e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
115f0 20 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c    if( rHasNullFl
11600 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
11610 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28  3SetHasNullFlag(
11620 76 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  v, pExpr->iTable
11630 2c 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b  , rHasNullFlag);
11640 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49  .  }..  if( jmpI
11650 66 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20  fDynamic>=0 ){. 
11660 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11670 6d 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44  mpHere(v, jmpIfD
11680 79 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73  ynamic);.  }.  s
11690 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
116a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  op(pParse);..  r
116b0 65 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65  eturn rReg;.}.#e
116c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
116d0 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
116e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
116f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
11700 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
11710 65 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72  e for an IN expr
11720 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
11730 20 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20     x IN (SELECT 
11740 2e 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49  ...).**      x I
11750 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c  N (value, value,
11760 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
11770 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28  left-hand side (
11780 4c 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72  LHS) is a scalar
11790 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
117a0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
117b0 65 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e  e (RHS).** is an
117c0 20 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f   array of zero o
117d0 72 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20  r more values.  
117e0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
117f0 73 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48  s true if the LH
11800 53 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  S is.** containe
11810 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
11820 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  .  The value of 
11830 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
11840 73 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29  s unknown (NULL)
11850 0a 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69  .** if the LHS i
11860 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  s NULL or if the
11870 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74   LHS is not cont
11880 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
11890 20 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20   RHS and the.** 
118a0 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  RHS contains one
118b0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
118c0 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lues..**.** This
118d0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
118e0 65 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d  es code that jum
118f0 70 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73  ps to destIfFals
11900 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  e if the LHS is 
11910 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65  not .** containe
11920 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
11930 2e 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c  .  If due to NUL
11940 4c 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74  Ls we cannot det
11950 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48  ermine if the LH
11960 53 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65  S.** is containe
11970 64 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  d in the RHS the
11980 6e 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66  n jump to destIf
11990 4e 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48  Null.  If the LH
119a0 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  S is contained.*
119b0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  * within the RHS
119c0 20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75   then fall throu
119d0 67 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gh..*/.static vo
119e0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
119f0 64 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70  deIN(.  Parse *p
11a00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
11a10 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
11a20 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
11a30 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
11a40 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
11a50 2f 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73  /* The IN expres
11a60 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sion */.  int de
11a70 73 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20  stIfFalse,      
11a80 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
11a90 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
11aa0 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20  ined in the RHS 
11ab0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e  */.  int destIfN
11ac0 75 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ull        /* Ju
11ad0 6d 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72  mp here if the r
11ae0 65 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f  esults are unkno
11af0 77 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20  wn due to NULLs 
11b00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73  */.){.  int rRhs
11b10 48 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a  HasNull = 0;  /*
11b20 20 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69   Register that i
11b30 73 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f  s true if RHS co
11b40 6e 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75  ntains NULL valu
11b50 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66  es */.  char aff
11b60 69 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a  inity;        /*
11b70 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69   Comparison affi
11b80 6e 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20  nity to use */. 
11b90 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20   int eType;     
11ba0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
11bb0 66 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69  f the RHS */.  i
11bc0 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20  nt r1;          
11bd0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
11be0 79 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a  y use register *
11bf0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
11c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
11c10 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
11c20 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
11c30 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52  /* Compute the R
11c40 48 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73  HS.   After this
11c50 20 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65   step, the table
11c60 20 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a   with cursor.  *
11c70 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
11c80 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68  will contains th
11c90 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
11ca0 6b 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20  ke up the RHS.. 
11cb0 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
11cc0 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
11cd0 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20  t( v!=0 );      
11ce0 20 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64   /* OOM detected
11cf0 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72   prior to this r
11d00 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65  outine */.  Vdbe
11d10 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
11d20 22 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29  "begin IN expr")
11d30 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c  );.  eType = sql
11d40 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28  ite3FindInIndex(
11d50 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20  pParse, pExpr,. 
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49              IN_I
11d80 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
11d90 7c 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f  | IN_INDEX_NOOP_
11da0 4f 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK,.            
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65   destIfFalse==de
11dd0 73 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26  stIfNull ? 0 : &
11de0 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20  rRhsHasNull);.. 
11df0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
11e00 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75  he affinity to u
11e10 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b  se to create a k
11e20 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ey from the resu
11e30 6c 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  lts.  ** of the 
11e40 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
11e50 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
11e60 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
11e70 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a  uitable for.  **
11e80 20 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P4 of OP_MakeRe
11e90 63 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66  cord..  */.  aff
11ea0 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73  inity = comparis
11eb0 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
11ec0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68  );..  /* Code th
11ed0 65 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72  e LHS, the <expr
11ee0 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
11ef0 4e 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20  N (...)"..  */. 
11f00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
11f10 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
11f20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
11f30 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
11f40 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
11f50 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
11f60 2d 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20  ->pLeft, r1);.. 
11f70 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69   /* If sqlite3Fi
11f80 6e 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20  ndInIndex() did 
11f90 6e 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61  not find or crea
11fa0 74 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74  te an index that
11fb0 20 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c   is.  ** suitabl
11fc0 65 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67  e for evaluating
11fd0 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
11fe0 2c 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  , then evaluate 
11ff0 75 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71  using a.  ** seq
12000 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
12010 73 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sons..  */.  if(
12020 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58   eType==IN_INDEX
12030 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70  _NOOP ){.    Exp
12040 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
12050 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
12060 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
12070 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
12080 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
12090 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
120a0 20 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20    int labelOk = 
120b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
120c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74  abel(v);.    int
120d0 20 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a   r2, regToFree;.
120e0 20 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c      int regCkNul
120f0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  l = 0;.    int i
12100 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  i;.    assert( !
12110 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
12120 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
12130 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
12140 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74  destIfNull!=dest
12150 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20  IfFalse ){.     
12160 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c   regCkNull = sql
12170 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
12180 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
12190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
121a0 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31  v, OP_BitAnd, r1
121b0 2c 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  , r1, regCkNull)
121c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
121d0 69 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e  ii=0; ii<pList->
121e0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
121f0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
12200 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
12210 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69  rse, pList->a[ii
12220 5d 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46  ].pExpr, &regToF
12230 72 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ree);.      if( 
12240 72 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c  regCkNull && sql
12250 69 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c  ite3ExprCanBeNul
12260 6c 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70  l(pList->a[ii].p
12270 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
12280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12290 70 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c  p3(v, OP_BitAnd,
122a0 20 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20   regCkNull, r2, 
122b0 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20  regCkNull);.    
122c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69    }.      if( ii
122d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20  <pList->nExpr-1 
122e0 7c 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64  || destIfNull!=d
122f0 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
12300 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12310 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71  eAddOp4(v, OP_Eq
12320 2c 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72  , r1, labelOk, r
12330 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
12350 69 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  id*)pColl, P4_CO
12360 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20  LLSEQ);.        
12370 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
12380 2c 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  , ii<pList->nExp
12390 72 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  r-1);.        Vd
123a0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
123b0 69 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ii==pList->nExpr
123c0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  -1);.        sql
123d0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
123e0 28 76 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20  (v, affinity);. 
123f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12400 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74      assert( dest
12410 49 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61  IfNull==destIfFa
12420 6c 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  lse );.        s
12430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12440 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64  (v, OP_Ne, r1, d
12450 65 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a  estIfFalse, r2,.
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
12480 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
12490 45 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  EQ); VdbeCoverag
124a0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
124b0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
124c0 35 28 76 2c 20 61 66 66 69 6e 69 74 79 20 7c 20  5(v, affinity | 
124d0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
124e0 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
124f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12500 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12510 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  regToFree);.    
12520 7d 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e  }.    if( regCkN
12530 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ull ){.      sql
12540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12550 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
12560 43 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75  CkNull, destIfNu
12570 6c 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ll); VdbeCoverag
12580 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
12590 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
125a0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
125b0 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d  tIfFalse);.    }
125c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
125d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
125e0 6c 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71  labelOk);.    sq
125f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12600 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43  Reg(pParse, regC
12610 6b 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  kNull);.  }else{
12620 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
12630 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74  e LHS is NULL, t
12640 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69  hen the result i
12650 73 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f  s either false o
12660 72 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67  r NULL depending
12670 0a 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68  .    ** on wheth
12680 65 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d  er the RHS is em
12690 70 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70  pty or not, resp
126a0 65 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f  ectively..    */
126b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
126c0 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45  ExprCanBeNull(pE
126d0 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20  xpr->pLeft) ){. 
126e0 20 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e       if( destIfN
126f0 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65  ull==destIfFalse
12700 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
12710 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
12720 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
12730 65 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20  e the false and 
12740 4e 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72  NULL outcomes ar
12750 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
12760 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   same. */.      
12770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12780 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
12790 2c 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c  , r1, destIfNull
127a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
127b0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
127c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
127d0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
127e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp1(v, OP_Not
127f0 4e 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43  Null, r1); VdbeC
12800 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
12810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12830 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
12840 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  e, destIfFalse);
12850 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
12860 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12880 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12890 30 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  0, destIfNull);.
128a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
128b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
128c0 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ddr1);.      }. 
128d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
128e0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
128f0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  ROWID ){.      /
12900 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
12910 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
12920 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
12930 74 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tree.      */.  
12940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12950 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
12960 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49  BeInt, r1, destI
12970 66 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76  fFalse); VdbeCov
12980 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129a0 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
129b0 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
129c0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
129d0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
129e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
129f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
12a00 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
12a10 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78   RHS is an index
12a20 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a   b-tree..      *
12a30 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
12a40 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12a50 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
12a60 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
12a70 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
12a80 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
12a90 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
12aa0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
12ab0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
12ac0 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65  * "x IN (...)" e
12ad0 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
12ae0 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55  e either 0 or NU
12af0 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20  LL. If the set. 
12b00 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
12b10 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
12b20 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
12b30 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
12b40 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  t .      ** cont
12b50 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
12b60 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
12b70 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
12b80 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
12b90 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
12ba0 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a   NULL..      */.
12bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
12bc0 73 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49  stIfFalse!=destI
12bd0 66 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73  fNull || rRhsHas
12be0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
12bf0 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
12c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
12c10 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
12c20 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77  ns if it is know
12c30 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  n at compile tim
12c40 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20  e that the RHS. 
12c50 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74         ** cannot
12c60 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
12c70 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
12c80 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
12c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
12ca0 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
12cb0 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
12cc0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
12cd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
12ce0 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68    ** Also run th
12cf0 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c  is branch if NUL
12d00 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  L is equivalent 
12d10 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20  to FALSE.       
12d20 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72   ** for this par
12d30 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61  ticular IN opera
12d40 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
12d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12d60 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
12d70 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
12d80 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
12d90 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
12da0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
12db0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
12dd0 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
12de0 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
12df0 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
12e00 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
12e10 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
12e20 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
12e30 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
12e40 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
12e50 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
12e60 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20  utcome..        
12e70 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  */.        int j
12e80 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
12e90 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
12ea0 73 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69  see if the LHS i
12eb0 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  s contained in t
12ec0 68 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a  he RHS.  If so,.
12ed0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
12ee0 74 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52  the answer is TR
12ef0 55 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  UE the presence 
12f00 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20  of NULLs in the 
12f10 52 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20  RHS does.       
12f20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20   ** not matter. 
12f30 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   If the LHS is n
12f40 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
12f50 74 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68  the RHS, then th
12f60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73  e.        ** ans
12f70 77 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74  wer is NULL if t
12f80 68 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20  he RHS contains 
12f90 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e  NULLs and the an
12fa0 73 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20  swer is.        
12fb0 2a 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  ** FALSE if the 
12fc0 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65  RHS is NULL-free
12fd0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12fe0 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
12ff0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
13000 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
13010 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31  r->iTable, 0, r1
13020 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
13030 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
13040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
13060 73 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75  sNull, rRhsHasNu
13070 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
13080 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
13090 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
130a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
130b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
130c0 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  0, destIfFalse);
130d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
130e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
130f0 6a 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j1);.      }.   
13100 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
13110 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
13120 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71  Parse, r1);.  sq
13130 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
13140 70 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62  p(pParse);.  Vdb
13150 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
13160 64 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a  d IN expr"));.}.
13170 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13180 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
13190 2f 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  /../*.** Duplica
131a0 74 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c  te an 8-byte val
131b0 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
131c0 72 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62  r *dup8bytes(Vdb
131d0 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
131e0 20 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f   *in){.  char *o
131f0 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ut = sqlite3DbMa
13200 6c 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56  llocRaw(sqlite3V
13210 64 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20  dbeDb(v), 8);.  
13220 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d  if( out ){.    m
13230 65 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38  emcpy(out, in, 8
13240 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13250 6f 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  out;.}..#ifndef 
13260 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13270 54 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a  TING_POINT./*.**
13280 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
13290 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
132a0 6c 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74  ll put the float
132b0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
132c0 75 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ue described by 
132d0 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72  z[0..n-1] into r
132e0 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a  egister iMem..**
132f0 0a 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69  .** The z[] stri
13300 6e 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ng will probably
13310 20 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72   not be zero-ter
13320 6d 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68  minated.  But th
13330 65 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61  e .** z[n] chara
13340 63 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  cter is guarante
13350 65 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  ed to be somethi
13360 6e 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ng that does not
13370 20 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68   look.** like th
13380 65 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f  e continuation o
13390 66 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  f the number..*/
133a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
133b0 65 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63  eReal(Vdbe *v, c
133c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
133d0 74 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e  t negateFlag, in
133e0 74 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41  t iMem){.  if( A
133f0 4c 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20  LWAYS(z!=0) ){. 
13400 20 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b     double value;
13410 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20  .    char *zV;. 
13420 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a     sqlite3AtoF(z
13430 2c 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65  , &value, sqlite
13440 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
13450 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
13460 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33  assert( !sqlite3
13470 49 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20  IsNaN(value) ); 
13480 2f 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20  /* The new AtoF 
13490 6e 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61  never returns Na
134a0 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67  N */.    if( neg
134b0 61 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20  ateFlag ) value 
134c0 3d 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56  = -value;.    zV
134d0 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20   = dup8bytes(v, 
134e0 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a  (char*)&value);.
134f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13500 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp4(v, OP_Real
13510 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56  , 0, iMem, 0, zV
13520 2c 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a  , P4_REAL);.  }.
13530 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
13540 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
13550 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
13560 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
13570 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
13580 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
13590 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69   into register i
135a0 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e  Mem..**.** Expr.
135b0 75 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61  u.zToken is alwa
135c0 79 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f  ys UTF8 and zero
135d0 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a  -terminated..*/.
135e0 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
135f0 49 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70  Integer(Parse *p
13600 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
13610 70 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c  pr, int negFlag,
13620 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64   int iMem){.  Vd
13630 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
13640 70 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78  pVdbe;.  if( pEx
13650 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
13660 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69  ntValue ){.    i
13670 6e 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e  nt i = pExpr->u.
13680 69 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65  iValue;.    asse
13690 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20  rt( i>=0 );.    
136a0 69 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20  if( negFlag ) i 
136b0 3d 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -i;.    sqlite
136c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
136d0 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d  P_Integer, i, iM
136e0 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
136f0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34    int c;.    i64
13700 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73   value;.    cons
13710 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70  t char *z = pExp
13720 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
13730 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b   assert( z!=0 );
13740 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
13750 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
13760 20 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66   &value);.    if
13770 28 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20  ( c==0 || (c==2 
13780 26 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20  && negFlag) ){. 
13790 20 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20       char *zV;. 
137a0 20 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67       if( negFlag
137b0 20 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32   ){ value = c==2
137c0 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36   ? SMALLEST_INT6
137d0 34 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20  4 : -value; }.  
137e0 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74      zV = dup8byt
137f0 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61  es(v, (char*)&va
13800 6c 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lue);.      sqli
13810 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
13820 20 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d   OP_Int64, 0, iM
13830 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e  em, 0, zV, P4_IN
13840 54 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T64);.    }else{
13850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13860 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
13870 4e 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  NT.      sqlite3
13880 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13890 20 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65   "oversized inte
138a0 67 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46  ger: %s%s", negF
138b0 6c 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  lag ? "-" : "", 
138c0 7a 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65  z);.#else.#ifnde
138d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45  f SQLITE_OMIT_HE
138e0 58 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20  X_INTEGER.      
138f0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
13900 69 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d  icmp(z,"0x",2)==
13910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
13920 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13930 72 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61  rse, "hex litera
13940 6c 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20  l too big: %s", 
13950 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  z);.      }else.
13960 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
13970 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28         codeReal(
13980 76 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69  v, z, negFlag, i
13990 4d 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Mem);.      }.#e
139a0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
139b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  ../*.** Clear a 
139c0 63 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a  cache entry..*/.
139d0 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68  static void cach
139e0 65 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73  eEntryClear(Pars
139f0 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
13a00 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b  t yColCache *p){
13a10 0a 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65  .  if( p->tempRe
13a20 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  g ){.    if( pPa
13a30 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
13a40 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
13a50 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
13a60 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70     pParse->aTemp
13a70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d  Reg[pParse->nTem
13a80 70 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65  pReg++] = p->iRe
13a90 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  g;.    }.    p->
13aa0 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d  tempReg = 0;.  }
13ab0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  .}.../*.** Recor
13ac0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
13ad0 63 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72  cache that a par
13ae0 74 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66  ticular column f
13af0 72 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75  rom a.** particu
13b00 6c 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f  lar table is sto
13b10 72 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75  red in a particu
13b20 6c 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  lar register..*/
13b30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13b40 72 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73  rCacheStore(Pars
13b50 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
13b60 54 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69  Tab, int iCol, i
13b70 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20  nt iReg){.  int 
13b80 69 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b  i;.  int minLru;
13b90 0a 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20  .  int idxLru;. 
13ba0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13bb0 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  e *p;..  /* Unle
13bc0 73 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ss an error has 
13bd0 6f 63 63 75 72 72 65 64 2c 20 72 65 67 69 73 74  occurred, regist
13be0 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
13bf0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
13c00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 52 65  */.  assert( iRe
13c10 67 3e 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  g>0 || pParse->n
13c20 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
13c30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  );.  assert( iCo
13c50 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32  l>=-1 && iCol<32
13c60 37 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74  768 );  /* Finit
13c70 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  e column numbers
13c80 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51   */..  /* The SQ
13c90 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
13ca0 20 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74   flag disables t
13cb0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
13cc0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20    This is used. 
13cd0 20 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20   ** for testing 
13ce0 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79  only - to verify
13cf0 20 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77   that SQLite alw
13d00 61 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d  ays gets the sam
13d10 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69  e answer.  ** wi
13d20 74 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74  th and without t
13d30 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
13d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69  .  */.  if( Opti
13d50 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64  mizationDisabled
13d60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c  (pParse->db, SQL
13d70 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29  ITE_ColumnCache)
13d80 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
13d90 20 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61   First replace a
13da0 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  ny existing entr
13db0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  y..  **.  ** Act
13dc0 75 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74  ually, the way t
13dd0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
13de0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  is currently use
13df0 64 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e  d, we are guaran
13e00 74 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74  teed.  ** that t
13e10 68 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e  he object will n
13e20 65 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20  ever already be 
13e30 69 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66  in cache.  Verif
13e40 79 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  y this guarantee
13e50 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
13e60 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c  DEBUG.  for(i=0,
13e70 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13e80 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13e90 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13ea0 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
13eb0 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20  ( p->iReg==0 || 
13ec0 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20  p->iTable!=iTab 
13ed0 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  || p->iColumn!=i
13ee0 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Col );.  }.#endi
13ef0 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20  f..  /* Find an 
13f00 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72  empty slot and r
13f10 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66  eplace it */.  f
13f20 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13f30 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13f40 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13f50 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13f60 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20   if( p->iReg==0 
13f70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76  ){.      p->iLev
13f80 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  el = pParse->iCa
13f90 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  cheLevel;.      
13fa0 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  p->iTable = iTab
13fb0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  ;.      p->iColu
13fc0 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  mn = iCol;.     
13fd0 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
13fe0 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
13ff0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  g = 0;.      p->
14000 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
14010 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20  acheCnt++;.     
14020 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
14030 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65   }..  /* Replace
14040 20 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74   the last recent
14050 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e  ly used */.  min
14060 4c 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66  Lru = 0x7fffffff
14070 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b  ;.  idxLru = -1;
14080 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
14090 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
140a0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
140b0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
140c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c  .    if( p->lru<
140d0 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20  minLru ){.      
140e0 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20  idxLru = i;.    
140f0 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72    minLru = p->lr
14100 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  u;.    }.  }.  i
14110 66 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75  f( ALWAYS(idxLru
14120 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  >=0) ){.    p = 
14130 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  &pParse->aColCac
14140 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20  he[idxLru];.    
14150 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72  p->iLevel = pPar
14160 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b  se->iCacheLevel;
14170 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
14180 20 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43   iTab;.    p->iC
14190 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
141a0 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67    p->iReg = iReg
141b0 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67  ;.    p->tempReg
141c0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75   = 0;.    p->lru
141d0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
141e0 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  eCnt++;.    retu
141f0 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn;.  }.}../*.**
14200 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72   Indicate that r
14210 65 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e  egisters between
14220 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67   iReg..iReg+nReg
14230 2d 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65  -1 are being ove
14240 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72  rwritten..** Pur
14250 67 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ge the range of 
14260 72 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74  registers from t
14270 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
14280 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14290 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
142a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
142b0 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
142c0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
142d0 6e 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20  nt iLast = iReg 
142e0 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74  + nReg - 1;.  st
142f0 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14300 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
14310 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
14320 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
14330 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
14340 29 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70  ){.    int r = p
14350 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20  ->iReg;.    if( 
14360 72 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c  r>=iReg && r<=iL
14370 61 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63  ast ){.      cac
14380 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61  heEntryClear(pPa
14390 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70  rse, p);.      p
143a0 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20  ->iReg = 0;.    
143b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  }.  }.}../*.** R
143c0 65 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72  emember the curr
143d0 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  ent column cache
143e0 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e   context.  Any n
143f0 65 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64  ew entries added
14400 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
14410 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66   column cache af
14420 74 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72  ter this call ar
14430 65 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74  e removed when t
14440 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
14450 69 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a  ing pop occurs..
14460 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
14470 78 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72  xprCachePush(Par
14480 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70  se *pParse){.  p
14490 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
144a0 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c  el++;.#ifdef SQL
144b0 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
144c0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
144d0 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
144e0 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
144f0 20 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f   printf("PUSH to
14500 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
14510 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
14520 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
14530 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68  * Remove from th
14540 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61  e column cache a
14550 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
14560 77 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65  were added since
14570 20 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76   the.** the prev
14580 69 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72  ious sqlite3Expr
14590 43 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74  CachePush operat
145a0 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ion.  In other w
145b0 6f 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a  ords, restore.**
145c0 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68   the cache to th
145d0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
145e0 6e 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74  n prior the most
145f0 20 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f   recent Push..*/
14600 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
14610 72 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20  rCachePop(Parse 
14620 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20  *pParse){.  int 
14630 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
14640 43 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65  Cache *p;.  asse
14650 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
14660 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20  heLevel>=1 );.  
14670 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14680 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51  vel--;.#ifdef SQ
14690 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
146a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
146b0 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
146c0 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
146d0 20 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74    printf("POP  t
146e0 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d  o %d\n", pParse-
146f0 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20  >iCacheLevel);. 
14700 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
14710 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14720 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14730 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14740 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
14750 28 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e  ( p->iReg && p->
14760 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69  iLevel>pParse->i
14770 43 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20  CacheLevel ){.  
14780 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
14790 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
147a0 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
147b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
147c0 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63  /*.** When a cac
147d0 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65  hed column is re
147e0 75 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20  used, make sure 
147f0 74 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65  that its registe
14800 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65  r is.** no longe
14810 72 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  r available as a
14820 20 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20   temp register. 
14830 20 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20   ticket #3879:  
14840 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67  that same.** reg
14850 69 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69  ister might be i
14860 6e 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d  n the cache in m
14870 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20  ultiple places, 
14880 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a  so be sure to.**
14890 20 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a   get them all..*
148a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
148b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69  lite3ExprCachePi
148c0 6e 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20  nRegister(Parse 
148d0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65  *pParse, int iRe
148e0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  g){.  int i;.  s
148f0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
14900 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  *p;.  for(i=0, p
14910 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
14920 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
14930 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
14940 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
14950 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
14960 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
14970 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
14980 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
14990 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74  ode to extract t
149a0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
149b0 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
149c0 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  f a table..*/.vo
149d0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
149e0 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62  deGetColumnOfTab
149f0 6c 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  le(.  Vdbe *v,  
14a00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
14a10 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
14a20 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20  tion */.  Table 
14a30 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65  *pTab,    /* The
14a40 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
14a50 67 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20  g the value */. 
14a60 20 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20   int iTabCur,   
14a70 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75   /* The table cu
14a80 72 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b  rsor.  Or the PK
14a90 20 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48   cursor for WITH
14aa0 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69  OUT ROWID */.  i
14ab0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f  nt iCol,       /
14ac0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63  * Index of the c
14ad0 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
14ae0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
14af0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
14b00 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20   the value into 
14b10 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
14b20 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30  .){.  if( iCol<0
14b30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e   || iCol==pTab->
14b40 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  iPKey ){.    sql
14b50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14b60 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62  , OP_Rowid, iTab
14b70 43 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Cur, regOut);.  
14b80 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f  }else{.    int o
14b90 70 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54  p = IsVirtual(pT
14ba0 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e  ab) ? OP_VColumn
14bb0 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20   : OP_Column;.  
14bc0 20 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a    int x = iCol;.
14bd0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
14be0 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
14bf0 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75   x = sqlite3Colu
14c00 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65  mnOfIndex(sqlite
14c10 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
14c20 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20  (pTab), iCol);. 
14c30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14c40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
14c50 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65  , iTabCur, x, re
14c60 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  gOut);.  }.  if(
14c70 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
14c80 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66  sqlite3ColumnDef
14c90 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43  ault(v, pTab, iC
14ca0 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ol, regOut);.  }
14cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
14cc0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
14cd0 6c 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43  l extract the iC
14ce0 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20  olumn-th column 
14cf0 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54  from.** table pT
14d00 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ab and store the
14d10 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
14d20 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e   a register.  An
14d30 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61   effort.** is ma
14d40 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
14d50 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
14d60 72 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62  register iReg, b
14d70 75 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f  ut this is.** no
14d80 74 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54  t guaranteed.  T
14d90 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
14da0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
14db0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
14dc0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
14dd0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
14de0 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c  to pTab in iTabl
14df0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
14e00 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
14e10 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20  .  If iColumn<0 
14e20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e  then code is gen
14e30 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72  erated that extr
14e40 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a  acts the rowid..
14e50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
14e60 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28  prCodeGetColumn(
14e70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14e80 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61  ,   /* Parsing a
14e90 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
14ea0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
14eb0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
14ec0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
14ed0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
14ee0 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  are reading from
14ef0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d   */.  int iColum
14f00 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  n,     /* Index 
14f10 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  of the table col
14f20 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  umn */.  int iTa
14f30 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ble,      /* The
14f40 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
14f50 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   to the table */
14f60 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20  .  int iReg,    
14f70 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
14f80 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75  ults here */.  u
14f90 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20  8 p5            
14fa0 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20  /* P5 value for 
14fb0 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  OP_Column */.){.
14fc0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
14fd0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
14fe0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
14ff0 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f  lCache *p;..  fo
15000 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
15010 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
15020 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
15030 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
15040 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26  if( p->iReg>0 &&
15050 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62   p->iTable==iTab
15060 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  le && p->iColumn
15070 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ==iColumn ){.   
15080 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72     p->lru = pPar
15090 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b  se->iCacheCnt++;
150a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
150b0 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74  prCachePinRegist
150c0 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52  er(pParse, p->iR
150d0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
150e0 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  n p->iReg;.    }
150f0 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28  .  }  .  assert(
15100 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
15110 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
15120 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54  umnOfTable(v, pT
15130 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c  ab, iTable, iCol
15140 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66  umn, iReg);.  if
15150 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( p5 ){.    sqli
15160 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
15170 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b  v, p5);.  }else{
15180 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45     .    sqlite3E
15190 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
151a0 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43  arse, iTable, iC
151b0 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20  olumn, iReg);.  
151c0 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b  }.  return iReg;
151d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
151e0 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  all column cache
151f0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69   entries..*/.voi
15200 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
15210 68 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70  heClear(Parse *p
15220 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
15230 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
15240 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c  che *p;..#if SQL
15250 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
15260 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
15270 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
15280 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
15290 20 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e   printf("CLEAR\n
152a0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ");.  }.#endif. 
152b0 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
152c0 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
152d0 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
152e0 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
152f0 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29     if( p->iReg )
15300 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
15310 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
15320 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
15330 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
15340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
15350 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
15360 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
15370 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
15380 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
15390 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
153a0 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
153b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
153c0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
153d0 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
153e0 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
153f0 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
15400 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
15410 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
15420 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
15430 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15440 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
15450 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
15460 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
15470 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
15480 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
15490 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
154a0 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
154b0 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
154c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
154d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
154e0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
154f0 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
15500 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
15510 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
15520 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
15530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15540 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
15550 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
15560 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
15570 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15580 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
15590 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a  iFrom, nReg);.}.
155a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
155b0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
155c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
155d0 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
155e0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
155f0 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
15600 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
15610 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
15620 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
15630 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
15640 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
15650 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
15660 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
15670 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
15680 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
15690 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
156a0 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
156b0 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
156c0 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
156d0 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
156e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
156f0 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
15700 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15710 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
15720 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
15730 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
15740 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
15750 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
15760 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
15770 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
15780 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
15790 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
157a0 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
157b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
157c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
157d0 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
157e0 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a  RAGE_TEST */../*
157f0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65  .** Convert an e
15800 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74  xpression node t
15810 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  o a TK_REGISTER.
15820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
15830 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78  xprToRegister(Ex
15840 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29  pr *p, int iReg)
15850 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e  {.  p->op2 = p->
15860 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  op;.  p->op = TK
15870 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e  _REGISTER;.  p->
15880 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20  iTable = iReg;. 
15890 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
158a0 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a  ty(p, EP_Skip);.
158b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
158c0 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20  e code into the 
158d0 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20  current Vdbe to 
158e0 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76  evaluate the giv
158f0 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
15900 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  .  Attempt to st
15910 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
15920 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72  in register "tar
15930 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  get"..** Return 
15940 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65  the register whe
15950 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  re results are s
15960 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  tored..**.** Wit
15970 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  h this routine, 
15980 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72  there is no guar
15990 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c  antee that resul
159a0 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74  ts will.** be st
159b0 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20  ored in target. 
159c0 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68   The result migh
159d0 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73  t be stored in s
159e0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67  ome other.** reg
159f0 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63  ister if it is c
15a00 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20  onvenient to do 
15a10 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  so.  The calling
15a20 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73   function.** mus
15a30 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
15a40 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65  rn code and move
15a50 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
15a60 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72  the desired.** r
15a70 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  egister..*/.int 
15a80 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15a90 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61  arget(Parse *pPa
15aa0 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
15ab0 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
15ac0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
15ad0 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68  e->pVdbe;  /* Th
15ae0 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74  e VM under const
15af0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
15b00 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
15b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
15b20 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
15b30 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20   */.  int inReg 
15b40 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20  = target;       
15b50 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65  /* Results store
15b60 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e  d in register in
15b70 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  Reg */.  int reg
15b80 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20  Free1 = 0;      
15b90 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
15ba0 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70  o free this temp
15bb0 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a  orary register *
15bc0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  /.  int regFree2
15bd0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
15be0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
15bf0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
15c00 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
15c10 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72  nt r1, r2, r3, r
15c20 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  4;       /* Vari
15c30 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ous register num
15c40 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bers */.  sqlite
15c50 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
15c60 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
15c70 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
15c80 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20  /.  Expr tempX; 
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ca0 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65   Temporary expre
15cb0 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20  ssion node */.. 
15cc0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
15cd0 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
15ce0 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
15cf0 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61  f( v==0 ){.    a
15d00 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
15d10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15d20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
15d30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
15d40 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d  r==0 ){.    op =
15d50 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73   TK_NULL;.  }els
15d60 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70  e{.    op = pExp
15d70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69  r->op;.  }.  swi
15d80 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
15d90 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  ase TK_AGG_COLUM
15da0 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e  N: {.      AggIn
15db0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70  fo *pAggInfo = p
15dc0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a  Expr->pAggInfo;.
15dd0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
15de0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
15df0 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c   &pAggInfo->aCol
15e00 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20  [pExpr->iAgg];. 
15e10 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e       if( !pAggIn
15e20 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29  fo->directMode )
15e30 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
15e40 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29  ( pCol->iMem>0 )
15e50 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20  ;.        inReg 
15e60 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20  = pCol->iMem;.  
15e70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15e80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67     }else if( pAg
15e90 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e  gInfo->useSortin
15ea0 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  gIdx ){.        
15eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15ec0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
15ed0 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e  pAggInfo->sortin
15ee0 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20  gIdxPTab,.      
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
15f10 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72  orterColumn, tar
15f20 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  get);.        br
15f30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15f40 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
15f50 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20   fall thru into 
15f60 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61  the TK_COLUMN ca
15f70 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  se */.    }.    
15f80 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
15f90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62  {.      int iTab
15fa0 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
15fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62  ;.      if( iTab
15fc0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
15fd0 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  ( pParse->ckBase
15fe0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
15ff0 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48  /* Generating CH
16000 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ECK constraints 
16010 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  or inserting int
16020 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  o partial index 
16030 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52  */.          inR
16040 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  eg = pExpr->iCol
16050 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b  umn + pParse->ck
16060 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
16070 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16090 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d  /* Deleting from
160a0 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78   a partial index
160b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54   */.          iT
160c0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 61  ab = pParse->iPa
160d0 72 74 49 64 78 54 61 62 3b 0a 20 20 20 20 20 20  rtIdxTab;.      
160e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
160f0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
16100 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
16110 6d 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mn(pParse, pExpr
16120 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ->pTab,.        
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
16150 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72  olumn, iTab, tar
16160 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
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 6f 70 32 29 3b      pExpr->op2);
16190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
161a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
161b0 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
161c0 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61   codeInteger(pPa
161d0 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74  rse, pExpr, 0, t
161e0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
161f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
16200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
16210 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
16220 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
16230 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
16240 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16250 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16260 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63  alue) );.      c
16270 6f 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72  odeReal(v, pExpr
16280 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74  ->u.zToken, 0, t
16290 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72  arget);.      br
162a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
162b0 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  f.    case TK_ST
162c0 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73  RING: {.      as
162d0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
162e0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
162f0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
16300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16310 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69  ddOp4(v, OP_Stri
16320 6e 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20  ng8, 0, target, 
16330 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
16340 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  en, 0);.      br
16350 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16360 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
16370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16380 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
16390 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
163a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
163b0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
163c0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
163d0 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
163e0 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LOB: {.      int
163f0 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   n;.      const 
16400 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63  char *z;.      c
16410 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20  har *zBlob;.    
16420 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
16430 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
16440 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
16450 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16460 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
16470 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72  0]=='x' || pExpr
16480 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27  ->u.zToken[0]=='
16490 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  X' );.      asse
164a0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
164b0 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ken[1]=='\'' );.
164c0 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72        z = &pExpr
164d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20  ->u.zToken[2];. 
164e0 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
164f0 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b  Strlen30(z) - 1;
16500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
16510 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20  [n]=='\'' );.   
16520 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74     zBlob = sqlit
16530 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69  e3HexToBlob(sqli
16540 74 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c  te3VdbeDb(v), z,
16550 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   n);.      sqlit
16560 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16570 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61  OP_Blob, n/2, ta
16580 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20  rget, 0, zBlob, 
16590 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  P4_DYNAMIC);.   
165a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
165b0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
165c0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
165d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
165e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
165f0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
16600 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
16610 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
16620 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  en!=0 );.      a
16630 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
16640 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a  zToken[0]!=0 );.
16650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16660 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61  eAddOp2(v, OP_Va
16670 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
16680 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
16690 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
166a0 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30  ->u.zToken[1]!=0
166b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
166c0 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  rt( pExpr->u.zTo
166d0 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20  ken[0]=='?' .   
166e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72            || str
166f0 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
16700 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  ken, pParse->azV
16710 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ar[pExpr->iColum
16720 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20  n-1])==0 );.    
16730 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16740 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70  hangeP4(v, -1, p
16750 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78  Parse->azVar[pEx
16760 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20  pr->iColumn-1], 
16770 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
16780 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
16790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
167a0 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
167b0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78       inReg = pEx
167c0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
167d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
167e0 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
167f0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
16800 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
16810 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
16820 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65  pr->pLeft, targe
16830 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
16840 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
16850 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
16860 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
16870 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
16880 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
16890 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
168a0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
168b0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
168c0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
168d0 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
168e0 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
168f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
16900 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
16910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16920 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
16930 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
16940 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
16950 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
16960 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
16970 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16980 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
16990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
169a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
169b0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
169c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
169d0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
169e0 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
169f0 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
16a00 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
16a10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
16a20 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16a30 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
16a40 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
16a50 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
16a60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
16a70 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
16a80 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
16a90 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
16aa0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
16ab0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
16ac0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
16ad0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72  TK_EQ: {.      r
16ae0 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
16af0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16b00 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
16b10 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16b20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
16b30 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
16b40 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
16b50 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
16b60 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
16b70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
16b80 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
16b90 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
16ba0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
16bb0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
16bc0 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61  TOREP2);.      a
16bd0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
16be0 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
16bf0 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
16c00 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
16c10 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
16c20 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
16c30 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
16c40 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
16c50 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
16c60 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
16c70 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
16c80 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
16c90 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
16ca0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
16cb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16cc0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
16cd0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
16ce0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
16cf0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
16d00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
16d10 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
16d20 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
16d30 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
16d40 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
16d50 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
16d60 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
16d70 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
16d80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
16d90 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
16da0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16db0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
16dc0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16dd0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
16de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16df0 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
16e00 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
16e10 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
16e20 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
16e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16e40 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
16e50 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16e60 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16e70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16e80 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16e90 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
16ea0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
16eb0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
16ec0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
16ed0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
16ee0 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
16ef0 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
16f00 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
16f10 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
16f20 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
16f30 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
16f40 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
16f50 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
16f60 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e  OREP2 | SQLITE_N
16f70 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
16f80 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
16f90 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
16fa0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16fb0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
16fc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16fd0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
16fe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16ff0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17010 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
17020 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
17030 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
17040 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
17050 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
17060 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
17070 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
17080 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
17090 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
170a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
170b0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
170c0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
170d0 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
170e0 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
170f0 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17100 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
17110 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
17120 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
17130 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
17140 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
17150 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
17160 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17170 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
17180 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
17190 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
171a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
171b0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
171c0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
171d0 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
171e0 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
171f0 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
17200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17210 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
17220 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
17230 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
17240 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17250 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
17260 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
17270 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17280 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
17290 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
172a0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
172b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
172c0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
172d0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
172e0 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
172f0 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
17300 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
17310 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17320 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
17330 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
17340 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17350 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
17360 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
17370 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
17380 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
17390 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
173a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
173b0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
173c0 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
173d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
173e0 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
173f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
17400 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
17410 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
17420 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
17430 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
17440 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
17450 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
17460 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
17470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
17480 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
17490 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
174a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
174b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
174c0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
174d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
174e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
174f0 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
17500 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
17510 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
17520 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17530 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
17540 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
17550 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
17560 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
17570 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
17580 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64  , target);.#ifnd
17590 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
175a0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
175b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
175c0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
175d0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
175e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
175f0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17600 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
17610 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
17620 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
17630 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65  , 1, target);.#e
17640 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
17650 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
17660 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
17670 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
17680 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
17690 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
176a0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
176b0 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
176c0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
176d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
176e0 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
176f0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
17700 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
17710 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
17720 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
17730 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17740 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17750 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
17760 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
17770 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
17780 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17790 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
177a0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
177b0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
177c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
177d0 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
177e0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
177f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
17800 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
17810 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
17820 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
17830 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17840 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
17850 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
17860 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
17870 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
17880 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17890 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
178a0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
178b0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
178c0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
178d0 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
178e0 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
178f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17900 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
17910 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
17920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17930 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
17940 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
17950 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
17960 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
17970 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
17980 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
17990 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
179a0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
179b0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
179c0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
179d0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
179e0 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
179f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17a00 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
17a10 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
17a20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
17a30 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
17a40 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
17a50 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
17a60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
17a70 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
17a80 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
17a90 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
17aa0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
17ab0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
17ac0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
17ad0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
17ae0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
17af0 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
17b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17b10 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
17b20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
17b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17b40 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
17b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17b60 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
17b70 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
17b80 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
17b90 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
17ba0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
17bb0 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
17bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
17bd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
17be0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
17bf0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
17c00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17c10 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
17c20 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
17c30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
17c40 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
17c50 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
17c60 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
17c70 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
17c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17c90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17ca0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
17cb0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
17cc0 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
17cd0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
17ce0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
17cf0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
17d00 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
17d10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
17d20 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
17d30 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
17d40 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
17d50 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
17d60 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
17d70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
17d80 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
17d90 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
17da0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
17db0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
17dc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
17dd0 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
17de0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
17df0 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74  .      u32 const
17e00 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Mask = 0;     /*
17e10 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f   Mask of functio
17e20 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74  n arguments that
17e30 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f   are constant */
17e40 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17e60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
17e70 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
17e80 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a  ENC(db);      /*
17e90 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   The text encodi
17ea0 6e 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20  ng used by this 
17eb0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
17ec0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
17ed0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f   = 0;    /* A co
17ee0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
17ef0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
17f00 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
17f10 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17f20 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
17f30 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
17f40 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17f50 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
17f60 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b        pFarg = 0;
17f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17f80 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45        pFarg = pE
17f90 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
17fa0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72      }.      nFar
17fb0 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72  g = pFarg ? pFar
17fc0 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  g->nExpr : 0;.  
17fd0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
17fe0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
17ff0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
18000 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20   );.      zId = 
18010 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
18020 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
18030 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
18040 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
18050 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
18060 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64  ion(db, zId, nId
18070 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29  , nFarg, enc, 0)
18080 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
18090 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 75  ==0 || pDef->xFu
180a0 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc==0 ){.       
180b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
180c0 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
180d0 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  n function: %.*s
180e0 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  ()", nId, zId);.
180f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18100 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
18110 20 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63   Attempt a direc
18120 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
18130 20 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   of the built-in
18140 20 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a   COALESCE() and.
18150 20 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28        ** IFNULL(
18160 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  ) functions.  Th
18170 69 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65  is avoids unnece
18180 73 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e  ssary evaluation
18190 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67   of.      ** arg
181a0 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20  uments past the 
181b0 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  first non-NULL a
181c0 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  rgument..      *
181d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  /.      if( pDef
181e0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
181f0 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53  LITE_FUNC_COALES
18200 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  CE ){.        in
18210 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20  t endCoalesce = 
18220 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
18230 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
18240 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d   assert( nFarg>=
18250 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
18260 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
18270 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d  rse, pFarg->a[0]
18280 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b  .pExpr, target);
18290 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31  .        for(i=1
182a0 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b  ; i<nFarg; i++){
182b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
182c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
182d0 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67  OP_NotNull, targ
182e0 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  et, endCoalesce)
182f0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
18300 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18310 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
18320 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50  prCacheRemove(pP
18330 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29  arse, target, 1)
18340 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18350 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18360 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
18370 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18380 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72  ode(pParse, pFar
18390 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74  g->a[i].pExpr, t
183a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
183b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
183c0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
183d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
183e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
183f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43  lveLabel(v, endC
18400 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
18410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18420 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55  ..      /* The U
18430 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69  NLIKELY() functi
18440 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
18450 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  The result is th
18460 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
18470 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72   of the first ar
18480 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
18490 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
184a0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
184b0 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
184c0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  Y ){.        ass
184d0 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b  ert( nFarg>=1 );
184e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
184f0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
18500 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
18510 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
18520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18530 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
18540 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =0; i<nFarg; i++
18550 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
18560 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78  <32 && sqlite3Ex
18570 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61  prIsConstant(pFa
18580 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  rg->a[i].pExpr) 
18590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
185a0 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a  tcase( i==31 );.
185b0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d            constM
185c0 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32  ask |= MASKBIT32
185d0 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (i);.        }. 
185e0 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
185f0 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
18600 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
18610 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c  LL)!=0 && !pColl
18620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
18630 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
18640 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
18650 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78   pFarg->a[i].pEx
18660 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
18670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18680 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20   pFarg ){.      
18690 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20    if( constMask 
186a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20  ){.          r1 
186b0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
186c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
186d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72  se->nMem += nFar
186e0 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  g;.        }else
186f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
18700 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
18710 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61  ange(pParse, nFa
18720 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  rg);.        }..
18730 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
18740 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65  ength() and type
18750 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77  of() functions w
18760 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67  ith a column arg
18770 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a  ument,.        *
18780 2a 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72  * set the P5 par
18790 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50  ameter to the OP
187a0 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74  _Column opcode t
187b0 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  o OPFLAG_LENGTHA
187c0 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  RG.        ** or
187d0 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
187e0 47 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20  G respectively, 
187f0 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
18800 73 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20  sary data.      
18810 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20    ** loading..  
18820 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18830 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
18840 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
18850 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49  FUNC_LENGTH|SQLI
18860 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29  TE_FUNC_TYPEOF))
18870 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
18880 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20   u8 exprOp;.    
18890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46        assert( nF
188a0 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  arg==1 );.      
188b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72      assert( pFar
188c0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30  g->a[0].pExpr!=0
188d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78   );.          ex
188e0 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b  prOp = pFarg->a[
188f0 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20  0].pExpr->op;.  
18900 20 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72          if( expr
18910 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  Op==TK_COLUMN ||
18920 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f   exprOp==TK_AGG_
18930 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
18940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51        assert( SQ
18950 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48  LITE_FUNC_LENGTH
18960 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41  ==OPFLAG_LENGTHA
18970 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  RG );.          
18980 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
18990 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50  _FUNC_TYPEOF==OP
189a0 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29  FLAG_TYPEOFARG )
189b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
189c0 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75  stcase( pDef->fu
189d0 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47  ncFlags & OPFLAG
189e0 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20  _LENGTHARG );.  
189f0 20 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d            pFarg-
18a00 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32  >a[0].pExpr->op2
18a10 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   = .            
18a20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63        pDef->func
18a30 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f  Flags & (OPFLAG_
18a40 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47  LENGTHARG|OPFLAG
18a50 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20  _TYPEOFARG);.   
18a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18a70 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
18a80 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
18a90 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a  (pParse);     /*
18aa0 20 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64   Ticket 2ea2425d
18ab0 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  34be */.        
18ac0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
18ad0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
18ae0 70 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20 20  pFarg, r1,.     
18af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18b10 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54  E_ECEL_DUP|SQLIT
18b20 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a  E_ECEL_FACTOR);.
18b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18b40 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
18b50 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63  se);      /* Tic
18b60 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
18b70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
18b80 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b  .        r1 = 0;
18b90 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
18ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
18bb0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20  TUALTABLE.      
18bc0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72  /* Possibly over
18bd0 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f  load the functio
18be0 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61  n if the first a
18bf0 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20  rgument is.     
18c00 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61   ** a virtual ta
18c10 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20  ble column..    
18c20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f    **.      ** Fo
18c30 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e  r infix function
18c40 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52  s (LIKE, GLOB, R
18c50 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48  EGEXP, and MATCH
18c60 29 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  ) use the.      
18c70 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
18c80 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73  nt, not the firs
18c90 74 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  t, as the argume
18ca0 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20  nt to test to.  
18cb0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
18cc0 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
18cd0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
18ce0 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62    This is done b
18cf0 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
18d00 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
18d10 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69   of infix functi
18d20 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64  ons (the operand
18d30 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20   we want to.    
18d40 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65    ** control ove
18d50 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75  rloading) ends u
18d60 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  p as the second 
18d70 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a  argument to the.
18d80 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
18d90 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  n.  The expressi
18da0 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73  on "A glob B" is
18db0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
18dc0 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42        ** "glob(B
18dd0 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f  ,A).  We want to
18de0 20 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41   use the A in "A
18df0 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74   glob B" to test
18e00 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75  .      ** for fu
18e10 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69  nction overloadi
18e20 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20  ng.  But we use 
18e30 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67  the B term in "g
18e40 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20  lob(B,A)"..     
18e50 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46   */.      if( nF
18e60 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72  arg>=2 && (pExpr
18e70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66  ->flags & EP_Inf
18e80 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20  ixFunc) ){.     
18e90 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
18ea0 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e  3VtabOverloadFun
18eb0 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20  ction(db, pDef, 
18ec0 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b  nFarg, pFarg->a[
18ed0 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
18ee0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67   }else if( nFarg
18ef0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  >0 ){.        pD
18f00 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  ef = sqlite3Vtab
18f10 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e  OverloadFunction
18f20 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67  (db, pDef, nFarg
18f30 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  , pFarg->a[0].pE
18f40 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  xpr);.      }.#e
18f50 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
18f60 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
18f70 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
18f80 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  DCOLL ){.       
18f90 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43   if( !pColl ) pC
18fa0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
18fb0 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
18fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18fd0 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30  v, OP_CollSeq, 0
18fe0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29  , 0, 0, (char *)
18ff0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
19000 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
19010 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19020 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op4(v, OP_Functi
19030 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  on, constMask, r
19040 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19060 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
19070 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
19080 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19090 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
190a0 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
190b0 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
190c0 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
190d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
190e0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
190f0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
19100 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
19110 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
19120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19130 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
19140 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
19150 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
19160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
19170 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
19180 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19190 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
191a0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
191b0 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
191c0 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
191d0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
191e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
191f0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
19200 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
19210 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
19220 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19230 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
19240 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
19250 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
19260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
19280 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
19290 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
192a0 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
192b0 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
192c0 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
192d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
192e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
192f0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
19300 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19310 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19320 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
19330 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19340 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19350 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
19360 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
19370 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
19380 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
19390 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
193a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
193b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
193c0 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
193d0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
193e0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
193f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
19400 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
19410 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
19420 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
19430 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
19440 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
19450 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
19460 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
19470 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
19480 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
19490 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
194a0 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
194b0 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
194c0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
194d0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
194e0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
194f0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
19500 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19510 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
19520 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
19530 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
19540 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
19550 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
19560 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
19570 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
19580 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
19590 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
195a0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
195b0 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
195c0 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
195d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
195e0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
195f0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19600 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
19610 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
19620 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
19630 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
19640 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
19650 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
19660 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
19670 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
19680 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
19690 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
196a0 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
196b0 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72  EP2);  VdbeCover
196c0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c  age(v);.      pL
196d0 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
196e0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
196f0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
19700 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
19710 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
19720 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
19730 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19740 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
19750 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
19760 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19770 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
19780 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
19790 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
197a0 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
197b0 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
197c0 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
197d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
197e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
197f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19800 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
19810 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
19820 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19830 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
19840 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
19850 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19860 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
19870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
19880 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a  case TK_COLLATE:
19890 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50   .    case TK_UP
198a0 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  LUS: {.      inR
198b0 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
198c0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
198d0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
198e0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
198f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19900 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45    case TK_TRIGGE
19910 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  R: {.      /* If
19920 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54   the opcode is T
19930 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20  K_TRIGGER, then 
19940 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
19950 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  s a reference.  
19960 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75      ** to a colu
19970 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  mn in the new.* 
19980 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  or old.* pseudo-
19990 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65  tables available
199a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69   to.      ** tri
199b0 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49  gger programs. I
199c0 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72  n this case Expr
199d0 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74  .iTable is set t
199e0 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20  o 1 for the.    
199f0 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64    ** new.* pseud
19a00 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f  o-table, or 0 fo
19a10 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75  r the old.* pseu
19a20 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69  do-table. Expr.i
19a30 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  Column.      ** 
19a40 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f  is set to the co
19a50 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75  lumn of the pseu
19a60 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64  do-table to read
19a70 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20  , or to -1 to.  
19a80 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20      ** read the 
19a90 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20  rowid field..   
19aa0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
19ab0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
19ac0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69   implemented usi
19ad0 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f  ng an OP_Param o
19ae0 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20  pcode. The p1.  
19af0 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72      ** parameter
19b00 20 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72   is set to 0 for
19b10 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65   an old.rowid re
19b20 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28  ference, or to (
19b30 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  i+1).      ** to
19b40 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68   reference anoth
19b50 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  er column of the
19b60 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61   old.* pseudo-ta
19b70 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20  ble, where .    
19b80 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
19b90 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
19ba0 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77  n. For a new.row
19bb0 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31  id reference, p1
19bc0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74   is.      ** set
19bd0 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65   to (n+1), where
19be0 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   n is the number
19bf0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65   of columns in e
19c00 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65  ach pseudo-table
19c10 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  ..      ** For a
19c20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
19c30 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69  y other column i
19c40 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75  n the new.* pseu
19c50 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20  do-table, p1.   
19c60 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20     ** is set to 
19c70 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e  (n+2+i), where n
19c80 20 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65   and i are as de
19c90 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79  fined previously
19ca0 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65  . For.      ** e
19cb0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74  xample, if the t
19cc0 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72  able on which tr
19cd0 69 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67  iggers are being
19ce0 20 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20   fired is.      
19cf0 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a  ** declared as:.
19d00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19d10 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
19d20 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
19d30 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
19d40 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65  n p1 is interpre
19d50 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
19d60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
19d70 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20  *   p1==0   ->  
19d80 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20    old.rowid     
19d90 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65  p1==3   ->    ne
19da0 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a  w.rowid.      **
19db0 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20     p1==1   ->   
19dc0 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70   old.a         p
19dd0 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==4   ->    new
19de0 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31  .a.      **   p1
19df0 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e  ==2   ->    old.
19e00 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20  b         p1==5 
19e10 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20    ->    new.b   
19e20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20      .      */.  
19e30 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
19e40 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
19e50 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45       int p1 = pE
19e60 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70  xpr->iTable * (p
19e70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31  Tab->nCol+1) + 1
19e80 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   + pExpr->iColum
19e90 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  n;..      assert
19ea0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
19eb0 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  =0 || pExpr->iTa
19ec0 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ble==1 );.      
19ed0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69  assert( pExpr->i
19ee0 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45  Column>=-1 && pE
19ef0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61  xpr->iColumn<pTa
19f00 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
19f10 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69   assert( pTab->i
19f20 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d  PKey<0 || pExpr-
19f30 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e  >iColumn!=pTab->
19f40 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61  iPKey );.      a
19f50 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20  ssert( p1>=0 && 
19f60 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32  p1<(pTab->nCol*2
19f70 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71  +2) );..      sq
19f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19f90 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c  v, OP_Param, p1,
19fa0 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19fb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
19fc0 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a  "%s.%s -> $%d",.
19fd0 20 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e          (pExpr->
19fe0 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a  iTable ? "new" :
19ff0 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20   "old"),.       
1a000 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e   (pExpr->iColumn
1a010 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70  <0 ? "rowid" : p
1a020 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c  Expr->pTab->aCol
1a030 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1a040 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  .zName),.       
1a050 20 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29   target.      ))
1a060 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1a070 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
1a080 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49  POINT.      /* I
1a090 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73  f the column has
1a0a0 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20   REAL affinity, 
1a0b0 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  it may currently
1a0c0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e   be stored as an
1a0d0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
1a0e0 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66  r. Use OP_RealAf
1a0f0 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73  finity to make s
1a100 75 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79  ure it is really
1a110 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a   real..      **.
1a120 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
1a130 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d 35 37  E-OF: R-60985-57
1a140 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  662 SQLite will 
1a150 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61 6c 75  convert the valu
1a160 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20 20 20  e back to.      
1a170 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
1a180 74 20 77 68 65 6e 20 65 78 74 72 61 63 74 69 6e  t when extractin
1a190 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65  g it from the re
1a1a0 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cord.  */.      
1a1b0 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
1a1c0 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
1a1d0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
1a1e0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
1a1f0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
1a200 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
1a210 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a220 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
1a230 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
1a240 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
1a250 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1a260 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
1a270 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
1a280 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
1a290 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
1a2a0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
1a2b0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
1a2c0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
1a2d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1a2e0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
1a2f0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
1a300 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
1a310 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
1a320 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
1a330 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
1a340 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
1a350 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
1a360 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
1a370 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
1a380 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
1a390 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
1a3a0 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
1a3b0 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
1a3c0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
1a3d0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
1a3e0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
1a3f0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
1a400 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
1a410 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1a420 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
1a430 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
1a440 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
1a450 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
1a460 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
1a470 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
1a480 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
1a490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
1a4a0 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
1a4b0 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
1a4c0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
1a4d0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
1a4e0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
1a4f0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
1a500 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
1a510 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
1a520 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
1a530 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
1a540 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1a550 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
1a560 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
1a570 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
1a580 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
1a590 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
1a5a0 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
1a5b0 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
1a5c0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
1a5d0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
1a5e0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
1a5f0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
1a600 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
1a610 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
1a620 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
1a650 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
1a660 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
1a670 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
1a6a0 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
1a6b0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
1a6c0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
1a6f0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1a700 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1a730 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
1a740 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
1a770 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1a780 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1a790 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
1a7a0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
1a7b0 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
1a7c0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
1a7d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a7e0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
1a7f0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1a800 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
1a830 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
1a840 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
1a850 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a860 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
1a870 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
1a880 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
1a890 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
1a8a0 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
1a8b0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a8c0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
1a8d0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1a8e0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1a8f0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
1a900 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
1a910 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
1a920 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1a930 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
1a940 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
1a950 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
1a960 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
1a970 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
1a980 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
1a990 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
1a9a0 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
1a9b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1a9c0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
1a9d0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
1a9e0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
1a9f0 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
1aa00 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
1aa10 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
1aa20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
1aa30 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c  ster(&tempX, sql
1aa40 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1aa50 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
1aa60 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
1aa70 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1aa80 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
1aa90 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
1aaa0 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
1aab0 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
1aac0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
1aad0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
1aae0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
1aaf0 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
1ab00 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
1ab10 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
1ab20 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
1ab30 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
1ab40 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
1ab50 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
1ab60 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
1ab70 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
1ab80 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
1ab90 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
1aba0 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
1abb0 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
1abc0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
1abd0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
1abe0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
1abf0 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
1ac00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1ac10 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
1ac20 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
1ac30 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ac40 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1ac50 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
1ac60 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1ac70 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
1ac80 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
1ac90 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
1aca0 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
1acb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1acc0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
1acd0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
1ace0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
1acf0 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
1ad00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1ad10 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
1ad20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1ad30 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
1ad40 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
1ad50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1ad60 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
1ad70 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
1ad80 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
1ad90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ada0 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
1adb0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1adc0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
1add0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1ade0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
1adf0 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
1ae00 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1ae10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1ae20 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
1ae30 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
1ae40 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ae50 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1ae60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ae70 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1ae80 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
1ae90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1aea0 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
1aeb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1aec0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1aed0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
1aee0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
1aef0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
1af00 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
1af10 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1af20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1af30 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1af40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1af50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1af60 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1af70 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1af80 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1af90 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1afa0 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
1afb0 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
1afc0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
1afd0 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
1afe0 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
1aff0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b000 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
1b010 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1b020 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1b030 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1b040 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
1b050 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
1b060 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
1b070 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
1b080 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
1b090 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1b0a0 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
1b0b0 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
1b0c0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
1b0d0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
1b0e0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b0f0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
1b100 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
1b110 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
1b120 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1b130 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b140 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1b160 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
1b170 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
1b180 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
1b190 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1b1a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1b1b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
1b1c0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1b1d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1b1e0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1b1f0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
1b200 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1b210 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1b220 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1b230 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1b240 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1b250 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
1b260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1b270 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
1b280 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
1b290 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
1b2a0 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
1b2b0 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
1b2c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1b2d0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
1b2e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b2f0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1b300 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
1b310 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
1b320 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1b350 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1b360 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1b370 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
1b380 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1b390 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1b3a0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1b3b0 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1b3c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1b3d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1b3e0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
1b3f0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
1b400 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
1b410 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
1b420 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
1b430 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1b440 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1b450 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1b460 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1b470 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1b480 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1b490 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1b4a0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1b4b0 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
1b4c0 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
1b4d0 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
1b4e0 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53  gDest,      /* S
1b4f0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
1b500 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1b510 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65  */.  u8 reusable
1b520 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b530 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  f this expressio
1b540 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f  n is reusable */
1b550 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
1b560 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
1b570 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1b580 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
1b590 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
1b5a0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1b5b0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
1b5c0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
1b5d0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
1b5e0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1b5f0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
1b600 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
1b610 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1b620 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1b630 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
1b640 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
1b650 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
1b660 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65  gDest;.     pIte
1b670 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
1b680 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50  usable;.  }.  pP
1b690 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1b6a0 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = p;.}../*.** G
1b6b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b6c0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
1b6d0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
1b6e0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1b6f0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
1b700 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
1b710 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
1b720 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
1b730 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
1b740 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
1b750 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
1b760 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
1b770 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
1b780 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
1b790 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
1b7a0 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
1b7b0 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
1b7c0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
1b7d0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
1b7e0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
1b7f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
1b800 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
1b810 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1b820 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
1b830 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
1b840 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
1b850 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
1b860 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
1b870 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
1b880 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
1b890 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
1b8a0 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
1b8b0 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
1b8c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b8d0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
1b8e0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1b8f0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
1b900 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
1b910 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1b920 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
1b930 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
1b940 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
1b950 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
1b960 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
1b970 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1b980 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
1b990 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  r).  ){.    Expr
1b9a0 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65  List *p = pParse
1b9b0 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1b9c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52    int i;.    *pR
1b9d0 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eg  = 0;.    if(
1b9e0 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75   p ){.      stru
1b9f0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1ba00 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1ba10 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
1ba20 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
1ba30 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
1ba40 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1ba50 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
1ba60 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ba70 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  (pItem->pExpr,pE
1ba80 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
1ba90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1baa0 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1bab0 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  prReg;.        }
1bac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bad0 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65     r2 = ++pParse
1bae0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1baf0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1bb00 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1bb10 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65   r2, 1);.  }else
1bb20 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
1bb30 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1bb40 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
1bb50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bb60 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1bb70 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1bb80 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
1bb90 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
1bba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bbb0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1bbc0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1bbd0 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
1bbe0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1bbf0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
1bc00 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1bc10 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1bc20 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
1bc30 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
1bc40 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
1bc50 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1bc60 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1bc70 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1bc80 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
1bc90 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1bca0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bcb0 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
1bcc0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1bcd0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1bce0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
1bcf0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1bd00 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1bd10 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1bd20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
1bd30 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
1bd40 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
1bd50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1bd60 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1bd70 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
1bd80 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
1bd90 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
1bda0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1bdb0 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1bdc0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1bdd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bde0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
1bdf0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1be00 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
1be10 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1be20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
1be30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1be40 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1be50 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1be60 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1be70 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
1be80 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1be90 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1bea0 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
1beb0 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
1bec0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1bed0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
1bee0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1bef0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
1bf00 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
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 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
1bf30 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
1bf40 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1bf50 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
1bf60 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
1bf70 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
1bf80 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1bf90 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1bfa0 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1bfb0 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
1bfc0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1bfd0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1bfe0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
1bff0 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
1c000 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1c010 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1c020 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1c030 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1c040 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1c050 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1c060 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c070 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1c080 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
1c090 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c0a0 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
1c0b0 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
1c0c0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
1c0d0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
1c0e0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c0f0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
1c100 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
1c110 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
1c120 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
1c130 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
1c140 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
1c150 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
1c160 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
1c170 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
1c180 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
1c190 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
1c1a0 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
1c1b0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
1c1c0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c1d0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
1c1e0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
1c1f0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
1c200 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
1c210 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
1c220 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
1c230 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
1c240 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
1c250 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1c260 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
1c270 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1c280 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1c290 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1c2a0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1c2b0 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
1c2c0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1c2d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1c2e0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
1c2f0 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
1c300 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1c310 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1c320 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
1c330 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1c340 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c350 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
1c360 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
1c370 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
1c380 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 64 65   iMem);.}..#ifde
1c390 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1c3a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1c3b0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
1c3c0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  xplanation of an
1c3d0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1c3e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c3f0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 54 72  3TreeViewExpr(Tr
1c400 65 65 56 69 65 77 20 2a 70 56 69 65 77 2c 20 63  eeView *pView, c
1c410 6f 6e 73 74 20 45 78 70 72 20 2a 70 45 78 70 72  onst Expr *pExpr
1c420 2c 20 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f  , u8 moreToFollo
1c430 77 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  w){.  const char
1c440 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
1c450 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
1c460 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
1c470 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
1c480 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
1c490 74 6f 72 20 2a 2f 0a 20 20 70 56 69 65 77 20 3d  tor */.  pView =
1c4a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c4b0 50 75 73 68 28 70 56 69 65 77 2c 20 6d 6f 72 65  Push(pView, more
1c4c0 54 6f 46 6f 6c 6c 6f 77 29 3b 0a 20 20 69 66 28  ToFollow);.  if(
1c4d0 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
1c4e0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1c4f0 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 6e 69 6c  Line(pView, "nil
1c500 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ");.    sqlite3T
1c510 72 65 65 56 69 65 77 50 6f 70 28 70 56 69 65 77  reeViewPop(pView
1c520 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c530 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
1c540 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
1c550 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
1c560 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c570 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c580 69 65 77 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d  iew, "AGG{%d:%d}
1c590 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ",.            p
1c5a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
1c5b0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1c5c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c5d0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
1c5e0 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
1c5f0 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
1c600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1c610 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1c620 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68  s when coding ch
1c630 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  eck constraints 
1c640 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
1c650 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c660 56 69 65 77 2c 20 22 43 4f 4c 55 4d 4e 28 25 64  View, "COLUMN(%d
1c670 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  )", pExpr->iColu
1c680 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
1c690 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c6a0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c6b0 69 65 77 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a  iew, "{%d:%d}",.
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1c6e0 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
1c6f0 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1c700 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1c710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c720 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
1c730 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1c740 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
1c750 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  lue ){.        s
1c760 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1c770 6e 65 28 70 56 69 65 77 2c 20 22 25 64 22 2c 20  ne(pView, "%d", 
1c780 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
1c790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c7a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
1c7b0 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1c7c0 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75  , "%s", pExpr->u
1c7d0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
1c7e0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
1c7f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1c800 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1c810 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65  G_POINT.    case
1c820 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
1c830 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1c840 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 25 73  ewLine(pView,"%s
1c850 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1c860 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
1c870 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1c880 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
1c890 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G: {.      sqlit
1c8a0 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c8b0 56 69 65 77 2c 22 25 51 22 2c 20 70 45 78 70 72  View,"%Q", pExpr
1c8c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1c8d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c8e0 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
1c8f0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c900 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1c910 69 65 77 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  iew,"NULL");.   
1c920 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c940 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c  MIT_BLOB_LITERAL
1c950 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
1c960 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B: {.      sqlit
1c970 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70  e3TreeViewLine(p
1c980 56 69 65 77 2c 22 25 73 22 2c 20 70 45 78 70 72  View,"%s", pExpr
1c990 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20  ->u.zToken);.   
1c9a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c9b0 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1c9c0 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20  TK_VARIABLE: {. 
1c9d0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1c9e0 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22  ViewLine(pView,"
1c9f0 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22  VARIABLE(%s,%d)"
1ca00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1ca20 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78  r->u.zToken, pEx
1ca30 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1ca40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ca50 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1ca60 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
1ca70 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1ca80 6e 65 28 70 56 69 65 77 2c 22 52 45 47 49 53 54  ne(pView,"REGIST
1ca90 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  ER(%d)", pExpr->
1caa0 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
1cab0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1cac0 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
1cad0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1cae0 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 22 41  iewLine(pView,"A
1caf0 53 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  S %Q", pExpr->u.
1cb00 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
1cb10 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1cb20 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1cb30 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
1cb40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cb50 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
1cb60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
1cb70 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77  eeViewLine(pView
1cb80 2c 22 49 44 20 25 51 22 2c 20 70 45 78 70 72 2d  ,"ID %Q", pExpr-
1cb90 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1cba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1cbb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cbc0 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1cbd0 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1cbe0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1cbf0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1cc00 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1cc10 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 73 71  ken) */.      sq
1cc20 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1cc30 65 28 70 56 69 65 77 2c 22 43 41 53 54 20 25 51  e(pView,"CAST %Q
1cc40 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  ", pExpr->u.zTok
1cc50 65 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  en);.      sqlit
1cc60 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1cc70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65  View, pExpr->pLe
1cc80 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  ft, 0);.      br
1cc90 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1cca0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1ccb0 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73  _CAST */.    cas
1ccc0 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 42  e TK_LT:      zB
1ccd0 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20  inOp = "LT";    
1cce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1ccf0 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42 69   TK_LE:      zBi
1cd00 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20  nOp = "LE";     
1cd10 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cd20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GT:      zBin
1cd30 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 62  Op = "GT";     b
1cd40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1cd50 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_GE:      zBinO
1cd60 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62 72  p = "GE";     br
1cd70 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1cd80 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _NE:      zBinOp
1cd90 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72 65   = "NE";     bre
1cda0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1cdb0 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  EQ:      zBinOp 
1cdc0 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65 61  = "EQ";     brea
1cdd0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1cde0 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
1cdf0 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61 6b   "IS";     break
1ce00 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
1ce10 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20  NOT:   zBinOp = 
1ce20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b  "ISNOT";  break;
1ce30 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
1ce40 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  :     zBinOp = "
1ce50 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  AND";    break;.
1ce60 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
1ce70 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4f       zBinOp = "O
1ce80 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  R";     break;. 
1ce90 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
1cea0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41 44      zBinOp = "AD
1ceb0 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
1cec0 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20    case TK_STAR: 
1ced0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55 4c     zBinOp = "MUL
1cee0 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1cef0 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
1cf00 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42 22    zBinOp = "SUB"
1cf10 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1cf20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20  case TK_REM:    
1cf30 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22 3b   zBinOp = "REM";
1cf40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1cf50 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
1cf60 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e 44  zBinOp = "BITAND
1cf70 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1cf80 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
1cf90 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b  BinOp = "BITOR";
1cfa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cfb0 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 42  e TK_SLASH:   zB
1cfc0 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20  inOp = "DIV";   
1cfd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1cfe0 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42 69   TK_LSHIFT:  zBi
1cff0 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20  nOp = "LSHIFT"; 
1d000 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d010 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69 6e  TK_RSHIFT:  zBin
1d020 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 62  Op = "RSHIFT"; b
1d030 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1d040 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e 4f  K_CONCAT:  zBinO
1d050 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62 72  p = "CONCAT"; br
1d060 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1d070 5f 44 4f 54 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _DOT:     zBinOp
1d080 20 3d 20 22 44 4f 54 22 3b 20 20 20 20 62 72 65   = "DOT";    bre
1d090 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
1d0a0 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69 4f 70  _UMINUS:  zUniOp
1d0b0 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62 72 65   = "UMINUS"; bre
1d0c0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1d0d0 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f 70 20  UPLUS:   zUniOp 
1d0e0 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72 65 61  = "UPLUS";  brea
1d0f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
1d100 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70 20 3d  ITNOT:  zUniOp =
1d110 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65 61 6b   "BITNOT"; break
1d120 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1d130 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20 3d 20  T:     zUniOp = 
1d140 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61 6b 3b  "NOT";    break;
1d150 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
1d160 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d 20 22  ULL:  zUniOp = "
1d170 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  ISNULL"; break;.
1d180 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1d190 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20 22 4e  ULL: zUniOp = "N
1d1a0 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a  OTNULL"; break;.
1d1b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1d1c0 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  LATE: {.      sq
1d1d0 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1d1e0 65 28 70 56 69 65 77 2c 20 22 43 4f 4c 4c 41 54  e(pView, "COLLAT
1d1f0 45 20 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e  E %Q", pExpr->u.
1d200 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 73  zToken);.      s
1d210 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1d220 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1d230 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20  >pLeft, 0);.    
1d240 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d250 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1d260 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
1d270 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1d280 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1d290 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1d2a0 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1d2b0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1d2c0 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1d2d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1d2e0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
1d2f0 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d300 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1d310 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1d320 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1d330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d340 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
1d350 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
1d360 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d370 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d380 69 65 77 2c 20 22 41 47 47 5f 46 55 4e 43 54 49  iew, "AGG_FUNCTI
1d390 4f 4e 25 64 20 25 51 22 2c 0a 20 20 20 20 20 20  ON%d %Q",.      
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1d3c0 32 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  2, pExpr->u.zTok
1d3d0 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
1d3e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d3f0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d400 69 65 77 2c 20 22 46 55 4e 43 54 49 4f 4e 20 25  iew, "FUNCTION %
1d410 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
1d420 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
1d430 20 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b      if( pFarg ){
1d440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d450 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1d460 28 70 56 69 65 77 2c 20 70 46 61 72 67 2c 20 30  (pView, pFarg, 0
1d470 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d4a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
1d4b0 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
1d4c0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d4d0 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1d4e0 69 65 77 2c 20 22 45 58 49 53 54 53 2d 65 78 70  iew, "EXISTS-exp
1d4f0 72 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r");.      sqlit
1d500 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d510 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d520 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d530 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d540 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
1d550 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
1d560 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65  ite3TreeViewLine
1d570 28 70 56 69 65 77 2c 20 22 53 45 4c 45 43 54 2d  (pView, "SELECT-
1d580 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 73 71  expr");.      sq
1d590 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
1d5a0 65 63 74 28 70 56 69 65 77 2c 20 70 45 78 70 72  ect(pView, pExpr
1d5b0 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ->x.pSelect, 0);
1d5c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d5d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1d5e0 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
1d5f0 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1d600 70 56 69 65 77 2c 20 22 49 4e 22 29 3b 0a 20 20  pView, "IN");.  
1d610 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d620 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
1d630 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 31 29 3b  Expr->pLeft, 1);
1d640 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
1d650 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1d660 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1d670 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1d680 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
1d690 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d 3e 78  (pView, pExpr->x
1d6a0 2e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  .pSelect, 0);.  
1d6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d6c0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
1d6d0 65 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77  ewExprList(pView
1d6e0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1d6f0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
1d700 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d710 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d720 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1d730 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  RY */..    /*.  
1d740 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45    **    x BETWEE
1d750 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a  N y AND z.    **
1d760 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
1d770 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
1d780 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78    **.    **    x
1d790 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20  >=y AND x<=z.   
1d7a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20   **.    ** X is 
1d7b0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1d7c0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
1d7d0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1d7e0 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
1d7f0 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a  .pExpr..    ** Z
1d800 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45   is stored in pE
1d810 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
1d820 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20  .pExpr..    */. 
1d830 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1d840 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
1d850 20 2a 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c   *pX = pExpr->pL
1d860 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
1d870 2a 70 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pY = pExpr->x.p
1d880 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1d890 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a  ;.      Expr *pZ
1d8a0 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1d8b0 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
1d8c0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1d8d0 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1d8e0 22 42 45 54 57 45 45 4e 22 29 3b 0a 20 20 20 20  "BETWEEN");.    
1d8f0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1d900 77 45 78 70 72 28 70 56 69 65 77 2c 20 70 58 2c  wExpr(pView, pX,
1d910 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
1d920 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 70  e3TreeViewExpr(p
1d930 56 69 65 77 2c 20 70 59 2c 20 31 29 3b 0a 20 20  View, pY, 1);.  
1d940 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
1d950 69 65 77 45 78 70 72 28 70 56 69 65 77 2c 20 70  iewExpr(pView, p
1d960 5a 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  Z, 0);.      bre
1d970 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d980 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1d990 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1d9a0 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1d9b0 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1d9c0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1d9d0 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1d9e0 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1d9f0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1da00 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1da10 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1da20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1da30 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1da40 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1da50 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1da60 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1da70 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1da80 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1da90 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1daa0 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1dab0 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1dac0 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1dad0 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1dae0 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1daf0 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1db00 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1db10 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1db20 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
1db30 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56 69 65  reeViewLine(pVie
1db40 77 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20  w, "%s(%d)", .  
1db50 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1db60 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20  Table ? "NEW" : 
1db70 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43  "OLD", pExpr->iC
1db80 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
1db90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1dba0 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
1dbb0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
1dbc0 56 69 65 77 4c 69 6e 65 28 70 56 69 65 77 2c 20  ViewLine(pView, 
1dbd0 22 43 41 53 45 22 29 3b 0a 20 20 20 20 20 20 73  "CASE");.      s
1dbe0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1dbf0 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1dc00 3e 70 4c 65 66 74 2c 20 31 29 3b 0a 20 20 20 20  >pLeft, 1);.    
1dc10 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1dc20 77 45 78 70 72 4c 69 73 74 28 70 56 69 65 77 2c  wExprList(pView,
1dc30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1dc40 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
1dc50 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1dc60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1dc70 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1dc80 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1dc90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1dca0 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  ype = "unk";.   
1dcb0 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
1dcc0 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ->affinity ){.  
1dcd0 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
1dce0 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20  llback:   zType 
1dcf0 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62  = "rollback";  b
1dd00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1dd10 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20  se OE_Abort:    
1dd20 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74    zType = "abort
1dd30 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1dd40 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61        case OE_Fa
1dd50 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20  il:       zType 
1dd60 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62  = "fail";      b
1dd70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1dd80 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20  se OE_Ignore:   
1dd90 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72    zType = "ignor
1dda0 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
1ddb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1ddc0 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28  te3TreeViewLine(
1ddd0 70 56 69 65 77 2c 20 22 52 41 49 53 45 20 25 73  pView, "RAISE %s
1dde0 28 25 51 29 22 2c 20 7a 54 79 70 65 2c 20 70 45  (%Q)", zType, pE
1ddf0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1de00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1de10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
1de20 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
1de30 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1de40 6e 65 28 70 56 69 65 77 2c 20 22 6f 70 3d 25 64  ne(pView, "op=%d
1de50 22 2c 20 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20  ", pExpr->op);. 
1de60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1de70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 42 69 6e  }.  }.  if( zBin
1de80 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Op ){.    sqlite
1de90 33 54 72 65 65 56 69 65 77 4c 69 6e 65 28 70 56  3TreeViewLine(pV
1dea0 69 65 77 2c 20 22 25 73 22 2c 20 7a 42 69 6e 4f  iew, "%s", zBinO
1deb0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  p);.    sqlite3T
1dec0 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69 65  reeViewExpr(pVie
1ded0 77 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  w, pExpr->pLeft,
1dee0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
1def0 54 72 65 65 56 69 65 77 45 78 70 72 28 70 56 69  TreeViewExpr(pVi
1df00 65 77 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ew, pExpr->pRigh
1df10 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  t, 0);.  }else i
1df20 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20 20  f( zUniOp ){.   
1df30 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1df40 4c 69 6e 65 28 70 56 69 65 77 2c 20 22 25 73 22  Line(pView, "%s"
1df50 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20 73  , zUniOp);.    s
1df60 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78  qlite3TreeViewEx
1df70 70 72 28 70 56 69 65 77 2c 20 70 45 78 70 72 2d  pr(pView, pExpr-
1df80 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 7d 0a  >pLeft, 0);.  }.
1df90 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
1dfa0 77 50 6f 70 28 70 56 69 65 77 29 3b 0a 7d 0a 23  wPop(pView);.}.#
1dfb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1dfc0 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
1dfd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1dfe0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
1dff0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78  uman-readable ex
1e000 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20  planation of an 
1e010 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
1e020 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e030 54 72 65 65 56 69 65 77 45 78 70 72 4c 69 73 74  TreeViewExprList
1e040 28 0a 20 20 54 72 65 65 56 69 65 77 20 2a 70 56  (.  TreeView *pV
1e050 69 65 77 2c 0a 20 20 63 6f 6e 73 74 20 45 78 70  iew,.  const Exp
1e060 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 0a 20 20  rList *pList,.  
1e070 75 38 20 6d 6f 72 65 54 6f 46 6f 6c 6c 6f 77 2c  u8 moreToFollow,
1e080 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e090 4c 61 62 65 6c 0a 29 7b 0a 20 20 69 6e 74 20 69  Label.){.  int i
1e0a0 3b 0a 20 20 70 56 69 65 77 20 3d 20 73 71 6c 69  ;.  pView = sqli
1e0b0 74 65 33 54 72 65 65 56 69 65 77 50 75 73 68 28  te3TreeViewPush(
1e0c0 70 56 69 65 77 2c 20 6d 6f 72 65 54 6f 46 6f 6c  pView, moreToFol
1e0d0 6c 6f 77 29 3b 0a 20 20 69 66 28 20 7a 4c 61 62  low);.  if( zLab
1e0e0 65 6c 3d 3d 30 20 7c 7c 20 7a 4c 61 62 65 6c 5b  el==0 || zLabel[
1e0f0 30 5d 3d 3d 30 20 29 20 7a 4c 61 62 65 6c 20 3d  0]==0 ) zLabel =
1e100 20 22 4c 49 53 54 22 3b 0a 20 20 69 66 28 20 70   "LIST";.  if( p
1e110 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  List==0 ){.    s
1e120 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69  qlite3TreeViewLi
1e130 6e 65 28 70 56 69 65 77 2c 20 22 25 73 20 28 65  ne(pView, "%s (e
1e140 6d 70 74 79 29 22 2c 20 7a 4c 61 62 65 6c 29 3b  mpty)", zLabel);
1e150 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1e160 6c 69 74 65 33 54 72 65 65 56 69 65 77 4c 69 6e  lite3TreeViewLin
1e170 65 28 70 56 69 65 77 2c 20 22 25 73 22 2c 20 7a  e(pView, "%s", z
1e180 4c 61 62 65 6c 29 3b 0a 20 20 20 20 66 6f 72 28  Label);.    for(
1e190 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1e1a0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1e1b0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
1e1c0 45 78 70 72 28 70 56 69 65 77 2c 20 70 4c 69 73  Expr(pView, pLis
1e1d0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
1e1e0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
1e1f0 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 69 66 28  ;.#if 0.     if(
1e200 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1e210 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
1e220 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1e230 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25 73  tf(pOut, " AS %s
1e240 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
1e250 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
1e260 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1e270 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62 20  a[i].bSpanIsTab 
1e280 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1e290 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1e2a0 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20 70  pOut, " (%s)", p
1e2b0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1e2c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
1e2d0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  f.    }.  }.  sq
1e2e0 6c 69 74 65 33 54 72 65 65 56 69 65 77 50 6f 70  lite3TreeViewPop
1e2f0 28 70 56 69 65 77 29 3b 0a 7d 0a 23 65 6e 64 69  (pView);.}.#endi
1e300 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1e310 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  G */../*.** Gene
1e320 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70  rate code that p
1e330 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20  ushes the value 
1e340 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  of every element
1e350 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a   of the given.**
1e360 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1e370 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65   into a sequence
1e380 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65   of registers be
1e390 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65  ginning at targe
1e3a0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
1e3b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
1e3c0 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64  ements evaluated
1e3d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49  ..**.** The SQLI
1e3e0 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67  TE_ECEL_DUP flag
1e3f0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61 72   prevents the ar
1e400 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69  guments from bei
1e410 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69  ng.** filled usi
1e420 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50  ng OP_SCopy.  OP
1e430 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73  _Copy must be us
1e440 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
1e450 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1e460 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e  L_FACTOR argumen
1e470 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e  t allows constan
1e480 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  t arguments to b
1e490 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75  e.** factored ou
1e4a0 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a  t into initializ
1e4b0 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69  ation code..*/.i
1e4c0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1e4d0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1e4e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1e4f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1e500 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1e510 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1e520 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1e530 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1e540 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1e550 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1e560 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1e570 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20   */.  u8 flags  
1e580 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
1e590 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20  TE_ECEL_* flags 
1e5a0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
1e5b0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
1e5c0 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
1e5d0 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28  .  u8 copyOp = (
1e5e0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45  flags & SQLITE_E
1e5f0 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f  CEL_DUP) ? OP_Co
1e600 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20  py : OP_SCopy;. 
1e610 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
1e620 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
1e630 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73  arget>0 );.  ass
1e640 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64  ert( pParse->pVd
1e650 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76  be!=0 );  /* Nev
1e660 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61 72  er gets this far
1e670 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
1e680 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
1e690 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61  ;.  if( !ConstFa
1e6a0 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29  ctorOk(pParse) )
1e6b0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
1e6c0 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20  E_ECEL_FACTOR;. 
1e6d0 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
1e6e0 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
1e6f0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1e700 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
1e710 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
1e720 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1e730 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f  QLITE_ECEL_FACTO
1e740 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  R)!=0 && sqlite3
1e750 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
1e760 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73  Expr) ){.      s
1e770 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1e780 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1e790 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29  pr, target+i, 0)
1e7a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e7b0 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73     int inReg = s
1e7c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
1e7d0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78  rget(pParse, pEx
1e7e0 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  pr, target+i);. 
1e7f0 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
1e800 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20  target+i ){.    
1e810 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
1e820 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a 76  .        Vdbe *v
1e830 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1e840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f  ;.        if( co
1e850 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  pyOp==OP_Copy.  
1e860 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73         && (pOp=s
1e870 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
1e880 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d  v, -1))->opcode=
1e890 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1e8a0 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70    && pOp->p1+pOp
1e8b0 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20  ->p3+1==inReg.  
1e8c0 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1e8d0 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72  2+pOp->p3+1==tar
1e8e0 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b  get+i.        ){
1e8f0 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
1e900 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  p3++;.        }e
1e910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1e920 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e930 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65  (v, copyOp, inRe
1e940 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  g, target+i);.  
1e950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e970 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
1e980 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1e990 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61   a BETWEEN opera
1e9a0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20  tor..**.**    x 
1e9b0 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a  BETWEEN y AND z.
1e9c0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
1e9d0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1e9e0 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20   .**.**    x>=y 
1e9f0 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43  AND x<=z.**.** C
1ea00 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c 20  ode it as such, 
1ea10 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64  taking care to d
1ea20 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62  o the common sub
1ea30 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c  expression.** el
1ea40 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a  imination of x..
1ea50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
1ea60 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a  xprCodeBetween(.
1ea70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ea80 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
1ea90 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
1eaa0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1eab0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
1eac0 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e    /* The BETWEEN
1ead0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
1eae0 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20   int dest,      
1eaf0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
1eb00 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74  if the jump is t
1eb10 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  aken */.  int ju
1eb20 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54  mpIfTrue,   /* T
1eb30 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1eb40 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 74  the BETWEEN is t
1eb50 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d  rue */.  int jum
1eb60 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61  pIfNull    /* Ta
1eb70 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1eb80 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55  he BETWEEN is NU
1eb90 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  LL */.){.  Expr 
1eba0 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20  exprAnd;     /* 
1ebb0 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72  The AND operator
1ebc0 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c   in  x>=y AND x<
1ebd0 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f  =z  */.  Expr co
1ebe0 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68  mpLeft;    /* Th
1ebf0 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f  e  x>=y  term */
1ec00 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68  .  Expr compRigh
1ec10 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d  t;   /* The  x<=
1ec20 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70  z  term */.  Exp
1ec30 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f  r exprX;       /
1ec40 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78 70  * The  x  subexp
1ec50 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ression */.  int
1ec60 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f   regFree1 = 0; /
1ec70 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20  * Temporary use 
1ec80 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61  register */..  a
1ec90 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
1eca0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1ecb0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
1ecc0 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72    exprX = *pExpr
1ecd0 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41  ->pLeft;.  exprA
1ece0 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a  nd.op = TK_AND;.
1ecf0 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20    exprAnd.pLeft 
1ed00 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65  = &compLeft;.  e
1ed10 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20  xprAnd.pRight = 
1ed20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f  &compRight;.  co
1ed30 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47  mpLeft.op = TK_G
1ed40 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c  E;.  compLeft.pL
1ed50 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20  eft = &exprX;.  
1ed60 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20  compLeft.pRight 
1ed70 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1ed80 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1ed90 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54  compRight.op = T
1eda0 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68  K_LE;.  compRigh
1edb0 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1edc0 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52  ;.  compRight.pR
1edd0 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1ede0 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
1edf0 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73  r;.  exprToRegis
1ee00 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69  ter(&exprX, sqli
1ee10 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1ee20 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20  pParse, &exprX, 
1ee30 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69  &regFree1));.  i
1ee40 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b  f( jumpIfTrue ){
1ee50 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1ee60 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 26  IfTrue(pParse, &
1ee70 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1ee80 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65  umpIfNull);.  }e
1ee90 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1eea0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1eeb0 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1eec0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1eed0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1eee0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1eef0 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1ef00 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65  .  /* Ensure ade
1ef10 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65 72  quate test cover
1ef20 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  age */.  testcas
1ef30 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30  e( jumpIfTrue==0
1ef40 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   && jumpIfNull==
1ef50 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30  0 && regFree1==0
1ef60 20 29 3b 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 21 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 21 3d 30 20 26 26 20 72  mpIfNull!=0 && r
1efd0 65 67 46 72 65 65 31 3d 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 21 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 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e!=0 && jumpIfNu
1f040 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1f050 31 3d 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 21 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 21 3d 30 20  & jumpIfNull!=0 
1f0c0 26 26 20 72 65 67 46 72 65 65 31 3d 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 21 3d 30 20 29 3b 0a 7d  regFree1!=0 );.}
1f110 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1f120 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
1f130 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
1f140 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
1f150 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
1f160 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
1f170 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1f180 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
1f190 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1f1a0 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1f1b0 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1f1c0 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  ion is false..**
1f1d0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
1f1e0 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
1f1f0 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
1f200 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
1f210 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74  , then.** take t
1f220 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a  he jump if the j
1f230 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69  umpIfNull flag i
1f240 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  s SQLITE_JUMPIFN
1f250 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
1f260 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1f270 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
1f280 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
1f290 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
1f2a0 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
1f2b0 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
1f2c0 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
1f2d0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
1f2e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1f2f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
1f300 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
1f310 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
1f320 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
1f330 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
1f340 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
1f350 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
1f360 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
1f370 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
1f380 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
1f390 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
1f3a0 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
1f3b0 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
1f3c0 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
1f3d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f3e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1f3f0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1f400 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1f410 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1f420 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1f430 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1f440 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1f450 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1f460 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1f470 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1f480 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1f490 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1f4a0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1f4b0 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74 75  v==0) )     retu
1f4c0 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63  rn;  /* Existenc
1f4d0 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65  e of VDBE checke
1f4e0 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20  d by caller */. 
1f4f0 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70 72   if( NEVER(pExpr
1f500 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
1f510 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63  /* No way this c
1f520 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f  an happen */.  o
1f530 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
1f540 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1f550 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
1f560 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
1f570 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1f580 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1f590 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1f5a0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1f5b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f5c0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1f5d0 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d  r->pLeft, d2,jum
1f5e0 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a  pIfNull^SQLITE_J
1f5f0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1f600 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f610 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f620 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f630 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1f640 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1f650 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f660 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f670 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1f680 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1f690 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f6a0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f6b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f6c0 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
1f6d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f6e0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f6f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1f700 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1f710 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1f720 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1f730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f740 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1f750 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1f760 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1f770 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1f780 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1f790 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f7a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1f7b0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1f7c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f7d0 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1f7e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f7f0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1f800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1f810 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1f820 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1f830 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
1f840 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1f850 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f860 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
1f870 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
1f880 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
1f890 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
1f8a0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
1f8b0 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74  TK_EQ: {.      t
1f8c0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f8d0 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f8e0 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1f8f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1f900 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1f910 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f920 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1f930 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f940 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1f950 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1f960 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
1f970 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1f980 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
1f990 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20  ht, op,.        
1f9a0 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32            r1, r2
1f9b0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1f9c0 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ll);.      asser
1f9d0 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
1f9e0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1f9f0 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
1fa00 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
1fa10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fa20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
1fa30 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1fa40 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1fa50 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
1fa60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fa70 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
1fa80 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
1fa90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1faa0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
1fab0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1fac0 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
1fad0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
1fae0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1faf0 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
1fb00 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
1fb10 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
1fb20 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
1fb30 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1fb40 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
1fb50 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1fb60 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1fb70 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
1fb80 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1fb90 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ne);.      t
1fba0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fbb0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
1fbc0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
1fbd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
1fbe0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fbf0 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
1fc00 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
1fc10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1fc20 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1fc30 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1fc40 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1fc50 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
1fc60 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1fc70 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1fc80 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
1fc90 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
1fca0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fcb0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1fcc0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
1fcd0 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
1fce0 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
1fcf0 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
1fd00 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1fd10 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
1fd20 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
1fd30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fd40 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
1fd50 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
1fd60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
1fd70 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
1fd80 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
1fd90 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1fda0 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
1fdb0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1fdc0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1fdd0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1fde0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1fdf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fe00 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
1fe10 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
1fe20 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
1fe30 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
1fe40 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
1fe50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
1fe60 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
1fe70 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
1fe80 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
1fe90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
1fea0 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
1feb0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1fec0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1fed0 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fee0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1fef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ff00 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
1ff10 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64   dest);.      Vd
1ff20 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
1ff30 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
1ff40 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1ff50 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
1ff60 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
1ff70 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1ff80 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
1ff90 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ffa0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1ffb0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1ffc0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ffd0 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
1ffe0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
1fff0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c   pExpr, dest, 1,
20000 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20010 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20020 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20030 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20040 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
20050 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
20060 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56  False = sqlite3V
20070 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20080 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
20090 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75  fNull = jumpIfNu
200a0 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74  ll ? dest : dest
200b0 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73  IfFalse;.      s
200c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
200d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
200e0 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73  destIfFalse, des
200f0 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  tIfNull);.      
20100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20110 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
20120 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
20130 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20140 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
20150 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
20160 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
20170 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
20180 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
20190 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
201a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
201b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
201c0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
201d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
201e0 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
201f0 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
20200 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f       /* No-op */
20210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20220 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20230 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20240 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72  Parse, pExpr, &r
20250 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
20260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20270 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31  Op3(v, OP_If, r1
20280 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20290 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
202a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
202b0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
202c0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
202d0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
202e0 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
202f0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
20300 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20310 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
20320 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20330 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
20340 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
20350 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
20360 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f  egFree2);  .}../
20370 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20380 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
20390 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
203a0 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
203b0 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
203c0 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
203d0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
203e0 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
203f0 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
20400 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
20410 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
20420 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
20430 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
20440 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
20450 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
20460 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
20470 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
20480 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49  mpIfNull is SQLI
20490 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72  TE_JUMPIFNULL or
204a0 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66   fall through if
204b0 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69   jumpIfNull.** i
204c0 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s 0..*/.void sql
204d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
204e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
204f0 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
20500 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
20510 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
20520 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
20530 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
20540 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
20550 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
20560 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31  e2 = 0;.  int r1
20570 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28  , r2;..  assert(
20580 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
20590 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c  ITE_JUMPIFNULL |
205a0 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  | jumpIfNull==0 
205b0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
205c0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f  ==0) ) return; /
205d0 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56  * Existence of V
205e0 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20 63  DBE checked by c
205f0 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70  aller */.  if( p
20600 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74  Expr==0 )    ret
20610 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
20620 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
20630 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
20640 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
20650 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
20660 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
20670 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
20680 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
20690 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
206a0 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
206b0 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
206c0 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
206d0 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
206e0 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
206f0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
20700 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
20710 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
20720 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
20730 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
20740 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
20750 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
20760 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
20780 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
20790 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
207a0 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
207b0 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
207c0 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
207d0 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
207e0 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
207f0 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
20800 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
20810 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
20820 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
20830 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
20840 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
20850 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
20860 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
20870 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
20880 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
20890 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
208a0 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
208b0 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
208c0 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
208d0 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
208e0 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
208f0 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
20900 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
20910 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
20920 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
20930 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
20940 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
20950 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
20960 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
20970 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
20980 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
20990 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
209a0 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
209b0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
209c0 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
209d0 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
209e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
209f0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
20a00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
20a10 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
20a20 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
20a30 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
20a40 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
20a50 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
20a60 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
20a70 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
20a80 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
20a90 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
20aa0 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
20ab0 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
20ac0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
20ad0 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  AND: {.      tes
20ae0 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20af0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
20b00 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
20b10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20b20 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
20b30 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20b40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
20b50 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
20b60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
20b70 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
20b80 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
20b90 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
20ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20bb0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20bc0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
20bd0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20be0 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
20bf0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
20c00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
20c10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20c20 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20c30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
20c40 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
20c50 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20c60 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53  d2, jumpIfNull^S
20c70 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
20c80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20c90 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
20ca0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
20cb0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
20cc0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20cd0 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
20ce0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20cf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
20d00 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
20d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20d20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
20d30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20d40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
20d50 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74  K_NOT: {.      t
20d60 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
20d70 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
20d80 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
20d90 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
20da0 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
20db0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20dc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20dd0 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
20de0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
20df0 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
20e00 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
20e10 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
20e20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
20e30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20e40 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
20e50 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
20e60 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
20e70 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20e80 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
20e90 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
20ea0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20eb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20ec0 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
20ed0 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  2);.      codeCo
20ee0 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
20ef0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
20f00 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a   r1, r2, dest, j
20f30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
20f40 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
20f50 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
20f60 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
20f70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
20f80 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
20f90 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
20fa0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
20fb0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
20fc0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
20fd0 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
20fe0 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
20ff0 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
21000 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
21010 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
21020 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
21030 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
21040 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
21050 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
21060 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
21070 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
21080 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
21090 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
210a0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
210b0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
210c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
210d0 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
210e0 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
210f0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
21100 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
21110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21120 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
21130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
21140 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
21150 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21160 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
21170 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
21180 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
21190 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
211a0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
211b0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
211c0 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
211d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
211e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
211f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
21200 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
21210 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
21220 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
21230 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
21240 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65  pRight, &regFree
21250 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28  2);.      op = (
21260 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
21270 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
21280 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  Q;.      codeCom
21290 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
212a0 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
212b0 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20  ->pRight, op,.  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51  r1, r2, dest, SQ
212e0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
212f0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
21300 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29  If(v, op==TK_EQ)
21310 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
21320 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
21330 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74  _NE);.      test
21340 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
21350 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  0 );.      testc
21360 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30  ase( regFree2==0
21370 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
21380 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
21390 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
213a0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
213b0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  {.      r1 = sql
213c0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
213d0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
213e0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
213f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
21400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70  VdbeAddOp2(v, op
21410 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  , r1, dest);.   
21420 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
21430 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20  =TK_ISNULL );   
21440 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
21450 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29  , op==TK_ISNULL)
21460 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
21470 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
21480 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67   );  VdbeCoverag
21490 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
214a0 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65  TNULL);.      te
214b0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
214c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
214d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
214e0 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
214f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21500 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
21510 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65  ;.      exprCode
21520 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20  Between(pParse, 
21530 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20  pExpr, dest, 0, 
21540 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
21550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21560 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21570 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
21580 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
21590 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e       if( jumpIfN
215a0 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
215b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
215c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
215d0 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  dest, dest);.   
215e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
215f0 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
21600 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
21610 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
21620 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
21630 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45  odeIN(pParse, pE
21640 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49  xpr, dest, destI
21650 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
21660 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
21670 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49  veLabel(v, destI
21680 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  fNull);.      }.
21690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
216a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
216b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
216c0 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c  f( exprAlwaysFal
216d0 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
216e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
216f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
21700 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20  o, 0, dest);.   
21710 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70     }else if( exp
21720 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78 70  rAlwaysTrue(pExp
21730 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
21740 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
21750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
21760 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
21770 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
21780 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31  pExpr, &regFree1
21790 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
217a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
217b0 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65  OP_IfNot, r1, de
217c0 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d  st, jumpIfNull!=
217d0 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  0);.        Vdbe
217e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
217f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
21800 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
21810 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21820 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
21830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
21840 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
21850 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
21860 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
21870 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c  regFree1);.  sql
21880 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
21890 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72  eg(pParse, regFr
218a0 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ee2);.}../*.** D
218b0 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69  o a deep compari
218c0 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65  son of two expre
218d0 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65  ssion trees.  Re
218e0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
218f0 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73  o.** expressions
21900 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20   are completely 
21910 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75  identical.  Retu
21920 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69 66  rn 1 if they dif
21930 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61  fer only.** by a
21940 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
21950 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76  r at the top lev
21960 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66  el.  Return 2 if
21970 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
21980 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20  rences.** other 
21990 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76  than the top-lev
219a0 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61  el COLLATE opera
219b0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  tor..**.** If an
219c0 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20  y subelement of 
219d0 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61 62  pB has Expr.iTab
219e0 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74  le==(-1) then it
219f0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
21a00 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20  o compare equal 
21a10 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74  to an equivalent
21a20 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77   element in pA w
21a30 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  ith Expr.iTable=
21a40 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  =iTab..**.** The
21a50 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20 62   pA side might b
21a60 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53  e using TK_REGIS
21a70 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69 73  TER.  If that is
21a80 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70 42   the case and pB
21a90 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67   is.** not using
21aa0 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74   TK_REGISTER but
21ab0 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65 71   is otherwise eq
21ac0 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73  uivalent, then s
21ad0 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  till return 0..*
21ae0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74  *.** Sometimes t
21af0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
21b00 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69   return 2 even i
21b10 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65 73  f the two expres
21b20 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20  sions.** really 
21b30 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  are equivalent. 
21b40 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72   If we cannot pr
21b50 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ove that the exp
21b60 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20  ressions are.** 
21b70 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65  identical, we re
21b80 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62  turn 2 just to b
21b90 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74  e safe.  So if t
21ba0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
21bb0 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79  eturns 2, then y
21bc0 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79  ou do not really
21bd0 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69   know for certai
21be0 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20  n if the two.** 
21bf0 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
21c00 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69  the same.  But i
21c10 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72  f you get a 0 or
21c20 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20   1 return, then 
21c30 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75  you.** can be su
21c40 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  re the expressio
21c50 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  ns are the same.
21c60 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20    In the places 
21c70 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  where.** this ro
21c80 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69  utine is used, i
21c90 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20  t does not hurt 
21ca0 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61 20  to get an extra 
21cb0 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74  2 - that.** just
21cc0 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
21cd0 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73   some slightly s
21ce0 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74  lower code.  But
21cf0 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e   returning.** an
21d00 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20   incorrect 0 or 
21d10 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  1 could lead to 
21d20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a  a malfunction..*
21d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
21d40 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
21d50 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74  A, Expr *pB, int
21d60 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f   iTab){.  u32 co
21d70 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69  mbinedFlags;.  i
21d80 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d  f( pA==0 || pB==
21d90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21da0 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a  pB==pA ? 0 : 2;.
21db0 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c    }.  combinedFl
21dc0 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20  ags = pA->flags 
21dd0 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  | pB->flags;.  i
21de0 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
21df0 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29   & EP_IntValue )
21e00 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66  {.    if( (pA->f
21e10 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45  lags&pB->flags&E
21e20 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26  P_IntValue)!=0 &
21e30 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d  & pA->u.iValue==
21e40 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a  pB->u.iValue ){.
21e50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21e60 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
21e70 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
21e80 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a  ->op!=pB->op ){.
21e90 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d      if( pA->op==
21ea0 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71  TK_COLLATE && sq
21eb0 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
21ec0 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20  (pA->pLeft, pB, 
21ed0 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20  iTab)<2 ){.     
21ee0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
21ef0 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d  .    if( pB->op=
21f00 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
21f10 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21f20 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c  e(pA, pB->pLeft,
21f30 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
21f40 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21f50 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  }.    return 2;.
21f60 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
21f70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  !=TK_COLUMN && A
21f80 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b  LWAYS(pA->op!=TK
21f90 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20  _AGG_COLUMN) && 
21fa0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a  pA->u.zToken ){.
21fb0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
21fc0 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e  A->u.zToken,pB->
21fd0 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a  u.zToken)!=0 ){.
21fe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d        return pA-
21ff0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
22000 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20  ? 1 : 2;.    }. 
22010 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c   }.  if( (pA->fl
22020 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
22030 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26  t)!=(pB->flags &
22040 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20   EP_Distinct) ) 
22050 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20  return 2;.  if( 
22060 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64  ALWAYS((combined
22070 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e  Flags & EP_Token
22080 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20  Only)==0) ){.   
22090 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61   if( combinedFla
220a0 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
220b0 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  t ) return 2;.  
220c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
220d0 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65  rCompare(pA->pLe
220e0 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  ft, pB->pLeft, i
220f0 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
22100 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
22110 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
22120 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67  pRight, pB->pRig
22130 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75  ht, iTab) ) retu
22140 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 2;.    if( sq
22150 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
22160 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74  pare(pA->x.pList
22170 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69  , pB->x.pList, i
22180 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b  Tab) ) return 2;
22190 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  .    if( ALWAYS(
221a0 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26  (combinedFlags &
221b0 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29   EP_Reduced)==0)
221c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
221d0 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69  ->iColumn!=pB->i
221e0 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20  Column ) return 
221f0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d  2;.      if( pA-
22200 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
22210 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20 28  ble .       && (
22220 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62  pA->iTable!=iTab
22230 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54   || NEVER(pB->iT
22240 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75  able>=0)) ) retu
22250 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 2;.    }.  }.
22260 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22270 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
22280 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
22290 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  s.  Return 0 if 
222a0 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
222b0 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a  al and .** non-z
222c0 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66 66  ero if they diff
222d0 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
222e0 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65  *.** If any sube
222f0 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73  lement of pB has
22300 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d   Expr.iTable==(-
22310 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c  1) then it is al
22320 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70  lowed.** to comp
22330 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20  are equal to an 
22340 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65  equivalent eleme
22350 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45 78  nt in pA with Ex
22360 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e  pr.iTable==iTab.
22370 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
22380 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ine might return
22390 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71   non-zero for eq
223a0 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73  uivalent ExprLis
223b0 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79  ts.  The.** only
223c0 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c   consequence wil
223d0 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70  l be disabled op
223e0 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75  timizations.  Bu
223f0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  t this routine.*
22400 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74  * must never ret
22410 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f  urn 0 if the two
22420 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74   ExprList object
22430 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
22440 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63   or.** a malfunc
22450 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
22460 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
22470 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f   pointers are co
22480 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 74  nsidered to be t
22490 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20  he same.  But a 
224a0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  NULL pointer.** 
224b0 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20 66  always differs f
224c0 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70  rom a non-NULL p
224d0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
224e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
224f0 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a  mpare(ExprList *
22500 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42  pA, ExprList *pB
22510 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
22520 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
22530 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74  0 && pB==0 ) ret
22540 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d  urn 0;.  if( pA=
22550 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65  =0 || pB==0 ) re
22560 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41  turn 1;.  if( pA
22570 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78  ->nExpr!=pB->nEx
22580 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pr ) return 1;. 
22590 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
225a0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
225b0 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20   Expr *pExprA = 
225c0 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  pA->a[i].pExpr;.
225d0 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 42      Expr *pExprB
225e0 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pB->a[i].pExp
225f0 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61  r;.    if( pA->a
22600 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70  [i].sortOrder!=p
22610 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  B->a[i].sortOrde
22620 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  r ) return 1;.  
22630 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22640 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c  rCompare(pExprA,
22650 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20 29   pExprB, iTab) )
22660 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
22670 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22680 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
22690 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20  if we can prove 
226a0 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77  the pE2 will alw
226b0 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20 70  ays be true if p
226c0 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20  E1 is.** true.  
226d0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
226e0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65  we cannot comple
226f0 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20  te the proof or 
22700 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20  if pE2 might.** 
22710 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70  be false.  Examp
22720 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  les:.**.**     p
22730 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70  E1: x==5       p
22740 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20  E2: x==5        
22750 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75       Result: tru
22760 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e  e.**     pE1: x>
22770 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d  0        pE2: x=
22780 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52  =5             R
22790 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20  esult: false.** 
227a0 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20      pE1: x=21   
227b0 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52      pE2: x=21 OR
227c0 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74   y=43     Result
227d0 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45  : true.**     pE
227e0 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70 45  1: x!=123     pE
227f0 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
22800 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65      Result: true
22810 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d  .**     pE1: x!=
22820 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20 49  ?1      pE2: x I
22830 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65  S NOT NULL    Re
22840 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
22850 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c    pE1: x IS NULL
22860 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
22870 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
22880 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
22890 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45 32  : x IS ?2    pE2
228a0 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  : x IS NOT NULL 
228b0 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65     Reuslt: false
228c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70  .**.** When comp
228d0 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20  aring TK_COLUMN 
228e0 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70 45  nodes between pE
228f0 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45  1 and pE2, if pE
22900 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54  2 has.** Expr.iT
22910 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75  able<0 then assu
22920 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65  me a table numbe
22930 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e  r given by iTab.
22940 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64  .**.** When in d
22950 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c  oubt, return fal
22960 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74  se.  Returning t
22970 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20 61  rue might give a
22980 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
22990 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65  improvement.  Re
229a0 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69  turning false mi
229b0 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72 66  ght cause a perf
229c0 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
229d0 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c  n, but.** it wil
229e0 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74 68  l always give th
229f0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
22a00 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c   and is hence al
22a10 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e  ways safe..*/.in
22a20 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70  t sqlite3ExprImp
22a30 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a 70  liesExpr(Expr *p
22a40 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69  E1, Expr *pE2, i
22a50 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20  nt iTab){.  if( 
22a60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
22a70 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61  re(pE1, pE2, iTa
22a80 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  b)==0 ){.    ret
22a90 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
22aa0 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a   pE2->op==TK_OR.
22ab0 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45 78     && (sqlite3Ex
22ac0 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45  prImpliesExpr(pE
22ad0 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69  1, pE2->pLeft, i
22ae0 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20 20  Tab).           
22af0 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72    || sqlite3Expr
22b00 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
22b10 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54   pE2->pRight, iT
22b20 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72  ab) ).  ){.    r
22b30 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
22b40 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e  f( pE2->op==TK_N
22b50 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c  OTNULL.   && sql
22b60 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
22b70 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d  pE1->pLeft, pE2-
22b80 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30  >pLeft, iTab)==0
22b90 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21  .   && (pE1->op!
22ba0 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45  =TK_ISNULL && pE
22bb0 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20  1->op!=TK_IS).  
22bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
22bd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  .}../*.** An ins
22bf0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
22c00 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
22c10 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
22c20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74  tree walker.** t
22c30 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63  o count referenc
22c40 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75  es to table colu
22c50 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d  mns in the argum
22c60 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61  ents of an .** a
22c70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
22c80 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  n, in order to i
22c90 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  mplement the.** 
22ca0 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54  sqlite3FunctionT
22cb0 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65  hisSrc() routine
22cc0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43  ..*/.struct SrcC
22cd0 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74  ount {.  SrcList
22ce0 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65   *pSrc;   /* One
22cf0 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d   particular FROM
22d00 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73   clause in a nes
22d10 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ted query */.  i
22d20 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20  nt nThis;       
22d30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
22d40 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
22d50 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a  ns in pSrcList *
22d60 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20  /.  int nOther; 
22d70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22d80 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
22d90 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72  columns in other
22da0 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f   FROM clauses */
22db0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  .};../*.** Count
22dc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
22dd0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c  eferences to col
22de0 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  umns..*/.static 
22df0 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74  int exprSrcCount
22e00 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
22e10 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
22e20 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29    /* The NEVER()
22e30 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74   on the second t
22e40 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20 73  erm is because s
22e50 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
22e60 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a  esThisSrc().  **
22e70 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65   is always calle
22e80 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  d before sqlite3
22e90 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22ea0 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74  gates() and so t
22eb0 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d  he.  ** TK_COLUM
22ec0 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  Ns have not yet 
22ed0 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69  been converted i
22ee0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
22ef0 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69  N.  If.  ** sqli
22f00 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
22f10 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65 64  hisSrc() is used
22f20 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20   differently in 
22f30 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a  the future, the.
22f40 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c    ** NEVER() wil
22f50 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d  l need to be rem
22f60 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  oved. */.  if( p
22f70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
22f80 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78  UMN || NEVER(pEx
22f90 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
22fa0 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e  OLUMN) ){.    in
22fb0 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t i;.    struct 
22fc0 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57  SrcCount *p = pW
22fd0 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75  alker->u.pSrcCou
22fe0 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  nt;.    SrcList 
22ff0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
23000 0a 20 20 20 20 69 6e 74 20 6e 53 72 63 20 3d 20  .    int nSrc = 
23010 70 53 72 63 20 3f 20 70 53 72 63 2d 3e 6e 53 72  pSrc ? pSrc->nSr
23020 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  c : 0;.    for(i
23030 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b 29  =0; i<nSrc; i++)
23040 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
23050 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d  r->iTable==pSrc-
23060 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20  >a[i].iCursor ) 
23070 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23080 20 69 66 28 20 69 3c 6e 53 72 63 20 29 7b 0a 20   if( i<nSrc ){. 
23090 20 20 20 20 20 70 2d 3e 6e 54 68 69 73 2b 2b 3b       p->nThis++;
230a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
230b0 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b 3b 0a 20    p->nOther++;. 
230c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
230d0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
230e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
230f0 6e 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ne if any of the
23100 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
23110 65 20 70 45 78 70 72 20 46 75 6e 63 74 69 6f 6e  e pExpr Function
23120 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 70 53   reference.** pS
23130 72 63 4c 69 73 74 2e 20 20 52 65 74 75 72 6e 20  rcList.  Return 
23140 74 72 75 65 20 69 66 20 74 68 65 79 20 64 6f 2e  true if they do.
23150 20 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74 72    Also return tr
23160 75 65 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ue if the functi
23170 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20 61 72 67  on.** has no arg
23180 75 6d 65 6e 74 73 20 6f 72 20 68 61 73 20 6f 6e  uments or has on
23190 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ly constant argu
231a0 6d 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 66  ments.  Return f
231b0 61 6c 73 65 20 69 66 20 70 45 78 70 72 0a 2a 2a  alse if pExpr.**
231c0 20 72 65 66 65 72 65 6e 63 65 73 20 63 6f 6c 75   references colu
231d0 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63 6f 6c 75  mns but not colu
231e0 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73 20 66 6f  mns of tables fo
231f0 75 6e 64 20 69 6e 20 70 53 72 63 4c 69 73 74 2e  und in pSrcList.
23200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23210 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
23220 72 63 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  rc(Expr *pExpr, 
23230 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
23240 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
23250 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
23260 74 20 63 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  t cnt;.  assert(
23270 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
23280 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
23290 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
232a0 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
232b0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
232c0 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a 20 20 77  xprSrcCount;.  w
232d0 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20 3d 20 26  .u.pSrcCount = &
232e0 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53 72 63 20  cnt;.  cnt.pSrc 
232f0 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 63 6e  = pSrcList;.  cn
23300 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 63  t.nThis = 0;.  c
23310 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30 3b 0a 20  nt.nOther = 0;. 
23320 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
23330 4c 69 73 74 28 26 77 2c 20 70 45 78 70 72 2d 3e  List(&w, pExpr->
23340 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  x.pList);.  retu
23350 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e 30 20 7c  rn cnt.nThis>0 |
23360 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d 3d 30 3b  | cnt.nOther==0;
23370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
23380 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
23390 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  he pAggInfo->aCo
233a0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  l[] array.  Retu
233b0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
233c0 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
233d0 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
233e0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
233f0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
23400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
23410 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 73 71  AggInfoColumn(sq
23420 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e  lite3 *db, AggIn
23430 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e  fo *pInfo){.  in
23440 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 43  t i;.  pInfo->aC
23450 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61  ol = sqlite3Arra
23460 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20  yAllocate(.     
23470 20 20 64 62 2c 0a 20 20 20 20 20 20 20 70 49 6e    db,.       pIn
23480 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20 20 20 20  fo->aCol,.      
23490 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 61   sizeof(pInfo->a
234a0 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  Col[0]),.       
234b0 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 2c  &pInfo->nColumn,
234c0 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
234d0 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
234e0 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e   ../*.** Add a n
234f0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
23500 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
23510 63 5b 5d 20 61 72 72 61 79 2e 20 20 52 65 74 75  c[] array.  Retu
23520 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 0a  rn the index of.
23530 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ** the new eleme
23540 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  nt.  Return a ne
23550 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
23560 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2e 0a 2a   malloc fails..*
23570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
23580 41 67 67 49 6e 66 6f 46 75 6e 63 28 73 71 6c 69  AggInfoFunc(sqli
23590 74 65 33 20 2a 64 62 2c 20 41 67 67 49 6e 66 6f  te3 *db, AggInfo
235a0 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20   *pInfo){.  int 
235b0 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e  i;.  pInfo->aFun
235c0 63 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  c = sqlite3Array
235d0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
235e0 20 64 62 2c 20 0a 20 20 20 20 20 20 20 70 49 6e   db, .       pIn
235f0 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20 20 20 20  fo->aFunc,.     
23600 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e    sizeof(pInfo->
23610 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20 20 20 20  aFunc[0]),.     
23620 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2c    &pInfo->nFunc,
23630 0a 20 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a  .       &i.  );.
23640 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 20 20 20    return i;.}   
23650 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73   ../*.** This is
23660 20 74 68 65 20 78 45 78 70 72 43 61 6c 6c 62 61   the xExprCallba
23670 63 6b 20 66 6f 72 20 61 20 74 72 65 65 20 77 61  ck for a tree wa
23680 6c 6b 65 72 2e 20 20 49 74 20 69 73 20 75 73 65  lker.  It is use
23690 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  d to.** implemen
236a0 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  t sqlite3ExprAna
236b0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
236c0 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78  .  See sqlite3Ex
236d0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
236e0 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74  tes.** for addit
236f0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
23700 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
23710 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
23720 65 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  e(Walker *pWalke
23730 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
23740 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
23750 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 70  Context *pNC = p
23760 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
23770 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
23780 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
23790 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
237a0 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
237b0 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20 2a 70 41  t;.  AggInfo *pA
237c0 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d 3e 70 41  ggInfo = pNC->pA
237d0 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77 69 74 63  ggInfo;..  switc
237e0 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
237f0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
23800 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
23810 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
23820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
23830 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
23840 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
23850 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
23860 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
23870 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ;.      /* Check
23880 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63   to see if the c
23890 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f 6e 65 20  olumn is in one 
238a0 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
238b0 20 74 68 65 20 46 52 4f 4d 0a 20 20 20 20 20 20   the FROM.      
238c0 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  ** clause of the
238d0 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
238e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
238f0 57 41 59 53 28 70 53 72 63 4c 69 73 74 21 3d 30  WAYS(pSrcList!=0
23900 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
23910 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23920 20 2a 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69   *pItem = pSrcLi
23930 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 66  st->a;.        f
23940 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
23950 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
23960 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
23970 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
23980 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a 20 20 20  o_col *pCol;.   
23990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
239a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
239b0 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
239c0 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
239d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
239e0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
239f0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 29  pItem->iCursor )
23a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
23a10 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
23a20 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
23a30 73 20 74 68 61 74 20 70 45 78 70 72 20 72 65 66  s that pExpr ref
23a40 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 0a 20  ers to a table. 
23a50 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
23a60 61 74 20 69 73 20 69 6e 20 74 68 65 20 46 52 4f  at is in the FRO
23a70 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
23a80 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
23a90 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a    .            *
23aa0 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  *.            **
23ab0 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   Make an entry f
23ac0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e  or the column in
23ad0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
23ae0 5d 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 20  ] if there.     
23af0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74         ** is not
23b00 20 61 6e 20 65 6e 74 72 79 20 74 68 65 72 65 20   an entry there 
23b10 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 20 20 20  already..       
23b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23b30 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
23b40 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 70 41         pCol = pA
23b50 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 0a 20 20  ggInfo->aCol;.  
23b60 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d            for(k=
23b70 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; k<pAggInfo->n
23b80 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20 70 43 6f  Column; k++, pCo
23b90 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
23ba0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 54      if( pCol->iT
23bb0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
23bc0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
23bd0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
23be0 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69  Column==pExpr->i
23bf0 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
23c00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23c30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23c40 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f  k>=pAggInfo->nCo
23c50 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20 20 20 20  lumn).          
23c60 20 20 20 26 26 20 28 6b 20 3d 20 61 64 64 41 67     && (k = addAg
23c70 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70 50 61 72  gInfoColumn(pPar
23c80 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f  se->db, pAggInfo
23c90 29 29 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ))>=0 .         
23ca0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
23cb0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 41 67 67      pCol = &pAgg
23cc0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d 3b 0a 20  Info->aCol[k];. 
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
23ce0 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72 2d  l->pTab = pExpr-
23cf0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
23d00 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c       pCol->iTabl
23d10 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
23d20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
23d30 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   pCol->iColumn =
23d40 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
23d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23d60 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  Col->iMem = ++pP
23d70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
23d80 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23d90 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
23da0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
23db0 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72 20 3d 20    pCol->pExpr = 
23dc0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
23dd0 20 20 20 20 20 69 66 28 20 70 41 67 67 49 6e 66       if( pAggInf
23de0 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  o->pGroupBy ){. 
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23e00 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20 20 20 20  nt j, n;.       
23e10 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
23e20 74 20 2a 70 47 42 20 3d 20 70 41 67 67 49 6e 66  t *pGB = pAggInf
23e30 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  o->pGroupBy;.   
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
23e50 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23e60 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47 42 2d 3e  m *pTerm = pGB->
23e70 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a;.             
23e80 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e 45 78 70     n = pGB->nExp
23e90 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
23ea0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
23eb0 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
23ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ed0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54 65    Expr *pE = pTe
23ee0 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23f00 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55   pE->op==TK_COLU
23f10 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61 62 6c 65  MN && pE->iTable
23f20 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
23f30 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
23f40 20 20 20 20 20 20 20 20 20 70 45 2d 3e 69 43 6f           pE->iCo
23f50 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
23f60 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
23f70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
23f80 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20  ->iSorterColumn 
23f90 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
23fa0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23ff0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
24000 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30 20 29 7b  orterColumn<0 ){
24010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24020 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
24030 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e 66 6f 2d  lumn = pAggInfo-
24040 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2b  >nSortingColumn+
24050 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
24060 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
24070 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
24080 54 68 65 72 65 20 69 73 20 6e 6f 77 20 61 6e 20  There is now an 
24090 65 6e 74 72 79 20 66 6f 72 20 70 45 78 70 72 20  entry for pExpr 
240a0 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  in pAggInfo->aCo
240b0 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20 20 20 20  l[] (either.    
240c0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75          ** becau
240d0 73 65 20 69 74 20 77 61 73 20 74 68 65 72 65 20  se it was there 
240e0 62 65 66 6f 72 65 20 6f 72 20 62 65 63 61 75 73  before or becaus
240f0 65 20 77 65 20 6a 75 73 74 20 63 72 65 61 74 65  e we just create
24100 64 20 69 74 29 2e 0a 20 20 20 20 20 20 20 20 20  d it)..         
24110 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68     ** Convert th
24120 65 20 70 45 78 70 72 20 74 6f 20 62 65 20 61 20  e pExpr to be a 
24130 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 72 65  TK_AGG_COLUMN re
24140 66 65 72 72 69 6e 67 20 74 6f 20 74 68 61 74 0a  ferring to that.
24150 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
24160 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20  AggInfo->aCol[] 
24170 65 6e 74 72 79 2e 0a 20 20 20 20 20 20 20 20 20  entry..         
24180 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
24190 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
241a0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
241b0 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20  oReduce);.      
241c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
241d0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
241e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
241f0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
24200 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
24210 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
24220 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20 20 20 20   = (i16)k;.     
24230 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
24240 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
24250 69 66 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  if pExpr->iTable
24260 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ==pItem->iCursor
24270 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 20 2f 2a   */.        } /*
24280 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 70   end loop over p
24290 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 20 20 20  SrcList */.     
242a0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
242b0 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
242c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
242d0 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
242e0 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
242f0 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41 67 67 46  lags & NC_InAggF
24300 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20 20 20 26  unc)==0.       &
24310 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61 6c 6b 65  & pWalker->walke
24320 72 44 65 70 74 68 3d 3d 70 45 78 70 72 2d 3e 6f  rDepth==pExpr->o
24330 70 32 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  p2.      ){.    
24340 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
24350 73 65 65 20 69 66 20 70 45 78 70 72 20 69 73 20  see if pExpr is 
24360 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
24370 6e 6f 74 68 65 72 20 61 67 67 72 65 67 61 74 65  nother aggregate
24380 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e   .        ** fun
24390 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 6c  ction that is al
243a0 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 41 67  ready in the pAg
243b0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  gInfo structure.
243c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
243d0 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66     struct AggInf
243e0 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d 20 3d 20  o_func *pItem = 
243f0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
24400 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
24410 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
24420 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  unc; i++, pItem+
24430 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
24440 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
24450 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
24460 72 2c 20 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30  r, pExpr, -1)==0
24470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24480 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
24490 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
244a0 20 20 20 20 20 69 66 28 20 69 3e 3d 70 41 67 67       if( i>=pAgg
244b0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29 7b 0a 20  Info->nFunc ){. 
244c0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 45 78 70           /* pExp
244d0 72 20 69 73 20 6f 72 69 67 69 6e 61 6c 2e 20 20  r is original.  
244e0 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e 74 72 79  Make a new entry
244f0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   in pAggInfo->aF
24500 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  unc[].          
24510 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
24520 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
24530 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
24540 20 69 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 46   i = addAggInfoF
24550 75 6e 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  unc(pParse->db, 
24560 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pAggInfo);.     
24570 20 20 20 20 20 69 66 28 20 69 3e 3d 30 20 29 7b       if( i>=0 ){
24580 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
24590 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
245a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
245b0 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
245c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 20            pItem 
245d0 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  = &pAggInfo->aFu
245e0 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  nc[i];.         
245f0 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
24600 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
24610 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4d 65 6d       pItem->iMem
24620 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
24630 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  m;.            a
24640 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
24650 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
24660 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
24670 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
24680 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ->pFunc = sqlite
24690 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
246a0 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
246c0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 73 71  pr->u.zToken, sq
246d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
246e0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 0a  xpr->u.zToken),.
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73     pExpr->x.pLis
24710 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t ? pExpr->x.pLi
24720 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65  st->nExpr : 0, e
24730 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
24740 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
24750 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
24760 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ct ){.          
24770 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74      pItem->iDist
24780 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
24790 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Tab++;.         
247a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
247b0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
247c0 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
247d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
247e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
247f0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   }.        /* Ma
24800 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74 20 74  ke pExpr point t
24810 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  o the appropriat
24820 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  e pAggInfo->aFun
24830 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20 20 20  c[] entry.      
24840 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
24850 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
24860 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
24870 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
24880 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20  uced) );.       
24890 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
248a0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
248b0 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20 20 20  Reduce);.       
248c0 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28   pExpr->iAgg = (
248d0 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20 20 70  i16)i;.        p
248e0 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
248f0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
24900 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
24910 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  une;.      }else
24920 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
24930 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
24940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24950 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
24960 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63  ntinue;.}.static
24970 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
24980 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 28 57  egatesInSelect(W
24990 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
249a0 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
249b0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
249c0 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20  ETER(pWalker);. 
249d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
249e0 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  R(pSelect);.  re
249f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
24a00 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  e;.}../*.** Anal
24a10 79 7a 65 20 74 68 65 20 70 45 78 70 72 20 65 78  yze the pExpr ex
24a20 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
24a30 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
24a40 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
24a50 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
24a60 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
24a70 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f 20 6f  ded to AggInfo o
24a80 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43 2d 3e  bject that pNC->
24a90 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f 69 6e  pAggInfo.** poin
24aa0 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69 6f 6e  ts to.  Addition
24ab0 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65 20 6d  al entries are m
24ac0 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67 49 6e  ade on the AggIn
24ad0 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a 2a 20  fo object as.** 
24ae0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
24af0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
24b00 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
24b10 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
24b20 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
24b30 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
24b40 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
24b50 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f 0a 76  xprNames()..*/.v
24b60 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
24b70 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
24b80 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e  (NameContext *pN
24b90 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
24ba0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
24bb0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
24bc0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
24bd0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  prCallback = ana
24be0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b 0a 20  lyzeAggregate;. 
24bf0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
24c00 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
24c10 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74 3b 0a  egatesInSelect;.
24c20 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
24c30 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
24c40 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
24c50 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
24c60 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a  (&w, pExpr);.}..
24c70 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c 69 74  /*.** Call sqlit
24c80 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
24c90 72 65 67 61 74 65 73 28 29 20 66 6f 72 20 65 76  regates() for ev
24ca0 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
24cb0 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  n an.** expressi
24cc0 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  on list.  Return
24cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
24ce0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
24cf0 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f 75 6e  an error is foun
24d00 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20  d, the analysis 
24d10 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a 2a 2f  is cut short..*/
24d20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
24d30 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
24d40 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
24d50 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
24d60 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  t){.  struct Exp
24d70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
24d80 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  m;.  int i;.  if
24d90 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
24da0 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
24db0 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
24dc0 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
24dd0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  em++){.      sql
24de0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
24df0 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c 20 70  ggregates(pNC, p
24e00 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
24e10 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
24e20 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69 6e 67   Allocate a sing
24e30 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65 72 20  le new register 
24e40 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c 64 20  for use to hold 
24e50 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69 61 74  some intermediat
24e60 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69 6e 74  e result..*/.int
24e70 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
24e80 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eg(Parse *pParse
24e90 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
24ea0 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29 7b 0a  >nTempReg==0 ){.
24eb0 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70 50 61      return ++pPa
24ec0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d 0a 20  rse->nMem;.  }. 
24ed0 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
24ee0 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61 72 73  aTempReg[--pPars
24ef0 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a 7d 0a  e->nTempReg];.}.
24f00 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
24f10 65 20 61 20 72 65 67 69 73 74 65 72 2c 20 6d 61  e a register, ma
24f20 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65 20 66  king available f
24f30 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73 6f 6d  or reuse for som
24f40 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72 70 6f  e other.** purpo
24f50 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  se..**.** If a r
24f60 65 67 69 73 74 65 72 20 69 73 20 63 75 72 72 65  egister is curre
24f70 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65 64 20  ntly being used 
24f80 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  by the column ca
24f90 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  che, then.** the
24fa0 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73   deallocation is
24fb0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
24fc0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
24fd0 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 73 0a   line that uses.
24fe0 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ** the register 
24ff0 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e 0a 2a  becomes stale..*
25000 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
25010 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50 61 72  leaseTempReg(Par
25020 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
25030 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69 52 65  iReg){.  if( iRe
25040 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 65  g && pParse->nTe
25050 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
25060 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
25070 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
25080 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
25090 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ache *p;.    for
250a0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
250b0 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
250c0 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
250d0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 20  i++, p++){.     
250e0 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52   if( p->iReg==iR
250f0 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  eg ){.        p-
25100 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a 20 20  >tempReg = 1;.  
25110 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
25120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
25130 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
25140 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  [pParse->nTempRe
25150 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20 20 7d  g++] = iReg;.  }
25160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
25170 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  te or deallocate
25180 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52 65 67   a block of nReg
25190 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67   consecutive reg
251a0 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20 73 71  isters.*/.int sq
251b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
251c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
251d0 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 69 6e   int nReg){.  in
251e0 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20 70 50  t i, n;.  i = pP
251f0 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3b  arse->iRangeReg;
25200 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  .  n = pParse->n
25210 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66 28 20  RangeReg;.  if( 
25220 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20 20 61  nReg<=n ){.    a
25230 73 73 65 72 74 28 20 21 75 73 65 64 41 73 43 6f  ssert( !usedAsCo
25240 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65  lumnCache(pParse
25250 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b 0a 20  , i, i+n-1) );. 
25260 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
25270 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a 20 20  eReg += nReg;.  
25280 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
25290 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20 20 7d  Reg -= nReg;.  }
252a0 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20 70 50  else{.    i = pP
252b0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
252c0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
252d0 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20 72 65  = nReg;.  }.  re
252e0 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64 20 73  turn i;.}.void s
252f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25300 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  pRange(Parse *pP
25310 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67 2c 20  arse, int iReg, 
25320 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73 71 6c  int nReg){.  sql
25330 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
25340 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52 65 67  ove(pParse, iReg
25350 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28 20 6e  , nReg);.  if( n
25360 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e  Reg>pParse->nRan
25370 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70 50 61  geReg ){.    pPa
25380 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d  rse->nRangeReg =
25390 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
253a0 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d 20 69  e->iRangeReg = i
253b0 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
253c0 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d 70 6f  * Mark all tempo
253d0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
253e0 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69 6c 61  s being unavaila
253f0 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e 0a 2a  ble for reuse..*
25400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
25410 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
25420 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
25430 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52    pParse->nTempR
25440 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  eg = 0;.  pParse
25450 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b  ->nRangeReg = 0;
25460 0a 7d 0a                                         .}.