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

Artifact a195d2d047ca59f9b87cae737b785d17cdd3cc3f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
0370: 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ons in the follo
0380: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
0390: 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61  all.** have an a
03a0: 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43  ffinity:.**.** C
03b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
03c0: 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  );.** SELECT * F
03d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a  ROM t1 WHERE a;.
03e0: 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20 62  ** SELECT a AS b
03f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62   FROM t1 WHERE b
0400: 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52  ;.** SELECT * FR
0410: 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65 6c  OM t1 WHERE (sel
0420: 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a  ect a from t1);.
0430: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45  */.char sqlite3E
0440: 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70 72  xprAffinity(Expr
0450: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
0460: 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  op;.  pExpr = sq
0470: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
0480: 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
0490: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
04a0: 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20 72  & EP_Generic ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d 20  eturn 0;.  op = 
04c0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28  pExpr->op;.  if(
04d0: 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29   op==TK_SELECT )
04e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  {.    assert( pE
04f0: 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78 49  xpr->flags&EP_xI
0500: 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20 72  sSelect );.    r
0510: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0520: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d  rAffinity(pExpr-
0530: 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  >x.pSelect->pELi
0540: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
0550: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
0560: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20  ITE_OMIT_CAST.  
0570: 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54 20  if( op==TK_CAST 
0580: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
0590: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
05a0: 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
05b0: 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ue) );.    retur
05c0: 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  n sqlite3Affinit
05d0: 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e 7a  yType(pExpr->u.z
05e0: 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a 23  Token, 0);.  }.#
05f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70 3d  endif.  if( (op=
0600: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 7c  =TK_AGG_COLUMN |
0610: 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  | op==TK_COLUMN 
0620: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
0630: 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70 72  ER) .   && pExpr
0640: 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a 20  ->pTab!=0.  ){. 
0650: 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45 47     /* op==TK_REG
0660: 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e  ISTER && pExpr->
0670: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
0680: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
0690: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a 2a  riginally.    **
06a0: 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75 74   a TK_COLUMN but
06b0: 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
06c0: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63 61  evaluated and ca
06d0: 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73 74  ched in a regist
06e0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20  er */.    int j 
06f0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
0700: 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20  ;.    if( j<0 ) 
0710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0720: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 61  F_INTEGER;.    a
0730: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 54  ssert( pExpr->pT
0740: 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e 70  ab && j<pExpr->p
0750: 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
0760: 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e 70   return pExpr->p
0770: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
0780: 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  inity;.  }.  ret
0790: 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  urn pExpr->affin
07a0: 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ity;.}../*.** Se
07b0: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  t the collating 
07c0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78 70  sequence for exp
07d0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74 6f  ression pExpr to
07e0: 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   be the collatin
07f0: 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e 61  g.** sequence na
0800: 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20 20  med by pToken.  
0810: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
0820: 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72 20  r to a new Expr 
0830: 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d 70  node that.** imp
0840: 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c 4c  lements the COLL
0850: 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a  ATE operator..**
0860: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
0870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
0880: 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66 61   occurs, that fa
0890: 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20 69  ct is recorded i
08a0: 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a 20  n pParse->db.** 
08b0: 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70 61  and the pExpr pa
08c0: 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75 72  rameter is retur
08d0: 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ned unchanged..*
08e0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
08f0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
0900: 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
0910: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rse,           /
0920: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0930: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
0940: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pr,             
0950: 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c 4c  /* Add the "COLL
0960: 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20 74  ATE" clause to t
0970: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
0980: 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  /.  const Token 
0990: 2a 70 43 6f 6c 6c 4e 61 6d 65 2c 20 20 2f 2a 20  *pCollName,  /* 
09a0: 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6e  Name of collatin
09b0: 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  g sequence */.  
09c0: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
09e0: 20 74 6f 20 64 65 71 75 6f 74 65 20 70 43 6f 6c   to dequote pCol
09f0: 6c 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  lName */.){.  if
0a00: 28 20 70 43 6f 6c 6c 4e 61 6d 65 2d 3e 6e 3e 30  ( pCollName->n>0
0a10: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e   ){.    Expr *pN
0a20: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
0a30: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
0a40: 2c 20 54 4b 5f 43 4f 4c 4c 41 54 45 2c 20 70 43  , TK_COLLATE, pC
0a50: 6f 6c 6c 4e 61 6d 65 2c 20 64 65 71 75 6f 74 65  ollName, dequote
0a60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a80: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0aa0: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0ab0: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0ac0: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0ae0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0af0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0b00: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0b10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0b20: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0b30: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b40: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 6f 6b   );.  sqlite3Tok
0b60: 65 6e 49 6e 69 74 28 26 73 2c 20 28 63 68 61 72  enInit(&s, (char
0b70: 2a 29 7a 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  *)zC);.  return 
0b80: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
0b90: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
0ba0: 65 2c 20 70 45 78 70 72 2c 20 26 73 2c 20 30 29  e, pExpr, &s, 0)
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b 69 70 20  ;.}../*.** Skip 
0bc0: 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43 4f 4c 4c  over any TK_COLL
0bd0: 41 54 45 20 6f 70 65 72 61 74 6f 72 73 20 61 6e  ATE operators an
0be0: 64 20 61 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29  d any unlikely()
0bf0: 0a 2a 2a 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  .** or likelihoo
0c00: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 74 20  d() function at 
0c10: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65  the root of an e
0c20: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78  xpression..*/.Ex
0c30: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 53  pr *sqlite3ExprS
0c40: 6b 69 70 43 6f 6c 6c 61 74 65 28 45 78 70 72 20  kipCollate(Expr 
0c50: 2a 70 45 78 70 72 29 7b 0a 20 20 77 68 69 6c 65  *pExpr){.  while
0c60: 28 20 70 45 78 70 72 20 26 26 20 45 78 70 72 48  ( pExpr && ExprH
0c70: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
0c80: 2c 20 45 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20  , EP_Skip) ){.  
0c90: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
0ca0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
0cb0: 55 6e 6c 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20  Unlikely) ){.   
0cc0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
0cd0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0ce0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
0cf0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0d00: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
0d10: 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20  ->nExpr>0 );.   
0d20: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
0d30: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
0d40: 4e 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  N );.      pExpr
0d50: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
0d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
0d70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0d80: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d90: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
0da0: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0db0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0dc0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0dd0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0de0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0df0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0e00: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0e10: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e20: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e30: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e40: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e50: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e60: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e70: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e80: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e90: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0ea0: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0eb0: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ec0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0ed0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ee0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ef0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0f00: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0f10: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f20: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f30: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f40: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f50: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f60: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f70: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f90: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0fa0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0fb0: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fc0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fe0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0ff0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
1000: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
1010: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1020: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1030: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1040: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1060: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1070: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1080: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1090: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
10a0: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
10b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10d0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10e0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
1100: 28 20 28 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  ( (op==TK_AGG_CO
1110: 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 43  LUMN || op==TK_C
1120: 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20 20 20  OLUMN.          
1130: 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  || op==TK_REGIST
1140: 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 54 52 49  ER || op==TK_TRI
1150: 47 47 45 52 29 0a 20 20 20 20 20 26 26 20 70 2d  GGER).     && p-
1160: 3e 70 54 61 62 21 3d 30 0a 20 20 20 20 29 7b 0a  >pTab!=0.    ){.
1170: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1180: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1190: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
11a0: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
11b0: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11c0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11d0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11e0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11f0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
1200: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
1210: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1220: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1230: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1240: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1250: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1260: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1270: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1280: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1290: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
12a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12d0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12e0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
12f0: 20 26 26 20 28 70 2d 3e 70 4c 65 66 74 2d 3e 66   && (p->pLeft->f
1300: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
1310: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
1320: 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 0a 20   p = p->pLeft;. 
1330: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1340: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 78 74 20      Expr *pNext 
1350: 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20   = p->pRight;.  
1360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 45 78 70        /* The Exp
1370: 72 2e 78 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76  r.x union is nev
1380: 65 72 20 75 73 65 64 20 61 74 20 74 68 65 20 73  er used at the s
1390: 61 6d 65 20 74 69 6d 65 20 61 73 20 45 78 70 72  ame time as Expr
13a0: 2e 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 20  .pRight */.     
13b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 78 2e     assert( p->x.
13c0: 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70  pList==0 || p->p
13d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13e0: 20 20 20 20 2f 2a 20 70 2d 3e 66 6c 61 67 73 20      /* p->flags 
13f0: 68 6f 6c 64 73 20 45 50 5f 43 6f 6c 6c 61 74 65  holds EP_Collate
1400: 20 61 6e 64 20 70 2d 3e 70 4c 65 66 74 2d 3e 66   and p->pLeft->f
1410: 6c 61 67 73 20 64 6f 65 73 20 6e 6f 74 2e 20 20  lags does not.  
1420: 41 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  And.        ** p
1430: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 63 61 6e 6e  ->x.pSelect cann
1440: 6f 74 2e 20 20 53 6f 20 69 66 20 70 2d 3e 78 2e  ot.  So if p->x.
1450: 70 4c 65 66 74 20 65 78 69 73 74 73 2c 20 69 74  pLeft exists, it
1460: 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 0a 20 20   must hold at.  
1470: 20 20 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 6f        ** least o
1480: 6e 65 20 45 50 5f 43 6f 6c 6c 61 74 65 2e 20 54  ne EP_Collate. T
1490: 68 75 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hus the followin
14a0: 67 20 74 77 6f 20 41 4c 57 41 59 53 2e 20 2a 2f  g two ALWAYS. */
14b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14c0: 78 2e 70 4c 69 73 74 21 3d 30 20 26 26 20 41 4c  x.pList!=0 && AL
14d0: 57 41 59 53 28 21 45 78 70 72 48 61 73 50 72 6f  WAYS(!ExprHasPro
14e0: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
14f0: 65 6c 65 63 74 29 29 20 29 7b 0a 20 20 20 20 20  elect)) ){.     
1500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 41        for(i=0; A
1520: 4c 57 41 59 53 28 69 3c 70 2d 3e 78 2e 70 4c 69  LWAYS(i<p->x.pLi
1530: 73 74 2d 3e 6e 45 78 70 72 29 3b 20 69 2b 2b 29  st->nExpr); i++)
1540: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1550: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1560: 79 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  y(p->x.pList->a[
1570: 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 43 6f 6c  i].pExpr, EP_Col
1580: 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  late) ){.       
1590: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
15a0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
15b0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
15c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
15f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
1600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1610: 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
1620: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1630: 66 28 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43  f( sqlite3CheckC
1640: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1650: 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43  Coll) ){ .    pC
1660: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  oll = 0;.  }.  r
1670: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1680: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
1690: 6e 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 63  n operand of a c
16a0: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
16b0: 6f 72 2e 20 20 61 66 66 32 20 69 73 20 74 68 65  or.  aff2 is the
16c0: 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74  .** type affinit
16d0: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 6f  y of the other o
16e0: 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
16f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1700: 65 0a 2a 2a 20 74 79 70 65 20 61 66 66 69 6e 69  e.** type affini
1710: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  ty that should b
1720: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 63  e used for the c
1730: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1740: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  or..*/.char sqli
1750: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1760: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
1770: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
1780: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
1790: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
17a0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
17b0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
17c0: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
17d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
17e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
17f0: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 0a  one has numeric.
1800: 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 74 79 2c      ** affinity,
1810: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
1820: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
1830: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
1840: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4e 75   if( sqlite3IsNu
1850: 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28 61 66  mericAffinity(af
1860: 66 31 29 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  f1) || sqlite3Is
1870: 4e 75 6d 65 72 69 63 41 66 66 69 6e 69 74 79 28  NumericAffinity(
1880: 61 66 66 32 29 20 29 7b 0a 20 20 20 20 20 20 72  aff2) ){.      r
1890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
18a0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
18b0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
18c0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
18d0: 42 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  B;.    }.  }else
18e0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
18f0: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
1900: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
1910: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
1920: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
1930: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
1940: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
1950: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
1960: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f  n SQLITE_AFF_BLO
1970: 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
1980: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
1990: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
19a0: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
19b0: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
19c0: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ity. */.    asse
19d0: 72 74 28 20 61 66 66 31 3d 3d 30 20 7c 7c 20 61  rt( aff1==0 || a
19e0: 66 66 32 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ff2==0 );.    re
19f0: 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66  turn (aff1 + aff
1a00: 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  2);.  }.}../*.**
1a10: 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70   pExpr is a comp
1a20: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
1a30: 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70    Return the typ
1a40: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1a50: 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70  should.** be app
1a60: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65  lied to both ope
1a70: 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64  rands prior to d
1a80: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69  oing the compari
1a90: 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  son..*/.static c
1aa0: 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  har comparisonAf
1ab0: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
1ac0: 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b  pr){.  char aff;
1ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1ae0: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70  ->op==TK_EQ || p
1af0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
1b00: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
1b10: 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _LT ||.         
1b20: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
1b30: 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  T || pExpr->op==
1b40: 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GE || pExpr->
1b50: 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20  op==TK_LE ||.   
1b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
1b70: 3d 3d 54 4b 5f 4e 45 20 7c 7c 20 70 45 78 70 72  ==TK_NE || pExpr
1b80: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 7c 7c 20 70  ->op==TK_IS || p
1b90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  Expr->op==TK_ISN
1ba0: 4f 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OT );.  assert( 
1bb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a  pExpr->pLeft );.
1bc0: 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 45    aff = sqlite3E
1bd0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
1be0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28  r->pLeft);.  if(
1bf0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
1c00: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
1c10: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
1c20: 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ty(pExpr->pRight
1c30: 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65 20  , aff);.  }else 
1c40: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c60: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c70: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
1c80: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1c90: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  pr->x.pSelect->p
1ca0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1cb0: 72 2c 20 61 66 66 29 3b 0a 20 20 7d 65 6c 73 65  r, aff);.  }else
1cc0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
1cd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
1ce0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
1cf0: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1d00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f  ** pExpr is a co
1d10: 6d 70 61 72 69 73 6f 6e 20 65 78 70 72 65 73 73  mparison express
1d20: 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c 20 27 3c  ion, eg. '=', '<
1d30: 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a  ', IN(...) etc..
1d40: 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ** idx_affinity 
1d50: 69 73 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  is the affinity 
1d60: 6f 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f  of an indexed co
1d70: 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20 74 72 75  lumn. Return tru
1d80: 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 6e 64 65  e.** if the inde
1d90: 78 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 20  x with affinity 
1da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 20 6d 61 79  idx_affinity may
1db0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1dc0: 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 63 6f 6d  ement.** the com
1dd0: 70 61 72 69 73 6f 6e 20 69 6e 20 70 45 78 70 72  parison in pExpr
1de0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
1e00: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
1e10: 72 20 69 64 78 5f 61 66 66 69 6e 69 74 79 29 7b  r idx_affinity){
1e20: 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 63 6f  .  char aff = co
1e30: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
1e40: 28 70 45 78 70 72 29 3b 0a 20 20 73 77 69 74 63  (pExpr);.  switc
1e50: 68 28 20 61 66 66 20 29 7b 0a 20 20 20 20 63 61  h( aff ){.    ca
1e60: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  se SQLITE_AFF_BL
1e70: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
1e80: 20 31 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   1;.    case SQL
1e90: 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 0a 20 20  ITE_AFF_TEXT:.  
1ea0: 20 20 20 20 72 65 74 75 72 6e 20 69 64 78 5f 61      return idx_a
1eb0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
1ec0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 64 65  AFF_TEXT;.    de
1ed0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1ee0: 75 72 6e 20 73 71 6c 69 74 65 33 49 73 4e 75 6d  urn sqlite3IsNum
1ef0: 65 72 69 63 41 66 66 69 6e 69 74 79 28 69 64 78  ericAffinity(idx
1f00: 5f 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 7d 0a  _affinity);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f20: 74 68 65 20 50 35 20 76 61 6c 75 65 20 74 68 61  the P5 value tha
1f30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1f40: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
1f50: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
1f60: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
1f70: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
1f80: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
1f90: 64 20 70 45 78 70 72 32 2e 0a 2a 2f 0a 73 74 61  d pExpr2..*/.sta
1fa0: 74 69 63 20 75 38 20 62 69 6e 61 72 79 43 6f 6d  tic u8 binaryCom
1fb0: 70 61 72 65 50 35 28 45 78 70 72 20 2a 70 45 78  pareP5(Expr *pEx
1fc0: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1fd0: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1fe0: 6c 29 7b 0a 20 20 75 38 20 61 66 66 20 3d 20 28  l){.  u8 aff = (
1ff0: 63 68 61 72 29 73 71 6c 69 74 65 33 45 78 70 72  char)sqlite3Expr
2000: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29  Affinity(pExpr2)
2010: 3b 0a 20 20 61 66 66 20 3d 20 28 75 38 29 73 71  ;.  aff = (u8)sq
2020: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
2030: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
2040: 29 20 7c 20 28 75 38 29 6a 75 6d 70 49 66 4e 75  ) | (u8)jumpIfNu
2050: 6c 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 66 66  ll;.  return aff
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2070: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2080: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
2090: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
20a0: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
20b0: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
20c0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
20d0: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
20e0: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
20f0: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
2100: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
2110: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
2120: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
2130: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
2140: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
2150: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
2160: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
2170: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
2180: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
2190: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
21a0: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
21b0: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
21c0: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
21d0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
21e0: 52 69 67 68 74 20 28 62 75 74 20 6e 6f 74 20 70  Right (but not p
21f0: 4c 65 66 74 29 20 6d 61 79 20 62 65 20 61 20 6e  Left) may be a n
2200: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 49 6e 20  ull pointer. In 
2210: 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 74  this case,.** it
2220: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
2230: 65 64 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a  ed..*/.CollSeq *
2240: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
2250: 70 61 72 65 43 6f 6c 6c 53 65 71 28 0a 20 20 50  pareCollSeq(.  P
2260: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2270: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 0a 20   Expr *pLeft, . 
2280: 20 45 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b   Expr *pRight.){
2290: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
22a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  l;.  assert( pLe
22b0: 66 74 20 29 3b 0a 20 20 69 66 28 20 70 4c 65 66  ft );.  if( pLef
22c0: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  t->flags & EP_Co
22d0: 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 70 43 6f  llate ){.    pCo
22e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
22f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2300: 70 4c 65 66 74 29 3b 0a 20 20 7d 65 6c 73 65 20  pLeft);.  }else 
2310: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 28 70  if( pRight && (p
2320: 52 69 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45  Right->flags & E
2330: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
2340: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2350: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2360: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
2370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2380: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2390: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
23a0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28   pLeft);.    if(
23b0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
23c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
23d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
23e0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pColl;.}../*.** 
2410: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
2420: 72 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  r a comparison o
2430: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  perator..*/.stat
2440: 69 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61  ic int codeCompa
2450: 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  re(.  Parse *pPa
2460: 72 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70  rse,    /* The p
2470: 61 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65  arsing (and code
2480: 20 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e   generating) con
2490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
24a0: 70 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54  pLeft,      /* T
24b0: 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
24c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
24d0: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69  t,     /* The ri
24e0: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
24f0: 20 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20   int opcode,    
2500: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72     /* The compar
2510: 69 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  ison opcode */. 
2520: 20 69 6e 74 20 69 6e 31 2c 20 69 6e 74 20 69 6e   int in1, int in
2530: 32 2c 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68  2, /* Register h
2540: 6f 6c 64 69 6e 67 20 6f 70 65 72 61 6e 64 73 20  olding operands 
2550: 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
2560: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
2570: 65 72 65 20 69 66 20 74 72 75 65 2e 20 20 2a 2f  ere if true.  */
2580: 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  .  int jumpIfNul
2590: 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c  l    /* If true,
25a0: 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65 72 20   jump if either 
25b0: 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c 4c 20  operand is NULL 
25c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 35 3b 0a  */.){.  int p5;.
25d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 43 6f    int addr;.  Co
25e0: 6c 6c 53 65 71 20 2a 70 34 3b 0a 0a 20 20 70 34  llSeq *p4;..  p4
25f0: 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79   = sqlite3Binary
2600: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
2610: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
2620: 69 67 68 74 29 3b 0a 20 20 70 35 20 3d 20 62 69  ight);.  p5 = bi
2630: 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 70 4c  naryCompareP5(pL
2640: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d  eft, pRight, jum
2650: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 61 64 64 72  pIfNull);.  addr
2660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2670: 64 4f 70 34 28 70 50 61 72 73 65 2d 3e 70 56 64  dOp4(pParse->pVd
2680: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 69 6e 32 2c  be, opcode, in2,
2690: 20 64 65 73 74 2c 20 69 6e 31 2c 0a 20 20 20 20   dest, in1,.    
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 34         (void*)p4
26c0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
26d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26e0: 67 65 50 35 28 70 50 61 72 73 65 2d 3e 70 56 64  geP5(pParse->pVd
26f0: 62 65 2c 20 28 75 38 29 70 35 29 3b 0a 20 20 72  be, (u8)p5);.  r
2700: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
2710: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
2720: 50 52 5f 44 45 50 54 48 3e 30 0a 2f 2a 0a 2a 2a  PR_DEPTH>0./*.**
2730: 20 43 68 65 63 6b 20 74 68 61 74 20 61 72 67 75   Check that argu
2740: 6d 65 6e 74 20 6e 48 65 69 67 68 74 20 69 73 20  ment nHeight is 
2750: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2760: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2770: 6d 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  m.** expression 
2780: 64 65 70 74 68 20 61 6c 6c 6f 77 65 64 2e 20 49  depth allowed. I
2790: 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 6c 65 61  f it is not, lea
27a0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
27b0: 61 67 65 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65  age in.** pParse
27c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27d0: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
27e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
27f0: 6e 74 20 6e 48 65 69 67 68 74 29 7b 0a 20 20 69  nt nHeight){.  i
2800: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2810: 4b 3b 0a 20 20 69 6e 74 20 6d 78 48 65 69 67 68  K;.  int mxHeigh
2820: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
2830: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2840: 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3b  MIT_EXPR_DEPTH];
2850: 0a 20 20 69 66 28 20 6e 48 65 69 67 68 74 3e 6d  .  if( nHeight>m
2860: 78 48 65 69 67 68 74 20 29 7b 0a 20 20 20 20 73  xHeight ){.    s
2870: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2880: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 22  Parse, .       "
2890: 45 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  Expression tree 
28a0: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 28 6d 61  is too large (ma
28b0: 78 69 6d 75 6d 20 64 65 70 74 68 20 25 64 29 22  ximum depth %d)"
28c0: 2c 20 6d 78 48 65 69 67 68 74 0a 20 20 20 20 29  , mxHeight.    )
28d0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
28e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
28f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2900: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  The following th
2910: 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 2c 20 68  ree functions, h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 29 2c 20 68  eightOfExpr(), h
2930: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2940: 29 0a 2a 2a 20 61 6e 64 20 68 65 69 67 68 74 4f  ).** and heightO
2950: 66 53 65 6c 65 63 74 28 29 2c 20 61 72 65 20 75  fSelect(), are u
2960: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
2970: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 68 65 69   the maximum hei
2980: 67 68 74 0a 2a 2a 20 6f 66 20 61 6e 79 20 65 78  ght.** of any ex
2990: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 72 65  pression tree re
29a0: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
29b0: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
29c0: 20 61 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   as the.** first
29d0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
29e0: 20 49 66 20 74 68 69 73 20 6d 61 78 69 6d 75 6d   If this maximum
29f0: 20 68 65 69 67 68 74 20 69 73 20 67 72 65 61 74   height is great
2a00: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
2a10: 65 6e 74 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ent value pointe
2a20: 64 0a 2a 2a 20 74 6f 20 62 79 20 70 6e 48 65 69  d.** to by pnHei
2a30: 67 68 74 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ght, the second 
2a40: 70 61 72 61 6d 65 74 65 72 2c 20 74 68 65 6e 20  parameter, then 
2a50: 73 65 74 20 2a 70 6e 48 65 69 67 68 74 20 74 6f  set *pnHeight to
2a60: 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 2e 0a   that.** value..
2a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
2a80: 65 69 67 68 74 4f 66 45 78 70 72 28 45 78 70 72  eightOfExpr(Expr
2a90: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67   *p, int *pnHeig
2aa0: 68 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  ht){.  if( p ){.
2ab0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 48 65 69 67      if( p->nHeig
2ac0: 68 74 3e 2a 70 6e 48 65 69 67 68 74 20 29 7b 0a  ht>*pnHeight ){.
2ad0: 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
2ae0: 3d 20 70 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  = p->nHeight;.  
2af0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2b00: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45 78   void heightOfEx
2b10: 70 72 4c 69 73 74 28 45 78 70 72 4c 69 73 74 20  prList(ExprList 
2b20: 2a 70 2c 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  *p, int *pnHeigh
2b30: 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  t){.  if( p ){. 
2b40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2b50: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2b60: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 68  r; i++){.      h
2b70: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 61  eightOfExpr(p->a
2b80: 5b 69 5d 2e 70 45 78 70 72 2c 20 70 6e 48 65 69  [i].pExpr, pnHei
2b90: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2ba0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2bb0: 69 67 68 74 4f 66 53 65 6c 65 63 74 28 53 65 6c  ightOfSelect(Sel
2bc0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 48  ect *p, int *pnH
2bd0: 65 69 67 68 74 29 7b 0a 20 20 69 66 28 20 70 20  eight){.  if( p 
2be0: 29 7b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  ){.    heightOfE
2bf0: 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
2c00: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2c10: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 48  ightOfExpr(p->pH
2c20: 61 76 69 6e 67 2c 20 70 6e 48 65 69 67 68 74 29  aving, pnHeight)
2c30: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2c40: 70 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 70 6e  pr(p->pLimit, pn
2c50: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2c60: 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4f 66  ghtOfExpr(p->pOf
2c70: 66 73 65 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  fset, pnHeight);
2c80: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2c90: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
2ca0: 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20   pnHeight);.    
2cb0: 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74  heightOfExprList
2cc0: 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 6e  (p->pGroupBy, pn
2cd0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
2ce0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
2cf0: 3e 70 4f 72 64 65 72 42 79 2c 20 70 6e 48 65 69  >pOrderBy, pnHei
2d00: 67 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74  ght);.    height
2d10: 4f 66 53 65 6c 65 63 74 28 70 2d 3e 70 50 72 69  OfSelect(p->pPri
2d20: 6f 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  or, pnHeight);. 
2d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
2d40: 74 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74  the Expr.nHeight
2d50: 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68 65   variable in the
2d60: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
2d70: 64 20 61 73 20 61 6e 20 0a 2a 2a 20 61 72 67 75  d as an .** argu
2d80: 6d 65 6e 74 2e 20 41 6e 20 65 78 70 72 65 73 73  ment. An express
2d90: 69 6f 6e 20 77 69 74 68 20 6e 6f 20 63 68 69 6c  ion with no chil
2da0: 64 72 65 6e 2c 20 45 78 70 72 2e 70 4c 69 73 74  dren, Expr.pList
2db0: 20 6f 72 20 0a 2a 2a 20 45 78 70 72 2e 70 53 65   or .** Expr.pSe
2dc0: 6c 65 63 74 20 6d 65 6d 62 65 72 20 68 61 73 20  lect member has 
2dd0: 61 20 68 65 69 67 68 74 20 6f 66 20 31 2e 20 41  a height of 1. A
2de0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
2df0: 69 6f 6e 0a 2a 2a 20 68 61 73 20 61 20 68 65 69  ion.** has a hei
2e00: 67 68 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ght equal to the
2e10: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2e20: 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 0a 2a 2a  of any other .**
2e30: 20 72 65 66 65 72 65 6e 63 65 64 20 45 78 70 72   referenced Expr
2e40: 20 70 6c 75 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a   plus one..**.**
2e50: 20 41 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20   Also propagate 
2e60: 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66 6c 61  EP_Propagate fla
2e70: 67 73 20 75 70 20 66 72 6f 6d 20 45 78 70 72 2e  gs up from Expr.
2e80: 78 2e 70 4c 69 73 74 20 74 6f 20 45 78 70 72 2e  x.pList to Expr.
2e90: 66 6c 61 67 73 2c 0a 2a 2a 20 69 66 20 61 70 70  flags,.** if app
2ea0: 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2eb0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 53 65 74  tic void exprSet
2ec0: 48 65 69 67 68 74 28 45 78 70 72 20 2a 70 29 7b  Height(Expr *p){
2ed0: 0a 20 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d  .  int nHeight =
2ee0: 20 30 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78   0;.  heightOfEx
2ef0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 6e 48  pr(p->pLeft, &nH
2f00: 65 69 67 68 74 29 3b 0a 20 20 68 65 69 67 68 74  eight);.  height
2f10: 4f 66 45 78 70 72 28 70 2d 3e 70 52 69 67 68 74  OfExpr(p->pRight
2f20: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 69  , &nHeight);.  i
2f30: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
2f40: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
2f50: 63 74 29 20 29 7b 0a 20 20 20 20 68 65 69 67 68  ct) ){.    heigh
2f60: 74 4f 66 53 65 6c 65 63 74 28 70 2d 3e 78 2e 70  tOfSelect(p->x.p
2f70: 53 65 6c 65 63 74 2c 20 26 6e 48 65 69 67 68 74  Select, &nHeight
2f80: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2f90: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
2fa0: 20 68 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73   heightOfExprLis
2fb0: 74 28 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  t(p->x.pList, &n
2fc0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 70 2d 3e  Height);.    p->
2fd0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72 6f 70  flags |= EP_Prop
2fe0: 61 67 61 74 65 20 26 20 73 71 6c 69 74 65 33 45  agate & sqlite3E
2ff0: 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e  xprListFlags(p->
3000: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 20 20  x.pList);.  }.  
3010: 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65  p->nHeight = nHe
3020: 69 67 68 74 20 2b 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ight + 1;.}../*.
3030: 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e  ** Set the Expr.
3040: 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c 65  nHeight variable
3050: 20 75 73 69 6e 67 20 74 68 65 20 65 78 70 72 53   using the exprS
3060: 65 74 48 65 69 67 68 74 28 29 20 66 75 6e 63 74  etHeight() funct
3070: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 74 68 65 20 68  ion. If.** the h
3080: 65 69 67 68 74 20 69 73 20 67 72 65 61 74 65 72  eight is greater
3090: 20 74 68 61 6e 20 74 68 65 20 6d 61 78 69 6d 75   than the maximu
30a0: 6d 20 61 6c 6c 6f 77 65 64 20 65 78 70 72 65 73  m allowed expres
30b0: 73 69 6f 6e 20 64 65 70 74 68 2c 0a 2a 2a 20 6c  sion depth,.** l
30c0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
30d0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   pParse..**.** A
30e0: 6c 73 6f 20 70 72 6f 70 61 67 61 74 65 20 61 6c  lso propagate al
30f0: 6c 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 66  l EP_Propagate f
3100: 6c 61 67 73 20 66 72 6f 6d 20 74 68 65 20 45 78  lags from the Ex
3110: 70 72 2e 78 2e 70 4c 69 73 74 20 69 6e 74 6f 0a  pr.x.pList into.
3120: 2a 2a 20 45 78 70 72 2e 66 6c 61 67 73 2e 20 0a  ** Expr.flags. .
3130: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
3140: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
3150: 6c 61 67 73 28 50 61 72 73 65 20 2a 70 50 61 72  lags(Parse *pPar
3160: 73 65 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  se, Expr *p){.  
3170: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
3180: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 78 70   ) return;.  exp
3190: 72 53 65 74 48 65 69 67 68 74 28 70 29 3b 0a 20  rSetHeight(p);. 
31a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
31b0: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
31c0: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 7d 0a 0a  p->nHeight);.}..
31d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
31e0: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
31f0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
3200: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
3210: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 65 6c 65  d.** by the sele
3220: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
3230: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
3240: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
3250: 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
3260: 68 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  ht(Select *p){. 
3270: 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 30   int nHeight = 0
3280: 3b 0a 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65  ;.  heightOfSele
3290: 63 74 28 70 2c 20 26 6e 48 65 69 67 68 74 29 3b  ct(p, &nHeight);
32a0: 0a 20 20 72 65 74 75 72 6e 20 6e 48 65 69 67 68  .  return nHeigh
32b0: 74 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 41 42  t;.}.#else /* AB
32c0: 4f 56 45 3a 20 20 48 65 69 67 68 74 20 65 6e 66  OVE:  Height enf
32d0: 6f 72 63 65 6d 65 6e 74 20 65 6e 61 62 6c 65 64  orcement enabled
32e0: 2e 20 20 42 45 4c 4f 57 3a 20 48 65 69 67 68 74  .  BELOW: Height
32f0: 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 6f 66 66   enforcement off
3300: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 70 61 67   */./*.** Propag
3310: 61 74 65 20 61 6c 6c 20 45 50 5f 50 72 6f 70 61  ate all EP_Propa
3320: 67 61 74 65 20 66 6c 61 67 73 20 66 72 6f 6d 20  gate flags from 
3330: 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74  the Expr.x.pList
3340: 20 69 6e 74 6f 0a 2a 2a 20 45 78 70 72 2e 66 6c   into.** Expr.fl
3350: 61 67 73 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ags. .*/.void sq
3360: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
3370: 68 74 41 6e 64 46 6c 61 67 73 28 50 61 72 73 65  htAndFlags(Parse
3380: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
3390: 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
33a0: 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 21 45 78  ->x.pList && !Ex
33b0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
33c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
33d0: 7b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 7c  {.    p->flags |
33e0: 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65 20 26  = EP_Propagate &
33f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3400: 46 6c 61 67 73 28 70 2d 3e 78 2e 70 4c 69 73 74  Flags(p->x.pList
3410: 29 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  );.  }.}.#define
3420: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
3430: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
3440: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
3450: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
3460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
3470: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
3480: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
3490: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
34a0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
34b0: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
34c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
34d0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
34e0: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
34f0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
3500: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
3510: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
3520: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
3530: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
3540: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
3550: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
3560: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
3570: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
3580: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
3590: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
35a0: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
35b0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
35c0: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
35d0: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
35e0: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
35f0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
3600: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  ting is performe
3610: 64 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65 0a  d.  The deQuote.
3620: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
3630: 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b 65  ignored if pToke
3640: 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  n is NULL or if 
3650: 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20 6e  the token does n
3660: 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f 20  ot.** appear to 
3670: 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20 74  be quoted.  If t
3680: 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20 6f  he quotes were o
3690: 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e 22  f the form "..."
36a0: 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 29   (double-quotes)
36b0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50 5f  .** then the EP_
36c0: 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20 69  DblQuoted flag i
36d0: 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78 70  s set on the exp
36e0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a 2a  ression node..**
36f0: 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65  .** Special case
3700: 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e 54  :  If op==TK_INT
3710: 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e 20  EGER and pToken 
3720: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
3730: 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62  ng that.** can b
3740: 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  e translated int
3750: 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  o a 32-bit integ
3760: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  er, then the tok
3770: 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f  en is not.** sto
3780: 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e 2e  red in u.zToken.
3790: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 69    Instead, the i
37a0: 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69 73  nteger values is
37b0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
37c0: 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74 68   u.iValue and th
37d0: 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66 6c  e EP_IntValue fl
37e0: 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20 65  ag is set.  No e
37f0: 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a 20  xtra storage.** 
3800: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  is allocated to 
3810: 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65 72  hold the integer
3820: 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64 65   text and the de
3830: 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69 67  quote flag is ig
3840: 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a  nored..*/.Expr *
3850: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3860: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3880: 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  andle for sqlite
3890: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20  3DbMallocZero() 
38a0: 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f  (may be null) */
38b0: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
38c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
38d0: 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20  pression opcode 
38e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
38f0: 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a 20   *pToken,    /* 
3900: 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  Token argument. 
3910: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
3920: 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20  /.  int dequote 
3930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3940: 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20 2a  rue to dequote *
3950: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
3960: 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  w;.  int nExtra 
3970: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c 75  = 0;.  int iValu
3980: 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
3990: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( db!=0 );.  if(
39a0: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   pToken ){.    i
39b0: 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45  f( op!=TK_INTEGE
39c0: 52 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d  R || pToken->z==
39d0: 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  0.          || s
39e0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
39f0: 54 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75  Token->z, &iValu
3a00: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  e)==0 ){.      n
3a10: 45 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e  Extra = pToken->
3a20: 6e 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n+1;.      asser
3a30: 74 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a  t( iValue>=0 );.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77      }.  }.  pNew
3a50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
3a60: 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
3a70: 6f 66 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29  of(Expr)+nExtra)
3a80: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
3a90: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
3aa0: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
3ab0: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6f 70 20  );.    pNew->op 
3ac0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 70 4e  = (u8)op;.    pN
3ad0: 65 77 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20  ew->iAgg = -1;. 
3ae0: 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b     if( pToken ){
3af0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
3b00: 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  a==0 ){.        
3b10: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
3b20: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
3b30: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
3b40: 75 65 20 3d 20 69 56 61 6c 75 65 3b 0a 20 20 20  ue = iValue;.   
3b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3b60: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
3b70: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20   pNew->u.zToken 
3b80: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
3b90: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
3ba0: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
3bb0: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20  || pToken->n==0 
3bc0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3bd0: 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63 70  Token->n ) memcp
3be0: 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  y(pNew->u.zToken
3bf0: 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54 6f  , pToken->z, pTo
3c00: 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ken->n);.       
3c10: 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b   pNew->u.zToken[
3c20: 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a  pToken->n] = 0;.
3c30: 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71 75          if( dequ
3c40: 6f 74 65 20 26 26 20 6e 45 78 74 72 61 3e 3d 33  ote && nExtra>=3
3c50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
3c60: 26 20 28 28 63 20 3d 20 70 54 6f 6b 65 6e 2d 3e  & ((c = pToken->
3c70: 7a 5b 30 5d 29 3d 3d 27 5c 27 27 20 7c 7c 20 63  z[0])=='\'' || c
3c80: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5b 27 20  =='"' || c=='[' 
3c90: 7c 7c 20 63 3d 3d 27 60 27 29 20 29 7b 0a 20 20  || c=='`') ){.  
3ca0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
3cb0: 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  equote(pNew->u.z
3cc0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  Token);.        
3cd0: 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 20 70    if( c=='"' ) p
3ce0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
3cf0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
3d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3d10: 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
3d20: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
3d30: 20 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68      pNew->nHeigh
3d40: 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a  t = 1;.#endif  .
3d50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
3d60: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  w;.}../*.** Allo
3d70: 63 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  cate a new expre
3d80: 73 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20  ssion node from 
3d90: 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65  a zero-terminate
3da0: 64 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  d token that has
3db0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e  .** already been
3dc0: 20 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78   dequoted..*/.Ex
3dd0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
3de0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
3e00: 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ndle for sqlite3
3e10: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28  DbMallocZero() (
3e20: 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a  may be null) */.
3e30: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
3e50: 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a  ression opcode *
3e60: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
3e70: 7a 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54  zToken      /* T
3e80: 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20  oken argument.  
3e90: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
3ea0: 0a 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  .){.  Token x;. 
3eb0: 20 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20   x.z = zToken;. 
3ec0: 20 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20   x.n = zToken ? 
3ed0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
3ee0: 7a 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72  zToken) : 0;.  r
3ef0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
3f00: 72 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26  rAlloc(db, op, &
3f10: 78 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x, 0);.}../*.** 
3f20: 41 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20  Attach subtrees 
3f30: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
3f40: 20 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64   to the Expr nod
3f50: 65 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  e pRoot..**.** I
3f60: 66 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68  f pRoot==NULL th
3f70: 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20  at means that a 
3f80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3f90: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
3fa0: 72 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  rred..** In that
3fb0: 20 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68   case, delete th
3fc0: 65 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  e subtrees pLeft
3fd0: 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a   and pRight..*/.
3fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
3ff0: 41 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a  AttachSubtrees(.
4000: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
4010: 20 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20   Expr *pRoot,.  
4020: 45 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45  Expr *pLeft,.  E
4030: 78 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20  xpr *pRight.){. 
4040: 20 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b   if( pRoot==0 ){
4050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
4060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
4070: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4080: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
40a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
40b0: 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ght);.  }else{. 
40c0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b     if( pRight ){
40d0: 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52  .      pRoot->pR
40e0: 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20  ight = pRight;. 
40f0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
4100: 73 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74  s |= EP_Propagat
4110: 65 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67  e & pRight->flag
4120: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
4130: 20 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20   pLeft ){.      
4140: 70 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70  pRoot->pLeft = p
4150: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f  Left;.      pRoo
4160: 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50  t->flags |= EP_P
4170: 72 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74  ropagate & pLeft
4180: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
4190: 20 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74     exprSetHeight
41a0: 28 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pRoot);.  }.}..
41b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
41c0: 6e 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63  n Expr node whic
41d0: 68 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20  h joins as many 
41e0: 61 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e  as two subtrees.
41f0: 0a 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f  .**.** One or bo
4200: 74 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  th of the subtre
4210: 65 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20  es can be NULL. 
4220: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
4230: 72 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  r to the new.** 
4240: 45 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20  Expr node.  Or, 
4250: 69 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  if an OOM error 
4260: 6f 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72  occurs, set pPar
4270: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
4280: 69 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68  iled,.** free th
4290: 65 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72  e subtrees and r
42a0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45  eturn NULL..*/.E
42b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70  xpr *sqlite3PExp
42c0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
42d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
42e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
42f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4310: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
4320: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  e */.  Expr *pLe
4330: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ft,            /
4340: 2a 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  * Left operand *
4350: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
4360: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ,           /* R
4370: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
4380: 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70    const Token *p
4390: 54 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67  Token     /* Arg
43a0: 75 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29  ument token */.)
43b0: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69  {.  Expr *p;.  i
43c0: 66 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26  f( op==TK_AND &&
43d0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
43e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20   ){.    /* Take 
43f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f  advantage of sho
4400: 72 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65  rt-circuit false
4410: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
4420: 72 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d  r AND */.    p =
4430: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
4440: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66  pParse->db, pLef
4450: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  t, pRight);.  }e
4460: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  lse{.    p = sql
4470: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
4480: 61 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54  arse->db, op & T
4490: 4b 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65  KFLG_MASK, pToke
44a0: 6e 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 1);.    sqlit
44b0: 65 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74  e3ExprAttachSubt
44c0: 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c  rees(pParse->db,
44d0: 20 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68   p, pLeft, pRigh
44e0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  t);.  }.  if( p 
44f0: 29 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ) {.    sqlite3E
4500: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
4510: 50 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68  Parse, p->nHeigh
4520: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
4530: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   p;.}../*.** Add
4540: 20 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20   pSelect to the 
4550: 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66  Expr.x.pSelect f
4560: 69 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45  ield.  Or, if pE
4570: 78 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65  xpr is NULL (due
4580: 0a 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20  .** do a memory 
4590: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
45a0: 72 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20  re) then delete 
45b0: 74 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65  the pSelect obje
45c0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
45d0: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
45e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
45f0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65   Expr *pExpr, Se
4600: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
4610: 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
4620: 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c     pExpr->x.pSel
4630: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ect = pSelect;. 
4640: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
4650: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
4660: 53 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65  Select|EP_Subque
4670: 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
4680: 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64  ExprSetHeightAnd
4690: 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45  Flags(pParse, pE
46a0: 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
46b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
46c0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
46d0: 6c 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  led );.    sqlit
46e0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
46f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65  Parse->db, pSele
4700: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
4710: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
4720: 73 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65  sion is always e
4730: 69 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41  ither TRUE or FA
4740: 4c 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c  LSE (respectivel
4750: 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  y),.** then retu
4760: 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61  rn 1.  If one ca
4770: 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74  nnot determine t
4780: 68 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f  he truth value o
4790: 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  f the.** express
47a0: 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ion at compile-t
47b0: 69 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  ime return 0..**
47c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f  .** This is an o
47d0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66  ptimization.  If
47e0: 20 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e   is OK to return
47f0: 20 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a   0 here even if.
4800: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
4810: 6e 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61  n really is alwa
4820: 79 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73  ys false or fals
4830: 65 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74  e (a false negat
4840: 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20  ive)..** But it 
4850: 69 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75  is a bug to retu
4860: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
4870: 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76  ession might hav
4880: 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62  e different.** b
4890: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e  oolean values in
48a0: 20 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75   different circu
48b0: 6d 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73  mstances (a fals
48c0: 65 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a  e positive.).**.
48d0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
48e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
48f0: 73 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74  s part of condit
4900: 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c  ional for a.** L
4910: 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77  EFT JOIN, then w
4920: 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
4930: 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ne at compile-ti
4940: 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  me whether or no
4950: 74 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20  t.** is it true 
4960: 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77  or false, so alw
4970: 61 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ays return 0..*/
4980: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
4990: 41 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20  AlwaysTrue(Expr 
49a0: 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30  *p){.  int v = 0
49b0: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
49c0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72  roperty(p, EP_Fr
49d0: 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e  omJoin) ) return
49e0: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
49f0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
4a00: 70 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20  p, &v) ) return 
4a10: 30 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30  0;.  return v!=0
4a20: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65  ;.}.static int e
4a30: 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45  xprAlwaysFalse(E
4a40: 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76  xpr *p){.  int v
4a50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72   = 0;.  if( Expr
4a60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
4a70: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65  P_FromJoin) ) re
4a80: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
4a90: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
4aa0: 67 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74  ger(p, &v) ) ret
4ab0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
4ac0: 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a  v==0;.}../*.** J
4ad0: 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69  oin two expressi
4ae0: 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44  ons using an AND
4af0: 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65   operator.  If e
4b00: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
4b10: 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65   is.** NULL, the
4b20: 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  n just return th
4b30: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
4b40: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  on..**.** If one
4b50: 20 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68   side or the oth
4b60: 65 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73  er of the AND is
4b70: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c   known to be fal
4b80: 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64  se, then instead
4b90: 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67  .** of returning
4ba0: 20 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69   an AND expressi
4bb0: 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20  on, just return 
4bc0: 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  a constant expre
4bd0: 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20  ssion with.** a 
4be0: 76 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a  value of false..
4bf0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4c00: 45 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20  ExprAnd(sqlite3 
4c10: 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74  *db, Expr *pLeft
4c20: 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b  , Expr *pRight){
4c30: 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20  .  if( pLeft==0 
4c40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52  ){.    return pR
4c50: 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ight;.  }else if
4c60: 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  ( pRight==0 ){. 
4c70: 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b     return pLeft;
4c80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70  .  }else if( exp
4c90: 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65  rAlwaysFalse(pLe
4ca0: 66 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79  ft) || exprAlway
4cb0: 73 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29  sFalse(pRight) )
4cc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
4cd0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66  rDelete(db, pLef
4ce0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
4cf0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52  xprDelete(db, pR
4d00: 69 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72  ight);.    retur
4d10: 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  n sqlite3ExprAll
4d20: 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  oc(db, TK_INTEGE
4d30: 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f  R, &sqlite3IntTo
4d40: 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d  kens[0], 0);.  }
4d50: 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a  else{.    Expr *
4d60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
4d70: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41  prAlloc(db, TK_A
4d80: 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ND, 0, 0);.    s
4d90: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
4da0: 53 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65  Subtrees(db, pNe
4db0: 77 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  w, pLeft, pRight
4dc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e  );.    return pN
4dd0: 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ew;.  }.}../*.**
4de0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
4df0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
4e00: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
4e10: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
4e20: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
4e30: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
4e40: 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
4e50: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
4e60: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
4e70: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
4e80: 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33  *pNew;.  sqlite3
4e90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
4ea0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  b;.  assert( pTo
4eb0: 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  ken );.  pNew = 
4ec0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
4ed0: 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  (db, TK_FUNCTION
4ee0: 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20  , pToken, 1);.  
4ef0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
4f00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4f10: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
4f20: 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65  st); /* Avoid me
4f30: 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d  mory leak when m
4f40: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
4f50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4f60: 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74  .  pNew->x.pList
4f70: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65   = pList;.  asse
4f80: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4f90: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
4fa0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71  sSelect) );.  sq
4fb0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
4fc0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
4fd0: 65 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75  e, pNew);.  retu
4fe0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
4ff0: 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61  * Assign a varia
5000: 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e  ble number to an
5010: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
5020: 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63   encodes a wildc
5030: 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72  ard.** in the or
5040: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
5050: 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69  ment.  .**.** Wi
5060: 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69  ldcards consisti
5070: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22  ng of a single "
5080: 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  ?" are assigned 
5090: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74  the next sequent
50a0: 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  ial.** variable 
50b0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69  number..**.** Wi
50c0: 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66  ldcards of the f
50d0: 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61  orm "?nnn" are a
50e0: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62  ssigned the numb
50f0: 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61  er "nnn".  We ma
5100: 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22  ke.** sure "nnn"
5110: 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74   is not too be t
5120: 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c  o avoid a denial
5130: 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61   of service atta
5140: 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53  ck when.** the S
5150: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d  QL statement com
5160: 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72  es from an exter
5170: 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a  nal source..**.*
5180: 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74  * Wildcards of t
5190: 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20  he form ":aaa", 
51a0: 22 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61  "@aaa", or "$aaa
51b0: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
51c0: 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
51d0: 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75  * as the previou
51e0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  s instance of th
51f0: 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e  e same wildcard.
5200: 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20    Or if this is 
5210: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73  the first.** ins
5220: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c  tance of the wil
5230: 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20  dcard, the next 
5240: 73 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61  sequential varia
5250: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
5260: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
5270: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
5280: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
5290: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
52a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c  r *pExpr){.  sql
52b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
52c0: 65 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  e->db;.  const c
52d0: 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70  har *z;..  if( p
52e0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
52f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ;.  assert( !Exp
5300: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5310: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c  pr, EP_IntValue|
5320: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
5330: 6b 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20  kenOnly) );.  z 
5340: 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
5350: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d  n;.  assert( z!=
5360: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  0 );.  assert( z
5370: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
5380: 7a 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  z[1]==0 ){.    /
5390: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
53a0: 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73  e form "?".  Ass
53b0: 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72  ign the next var
53c0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  iable number */.
53d0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d      assert( z[0]
53e0: 3d 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78  =='?' );.    pEx
53f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79  pr->iColumn = (y
5400: 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e  nVar)(++pParse->
5410: 6e 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nVar);.  }else{.
5420: 20 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b      ynVar x = 0;
5430: 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c  .    u32 n = sql
5440: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b  ite3Strlen30(z);
5450: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
5460: 3f 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  ?' ){.      /* W
5470: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
5480: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
5490: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
54a0: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
54b0: 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20     ** use it as 
54c0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d  the variable num
54d0: 62 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ber */.      i64
54e0: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f   i;.      int bO
54f0: 6b 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74  k = 0==sqlite3At
5500: 6f 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20  oi64(&z[1], &i, 
5510: 6e 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  n-1, SQLITE_UTF8
5520: 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  );.      pExpr->
5530: 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79  iColumn = x = (y
5540: 6e 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65  nVar)i;.      te
5550: 73 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a  stcase( i==0 );.
5560: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5570: 69 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  i==1 );.      te
5580: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
5590: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
55a0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
55b0: 45 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  ER]-1 );.      t
55c0: 65 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e  estcase( i==db->
55d0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
55e0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
55f0: 42 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66  BER] );.      if
5600: 28 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20  ( bOk==0 || i<1 
5610: 7c 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  || i>db->aLimit[
5620: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
5630: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
5640: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5650: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5660: 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65   "variable numbe
5670: 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  r must be betwee
5680: 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20  n ?1 and ?%d",. 
5690: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61             db->a
56a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
56b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
56c0: 45 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ER]);.        x 
56d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
56e0: 20 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d     if( i>pParse-
56f0: 3e 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20  >nVar ){.       
5700: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
5710: 28 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (int)i;.      }.
5720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5730: 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69   /* Wildcards li
5740: 6b 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61  ke ":aaa", "$aaa
5750: 22 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65  " or "@aaa".  Re
5760: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5770: 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e  iable.      ** n
5780: 75 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69  umber as the pri
5790: 6f 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66  or appearance of
57a0: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20   the same name, 
57b0: 6f 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20  or if the name. 
57c0: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65       ** has neve
57d0: 72 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72  r appeared befor
57e0: 65 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d  e, reuse the sam
57f0: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
5800: 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  r.      */.     
5810: 20 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20   ynVar i;.      
5820: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
5830: 65 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a  e->nzVar; i++){.
5840: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
5850: 73 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20  se->azVar[i] && 
5860: 73 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61  strcmp(pParse->a
5870: 7a 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b  zVar[i],z)==0 ){
5880: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
5890: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20  ->iColumn = x = 
58a0: 28 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20  (ynVar)i+1;.    
58b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
58c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
58d0: 20 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20       if( x==0 ) 
58e0: 78 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  x = pExpr->iColu
58f0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70  mn = (ynVar)(++p
5900: 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20  Parse->nVar);.  
5910: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20    }.    if( x>0 
5920: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70  ){.      if( x>p
5930: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a  Parse->nzVar ){.
5940: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
5950: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71  ;.        a = sq
5960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
5970: 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  b, pParse->azVar
5980: 2c 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  , x*sizeof(a[0])
5990: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
59a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
59b0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
59c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20  locFailed ); /* 
59d0: 45 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74  Error reported t
59e0: 68 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69  hrough mallocFai
59f0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
5a00: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
5a10: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73   }.        pPars
5a20: 65 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20  e->azVar = a;.  
5a30: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 5b        memset(&a[
5a40: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20  pParse->nzVar], 
5a50: 30 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a  0, (x-pParse->nz
5a60: 56 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d  Var)*sizeof(a[0]
5a70: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  ));.        pPar
5a80: 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20  se->nzVar = x;. 
5a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5aa0: 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50   z[0]!='?' || pP
5ab0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
5ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5ad0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5ae0: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78   pParse->azVar[x
5af0: 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 50  -1]);.        pP
5b00: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d  arse->azVar[x-1]
5b10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
5b20: 44 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20  Dup(db, z, n);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5b40: 20 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d   .  if( !pParse-
5b50: 3e 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d  >nErr && pParse-
5b60: 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  >nVar>db->aLimit
5b70: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
5b80: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
5b90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5ba0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
5bb0: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
5bc0: 61 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ables");.  }.}..
5bd0: 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c  /*.** Recursivel
5be0: 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72  y delete an expr
5bf0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
5c00: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
5c10: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
5c20: 64 62 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20  db, Expr *p){.  
5c30: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
5c40: 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  n;.  /* Sanity c
5c50: 68 65 63 6b 3a 20 41 73 73 65 72 74 20 74 68 61  heck: Assert tha
5c60: 74 20 74 68 65 20 49 6e 74 56 61 6c 75 65 20 69  t the IntValue i
5c70: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  s non-negative i
5c80: 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  f it exists */. 
5c90: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
5ca0: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5cb0: 49 6e 74 56 61 6c 75 65 29 20 7c 7c 20 70 2d 3e  IntValue) || p->
5cc0: 75 2e 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  u.iValue>=0 );. 
5cd0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
5ce0: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
5cf0: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 2f 2a  nOnly) ){.    /*
5d00: 20 54 68 65 20 45 78 70 72 2e 78 20 75 6e 69 6f   The Expr.x unio
5d10: 6e 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  n is never used 
5d20: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
5d30: 20 61 73 20 45 78 70 72 2e 70 52 69 67 68 74 20   as Expr.pRight 
5d40: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
5d50: 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20  ->x.pList==0 || 
5d60: 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  p->pRight==0 );.
5d70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
5d80: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 65  elete(db, p->pLe
5d90: 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ft);.    sqlite3
5da0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5db0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69  ->pRight);.    i
5dc0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5dd0: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
5de0: 6e 29 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  n) ) sqlite3DbFr
5df0: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 7a 54 6f 6b  ee(db, p->u.zTok
5e00: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  en);.    if( Exp
5e10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
5e20: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
5e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
5e40: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
5e50: 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20  ->x.pSelect);.  
5e60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
5e70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5e80: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 78 2e 70 4c  lete(db, p->x.pL
5e90: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
5ea0: 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72    if( !ExprHasPr
5eb0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 53 74 61  operty(p, EP_Sta
5ec0: 74 69 63 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  tic) ){.    sqli
5ed0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
5ee0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
5ef0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5f00: 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f 63 61   of bytes alloca
5f10: 74 65 64 20 66 6f 72 20 74 68 65 20 65 78 70 72  ted for the expr
5f20: 65 73 73 69 6f 6e 20 73 74 72 75 63 74 75 72 65  ession structure
5f30: 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74   .** passed as t
5f40: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5f50: 74 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  t. This is alway
5f60: 73 20 6f 6e 65 20 6f 66 20 45 58 50 52 5f 46 55  s one of EXPR_FU
5f70: 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45 58 50 52 5f  LLSIZE,.** EXPR_
5f80: 52 45 44 55 43 45 44 53 49 5a 45 20 6f 72 20 45  REDUCEDSIZE or E
5f90: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5fa0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
5fb0: 20 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28   exprStructSize(
5fc0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
5fd0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5fe0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
5ff0: 20 29 20 72 65 74 75 72 6e 20 45 58 50 52 5f 54   ) return EXPR_T
6000: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 3b 0a 20 20  OKENONLYSIZE;.  
6010: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6020: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
6030: 64 29 20 29 20 72 65 74 75 72 6e 20 45 58 50 52  d) ) return EXPR
6040: 5f 52 45 44 55 43 45 44 53 49 5a 45 3b 0a 20 20  _REDUCEDSIZE;.  
6050: 72 65 74 75 72 6e 20 45 58 50 52 5f 46 55 4c 4c  return EXPR_FULL
6060: 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  SIZE;.}../*.** T
6070: 68 65 20 64 75 70 65 64 45 78 70 72 2a 53 69 7a  he dupedExpr*Siz
6080: 65 28 29 20 72 6f 75 74 69 6e 65 73 20 65 61 63  e() routines eac
6090: 68 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  h return the num
60a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
60b0: 75 69 72 65 64 0a 2a 2a 20 74 6f 20 73 74 6f 72  uired.** to stor
60c0: 65 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65  e a copy of an e
60d0: 78 70 72 65 73 73 69 6f 6e 20 6f 72 20 65 78 70  xpression or exp
60e0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 54  ression tree.  T
60f0: 68 65 79 20 64 69 66 66 65 72 20 69 6e 0a 2a 2a  hey differ in.**
6100: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 65   how much of the
6110: 20 74 72 65 65 20 69 73 20 6d 65 61 73 75 72 65   tree is measure
6120: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 75 70  d..**.**     dup
6130: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6140: 28 29 20 20 20 20 20 53 69 7a 65 20 6f 66 20 6f  ()     Size of o
6150: 6e 6c 79 20 74 68 65 20 45 78 70 72 20 73 74 72  nly the Expr str
6160: 75 63 74 75 72 65 20 0a 2a 2a 20 20 20 20 20 64  ucture .**     d
6170: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6180: 28 29 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66  ()       Size of
6190: 20 45 78 70 72 20 2b 20 73 70 61 63 65 20 66 6f   Expr + space fo
61a0: 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20 20 20 20 64  r token.**     d
61b0: 75 70 65 64 45 78 70 72 53 69 7a 65 28 29 20 20  upedExprSize()  
61c0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2b 20           Expr + 
61d0: 74 6f 6b 65 6e 20 2b 20 73 75 62 74 72 65 65 20  token + subtree 
61e0: 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a  components.**.**
61f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
6240: 54 68 65 20 64 75 70 65 64 45 78 70 72 53 74 72  The dupedExprStr
6250: 75 63 74 53 69 7a 65 28 29 20 66 75 6e 63 74 69  uctSize() functi
6260: 6f 6e 20 72 65 74 75 72 6e 73 20 74 77 6f 20 76  on returns two v
6270: 61 6c 75 65 73 20 4f 52 2d 65 64 20 74 6f 67 65  alues OR-ed toge
6280: 74 68 65 72 3a 20 20 0a 2a 2a 20 28 31 29 20 74  ther:  .** (1) t
6290: 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
62a0: 64 20 66 6f 72 20 61 20 63 6f 70 79 20 6f 66 20  d for a copy of 
62b0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
62c0: 72 65 20 6f 6e 6c 79 20 61 6e 64 20 0a 2a 2a 20  re only and .** 
62d0: 28 32 29 20 74 68 65 20 45 50 5f 78 78 78 20 66  (2) the EP_xxx f
62e0: 6c 61 67 73 20 74 68 61 74 20 69 6e 64 69 63 61  lags that indica
62f0: 74 65 20 77 68 61 74 20 74 68 65 20 73 74 72 75  te what the stru
6300: 63 74 75 72 65 20 73 69 7a 65 20 73 68 6f 75 6c  cture size shoul
6310: 64 20 62 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  d be..** The ret
6320: 75 72 6e 20 76 61 6c 75 65 73 20 69 73 20 61 6c  urn values is al
6330: 77 61 79 73 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  ways one of:.**.
6340: 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 46 55 4c  **      EXPR_FUL
6350: 4c 53 49 5a 45 0a 2a 2a 20 20 20 20 20 20 45 58  LSIZE.**      EX
6360: 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20 20  PR_REDUCEDSIZE  
6370: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 0a 2a 2a   | EP_Reduced.**
6380: 20 20 20 20 20 20 45 58 50 52 5f 54 4f 4b 45 4e        EXPR_TOKEN
6390: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
63a0: 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a 2a 20 54 68  kenOnly.**.** Th
63b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74  e size of the st
63c0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 66  ructure can be f
63d0: 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20  ound by masking 
63e0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
63f0: 0a 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74  .** of this rout
6400: 69 6e 65 20 77 69 74 68 20 30 78 66 66 66 2e 20  ine with 0xfff. 
6410: 20 54 68 65 20 66 6c 61 67 73 20 63 61 6e 20 62   The flags can b
6420: 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b 69  e found by maski
6430: 6e 67 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ng the.** return
6440: 20 76 61 6c 75 65 20 77 69 74 68 20 45 50 5f 52   value with EP_R
6450: 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f  educed|EP_TokenO
6460: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  nly..**.** Note 
6470: 74 68 61 74 20 77 69 74 68 20 66 6c 61 67 73 3d  that with flags=
6480: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 2c  =EXPRDUP_REDUCE,
6490: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 73 20 77   this routines w
64a0: 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c 2d 73 69 7a  orks on full-siz
64b0: 65 0a 2a 2a 20 28 75 6e 72 65 64 75 63 65 64 29  e.** (unreduced)
64c0: 20 45 78 70 72 20 6f 62 6a 65 63 74 73 20 61 73   Expr objects as
64d0: 20 74 68 65 79 20 6f 72 20 6f 72 69 67 69 6e 61   they or origina
64e0: 6c 6c 79 20 63 6f 6e 73 74 72 75 63 74 65 64 20  lly constructed 
64f0: 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2a  by the parser..*
6500: 2a 20 44 75 72 69 6e 67 20 65 78 70 72 65 73 73  * During express
6510: 69 6f 6e 20 61 6e 61 6c 79 73 69 73 2c 20 65 78  ion analysis, ex
6520: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
6530: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
6540: 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a 2a 20 6c 61  moved into.** la
6550: 74 65 72 20 70 61 72 74 73 20 6f 66 20 74 65 68  ter parts of teh
6560: 20 45 78 70 72 20 6f 62 6a 65 63 74 20 61 6e 64   Expr object and
6570: 20 74 68 61 74 20 65 78 74 72 61 20 69 6e 66 6f   that extra info
6580: 72 6d 61 74 69 6f 6e 20 6d 69 67 68 74 20 67 65  rmation might ge
6590: 74 20 63 68 6f 70 70 65 64 0a 2a 2a 20 6f 66 66  t chopped.** off
65a0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
65b0: 6f 6e 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  on is reduced.  
65c0: 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 69  Note also that i
65d0: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
65e0: 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61 6e 20 45 58  to.** make an EX
65f0: 50 52 44 55 50 5f 52 45 44 55 43 45 20 63 6f 70  PRDUP_REDUCE cop
6600: 79 20 6f 66 20 61 20 72 65 64 75 63 65 64 20 65  y of a reduced e
6610: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 74 20 69  xpression.  It i
6620: 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a 2a 2a 20  s only legal.** 
6630: 74 6f 20 72 65 64 75 63 65 20 61 20 70 72 69 73  to reduce a pris
6640: 74 69 6e 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tine expression 
6650: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 70 61  tree from the pa
6660: 72 73 65 72 2e 20 20 54 68 65 20 69 6d 70 6c 65  rser.  The imple
6670: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mentation.** of 
6680: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
6690: 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e 20 6d 75  ize() contain mu
66a0: 6c 74 69 70 6c 65 20 61 73 73 65 72 74 28 29 20  ltiple assert() 
66b0: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
66c0: 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 65 6e  attempt.** to en
66d0: 66 6f 72 63 65 20 74 68 69 73 20 63 6f 6e 73 74  force this const
66e0: 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  raint..*/.static
66f0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 74   int dupedExprSt
6700: 72 75 63 74 53 69 7a 65 28 45 78 70 72 20 2a 70  ructSize(Expr *p
6710: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6720: 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20 61 73 73  int nSize;.  ass
6730: 65 72 74 28 20 66 6c 61 67 73 3d 3d 45 58 50 52  ert( flags==EXPR
6740: 44 55 50 5f 52 45 44 55 43 45 20 7c 7c 20 66 6c  DUP_REDUCE || fl
6750: 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20 4f 6e 6c  ags==0 ); /* Onl
6760: 79 20 6f 6e 65 20 66 6c 61 67 20 76 61 6c 75 65  y one flag value
6770: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 61 73   allowed */.  as
6780: 73 65 72 74 28 20 45 58 50 52 5f 46 55 4c 4c 53  sert( EXPR_FULLS
6790: 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b 0a 20 20  IZE<=0xfff );.  
67a0: 61 73 73 65 72 74 28 20 28 30 78 66 66 66 20 26  assert( (0xfff &
67b0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
67c0: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
67d0: 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66 6c 61 67  ;.  if( 0==(flag
67e0: 73 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  s&EXPRDUP_REDUCE
67f0: 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  ) ){.    nSize =
6800: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b 0a   EXPR_FULLSIZE;.
6810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6820: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6830: 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65  perty(p, EP_Toke
6840: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
6850: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
6860: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6870: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
6880: 29 20 29 3b 20 0a 20 20 20 20 61 73 73 65 72 74  ) ); .    assert
6890: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
68a0: 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54 6f 6b 65  ty(p, EP_MemToke
68b0: 6e 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  n) );.    assert
68c0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
68d0: 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63  ty(p, EP_NoReduc
68e0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  e) );.    if( p-
68f0: 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e 78 2e 70  >pLeft || p->x.p
6900: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  List ){.      nS
6910: 69 7a 65 20 3d 20 45 58 50 52 5f 52 45 44 55 43  ize = EXPR_REDUC
6920: 45 44 53 49 5a 45 20 7c 20 45 50 5f 52 65 64 75  EDSIZE | EP_Redu
6930: 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ced;.    }else{.
6940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6950: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
6960: 20 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52      nSize = EXPR
6970: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c  _TOKENONLYSIZE |
6980: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20   EP_TokenOnly;. 
6990: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
69a0: 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n nSize;.}../*.*
69b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
69c0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 70 61 63  returns the spac
69d0: 65 20 69 6e 20 62 79 74 65 73 20 72 65 71 75 69  e in bytes requi
69e0: 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
69f0: 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20 74 68 65   copy .** of the
6a00: 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20   Expr structure 
6a10: 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  and a copy of th
6a20: 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 20  e Expr.u.zToken 
6a30: 73 74 72 69 6e 67 20 28 69 66 20 74 68 61 74 0a  string (if that.
6a40: 2a 2a 20 73 74 72 69 6e 67 20 69 73 20 64 65 66  ** string is def
6a50: 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ined.).*/.static
6a60: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 4e 6f   int dupedExprNo
6a70: 64 65 53 69 7a 65 28 45 78 70 72 20 2a 70 2c 20  deSize(Expr *p, 
6a80: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e  int flags){.  in
6a90: 74 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45  t nByte = dupedE
6aa0: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70 2c  xprStructSize(p,
6ab0: 20 66 6c 61 67 73 29 20 26 20 30 78 66 66 66 3b   flags) & 0xfff;
6ac0: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
6ad0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 49 6e  roperty(p, EP_In
6ae0: 74 56 61 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e  tValue) && p->u.
6af0: 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 6e 42  zToken ){.    nB
6b00: 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
6b10: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
6b20: 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74  en)+1;.  }.  ret
6b30: 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  urn ROUND8(nByte
6b40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6b50: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
6b60: 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
6b70: 74 6f 20 63 72 65 61 74 65 20 61 20 64 75 70 6c  to create a dupl
6b80: 69 63 61 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a  icate of the .**
6b90: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 61 73 73   expression pass
6ba0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
6bb0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 73 65  argument. The se
6bc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
6bd0: 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f 6e 74 61   a.** mask conta
6be0: 69 6e 69 6e 67 20 45 58 50 52 44 55 50 5f 58 58  ining EXPRDUP_XX
6bf0: 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  X flags..**.** T
6c00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6c10: 64 20 69 6e 63 6c 75 64 65 73 20 73 70 61 63 65  d includes space
6c20: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 70   to create a cop
6c30: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
6c40: 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c 66 20 61  ruct.** itself a
6c50: 6e 64 20 74 68 65 20 62 75 66 66 65 72 20 72 65  nd the buffer re
6c60: 66 65 72 72 65 64 20 74 6f 20 62 79 20 45 78 70  ferred to by Exp
6c70: 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69 66 20 61  r.u.zToken, if a
6c80: 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ny..**.** If the
6c90: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
6ca0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
6cb0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
6cc0: 75 65 20 69 6e 63 6c 75 64 65 73 20 0a 2a 2a 20  ue includes .** 
6cd0: 73 70 61 63 65 20 74 6f 20 64 75 70 6c 69 63 61  space to duplica
6ce0: 74 65 20 61 6c 6c 20 45 78 70 72 20 6e 6f 64 65  te all Expr node
6cf0: 73 20 69 6e 20 74 68 65 20 74 72 65 65 20 66 6f  s in the tree fo
6d00: 72 6d 65 64 20 62 79 20 45 78 70 72 2e 70 4c 65  rmed by Expr.pLe
6d10: 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78 70 72 2e  ft .** and Expr.
6d20: 70 52 69 67 68 74 20 76 61 72 69 61 62 6c 65 73  pRight variables
6d30: 20 28 62 75 74 20 6e 6f 74 20 66 6f 72 20 61 6e   (but not for an
6d40: 79 20 73 74 72 75 63 74 75 72 65 73 20 70 6f 69  y structures poi
6d50: 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a 2a 20 64  nted to or .** d
6d60: 65 73 63 65 6e 64 65 64 20 66 72 6f 6d 20 74 68  escended from th
6d70: 65 20 45 78 70 72 2e 78 2e 70 4c 69 73 74 20 6f  e Expr.x.pList o
6d80: 72 20 45 78 70 72 2e 78 2e 70 53 65 6c 65 63 74  r Expr.x.pSelect
6d90: 20 76 61 72 69 61 62 6c 65 73 29 2e 0a 2a 2f 0a   variables)..*/.
6da0: 73 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64  static int duped
6db0: 45 78 70 72 53 69 7a 65 28 45 78 70 72 20 2a 70  ExprSize(Expr *p
6dc0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
6dd0: 69 6e 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20  int nByte = 0;. 
6de0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 6e 42   if( p ){.    nB
6df0: 79 74 65 20 3d 20 64 75 70 65 64 45 78 70 72 4e  yte = dupedExprN
6e00: 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  odeSize(p, flags
6e10: 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  );.    if( flags
6e20: 26 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  &EXPRDUP_REDUCE 
6e30: 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
6e40: 3d 20 64 75 70 65 64 45 78 70 72 53 69 7a 65 28  = dupedExprSize(
6e50: 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61 67 73 29  p->pLeft, flags)
6e60: 20 2b 20 64 75 70 65 64 45 78 70 72 53 69 7a 65   + dupedExprSize
6e70: 28 70 2d 3e 70 52 69 67 68 74 2c 20 66 6c 61 67  (p->pRight, flag
6e80: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  s);.    }.  }.  
6e90: 72 65 74 75 72 6e 20 6e 42 79 74 65 3b 0a 7d 0a  return nByte;.}.
6ea0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6eb0: 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
6ec0: 74 6f 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  to sqlite3ExprDu
6ed0: 70 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  p(), except that
6ee0: 20 69 66 20 70 7a 42 75 66 66 65 72 20 0a 2a 2a   if pzBuffer .**
6ef0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
6f00: 6e 20 2a 70 7a 42 75 66 66 65 72 20 69 73 20 61  n *pzBuffer is a
6f10: 73 73 75 6d 65 64 20 74 6f 20 70 6f 69 6e 74 20  ssumed to point 
6f20: 74 6f 20 61 20 62 75 66 66 65 72 20 6c 61 72 67  to a buffer larg
6f30: 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20 74 6f 20  e enough .** to 
6f40: 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f  store the copy o
6f50: 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2c 20  f expression p, 
6f60: 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20 70 2d  the copies of p-
6f70: 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20 28 69 66  >u.zToken.** (if
6f80: 20 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 61 6e   applicable), an
6f90: 64 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66 20  d the copies of 
6fa0: 74 68 65 20 70 2d 3e 70 4c 65 66 74 20 61 6e 64  the p->pLeft and
6fb0: 20 70 2d 3e 70 52 69 67 68 74 20 65 78 70 72 65   p->pRight expre
6fc0: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66 20 61 6e  ssions,.** if an
6fd0: 79 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  y. Before return
6fe0: 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65 72 20 69  ing, *pzBuffer i
6ff0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  s set to the fir
7000: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
7010: 0a 2a 2a 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  .** portion of t
7020: 68 65 20 62 75 66 66 65 72 20 63 6f 70 69 65 64  he buffer copied
7030: 20 69 6e 74 6f 20 62 79 20 74 68 69 73 20 66 75   into by this fu
7040: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
7050: 63 20 45 78 70 72 20 2a 65 78 70 72 44 75 70 28  c Expr *exprDup(
7060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
7070: 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 2c  r *p, int flags,
7080: 20 75 38 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b   u8 **pzBuffer){
7090: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20  .  Expr *pNew = 
70a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
70b0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
70c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
70d0: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
70e0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 45 58 50 52 44   || flags==EXPRD
70f0: 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 20 20 61  UP_REDUCE );.  a
7100: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
7110: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
7120: 6f 6e 73 74 20 69 6e 74 20 69 73 52 65 64 75 63  onst int isReduc
7130: 65 64 20 3d 20 28 66 6c 61 67 73 26 45 58 50 52  ed = (flags&EXPR
7140: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
7150: 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a 20 20 20   u8 *zAlloc;.   
7160: 20 75 33 32 20 73 74 61 74 69 63 46 6c 61 67 20   u32 staticFlag 
7170: 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  = 0;..    assert
7180: 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c 7c  ( pzBuffer==0 ||
7190: 20 69 73 52 65 64 75 63 65 64 20 29 3b 0a 0a 20   isReduced );.. 
71a0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
71b0: 20 77 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   where to write 
71c0: 74 68 65 20 6e 65 77 20 45 78 70 72 20 73 74 72  the new Expr str
71d0: 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 20 20 69  ucture. */.    i
71e0: 66 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20  f( pzBuffer ){. 
71f0: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d 20 2a 70       zAlloc = *p
7200: 7a 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 73  zBuffer;.      s
7210: 74 61 74 69 63 46 6c 61 67 20 3d 20 45 50 5f 53  taticFlag = EP_S
7220: 74 61 74 69 63 3b 0a 20 20 20 20 7d 65 6c 73 65  tatic;.    }else
7230: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
7240: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7250: 52 61 77 4e 4e 28 64 62 2c 20 64 75 70 65 64 45  RawNN(db, dupedE
7260: 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  xprSize(p, flags
7270: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ));.    }.    pN
7280: 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41 6c  ew = (Expr *)zAl
7290: 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  loc;..    if( pN
72a0: 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ew ){.      /* S
72b0: 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20 74  et nNewSize to t
72c0: 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 65  he size allocate
72d0: 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74  d for the struct
72e0: 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a 20  ure pointed to. 
72f0: 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77 2e       ** by pNew.
7300: 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72 20   This is either 
7310: 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20 45  EXPR_FULLSIZE, E
7320: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
7330: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50 52  or.      ** EXPR
7340: 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20  _TOKENONLYSIZE. 
7350: 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f  nToken is set to
7360: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
7370: 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20  ytes consumed.  
7380: 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63 6f      ** by the co
7390: 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a  py of the p->u.z
73a0: 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66  Token string (if
73b0: 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a   any)..      */.
73c0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
73d0: 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a 65  gned nStructSize
73e0: 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72 75   = dupedExprStru
73f0: 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73 29  ctSize(p, flags)
7400: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
7410: 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53 74  t nNewSize = nSt
7420: 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66 66  ructSize & 0xfff
7430: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 6b  ;.      int nTok
7440: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 45  en;.      if( !E
7450: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7460: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26  , EP_IntValue) &
7470: 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b  & p->u.zToken ){
7480: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
7490: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
74a0: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20 2b  0(p->u.zToken) +
74b0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
74c0: 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  .        nToken 
74d0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
74e0: 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65 64     if( isReduced
74f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
7500: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
7510: 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63 65  rty(p, EP_Reduce
7520: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  d)==0 );.       
7530: 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20   memcpy(zAlloc, 
7540: 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20 20  p, nNewSize);.  
7550: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7560: 20 20 20 75 33 32 20 6e 53 69 7a 65 20 3d 20 28     u32 nSize = (
7570: 75 33 32 29 65 78 70 72 53 74 72 75 63 74 53 69  u32)exprStructSi
7580: 7a 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 6d  ze(p);.        m
7590: 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c  emcpy(zAlloc, p,
75a0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20   nSize);.       
75b0: 20 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f   if( nSize<EXPR_
75c0: 46 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20  FULLSIZE ){ .   
75d0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 7a         memset(&z
75e0: 41 6c 6c 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c  Alloc[nSize], 0,
75f0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e   EXPR_FULLSIZE-n
7600: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
7610: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7620: 2f 2a 20 53 65 74 20 74 68 65 20 45 50 5f 52 65  /* Set the EP_Re
7630: 64 75 63 65 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f  duced, EP_TokenO
7640: 6e 6c 79 2c 20 61 6e 64 20 45 50 5f 53 74 61 74  nly, and EP_Stat
7650: 69 63 20 66 6c 61 67 73 20 61 70 70 72 6f 70 72  ic flags appropr
7660: 69 61 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  iately. */.     
7670: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20   pNew->flags &= 
7680: 7e 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  ~(EP_Reduced|EP_
7690: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61  TokenOnly|EP_Sta
76a0: 74 69 63 7c 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29  tic|EP_MemToken)
76b0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c  ;.      pNew->fl
76c0: 61 67 73 20 7c 3d 20 6e 53 74 72 75 63 74 53 69  ags |= nStructSi
76d0: 7a 65 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  ze & (EP_Reduced
76e0: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a  |EP_TokenOnly);.
76f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
7700: 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67 3b  s |= staticFlag;
7710: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
7720: 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20  the p->u.zToken 
7730: 73 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20  string, if any. 
7740: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 54 6f  */.      if( nTo
7750: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ken ){.        c
7760: 68 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e  har *zToken = pN
7770: 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28  ew->u.zToken = (
7780: 63 68 61 72 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e  char*)&zAlloc[nN
7790: 65 77 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  ewSize];.       
77a0: 20 6d 65 6d 63 70 79 28 7a 54 6f 6b 65 6e 2c 20   memcpy(zToken, 
77b0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f  p->u.zToken, nTo
77c0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ken);.      }.. 
77d0: 20 20 20 20 20 69 66 28 20 30 3d 3d 28 28 70 2d       if( 0==((p-
77e0: 3e 66 6c 61 67 73 7c 70 4e 65 77 2d 3e 66 6c 61  >flags|pNew->fla
77f0: 67 73 29 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  gs) & EP_TokenOn
7800: 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ly) ){.        /
7810: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 4e  * Fill in the pN
7820: 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20 6f 72  ew->x.pSelect or
7830: 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 6d   pNew->x.pList m
7840: 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ember. */.      
7850: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7860: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
7870: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
7880: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c      pNew->x.pSel
7890: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
78a0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e  ectDup(db, p->x.
78b0: 70 53 65 6c 65 63 74 2c 20 69 73 52 65 64 75 63  pSelect, isReduc
78c0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ed);.        }el
78d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
78e0: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 73 71  ew->x.pList = sq
78f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7900: 28 64 62 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 2c  (db, p->x.pList,
7910: 20 69 73 52 65 64 75 63 65 64 29 3b 0a 20 20 20   isReduced);.   
7920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
7930: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
7940: 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 61 6e 64   pNew->pLeft and
7950: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 2e 20 2a   pNew->pRight. *
7960: 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
7970: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65 77  HasProperty(pNew
7980: 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f  , EP_Reduced|EP_
7990: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
79a0: 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20        zAlloc += 
79b0: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
79c0: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
79d0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
79e0: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
79f0: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7a00: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c          pNew->pL
7a10: 65 66 74 20 3d 20 65 78 70 72 44 75 70 28 64 62  eft = exprDup(db
7a20: 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52  , p->pLeft, EXPR
7a30: 44 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c  DUP_REDUCE, &zAl
7a40: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
7a50: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 65  pNew->pRight = e
7a60: 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52  xprDup(db, p->pR
7a70: 69 67 68 74 2c 20 45 58 50 52 44 55 50 5f 52 45  ight, EXPRDUP_RE
7a80: 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a  DUCE, &zAlloc);.
7a90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7aa0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
7ab0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 7a 42  {.          *pzB
7ac0: 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a  uffer = zAlloc;.
7ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7af0: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
7b00: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
7b10: 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
7b20: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
7b30: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
7b40: 62 2c 20 70 2d 3e 70 4c 65 66 74 2c 20 30 29 3b  b, p->pLeft, 0);
7b50: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
7b60: 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  >pRight = sqlite
7b70: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7b80: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20  pRight, 0);.    
7b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
7ba0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7bb0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7bc0: 20 43 72 65 61 74 65 20 61 6e 64 20 72 65 74 75   Create and retu
7bd0: 72 6e 20 61 20 64 65 65 70 20 63 6f 70 79 20 6f  rn a deep copy o
7be0: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73  f the object pas
7bf0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
7c00: 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  d .** argument. 
7c10: 49 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74  If an OOM condit
7c20: 69 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ion is encounter
7c30: 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  ed, NULL is retu
7c40: 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  rned.** and the 
7c50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c60: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69   flag set..*/.#i
7c70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7c80: 54 5f 43 54 45 0a 73 74 61 74 69 63 20 57 69 74  T_CTE.static Wit
7c90: 68 20 2a 77 69 74 68 44 75 70 28 73 71 6c 69 74  h *withDup(sqlit
7ca0: 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70 29  e3 *db, With *p)
7cb0: 7b 0a 20 20 57 69 74 68 20 2a 70 52 65 74 20 3d  {.  With *pRet =
7cc0: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
7cd0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
7ce0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65  izeof(*p) + size
7cf0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70  of(p->a[0]) * (p
7d00: 2d 3e 6e 43 74 65 2d 31 29 3b 0a 20 20 20 20 70  ->nCte-1);.    p
7d10: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Ret = sqlite3DbM
7d20: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
7d30: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
7d40: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
7d50: 69 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  i;.      pRet->n
7d60: 43 74 65 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20  Cte = p->nCte;. 
7d70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7d80: 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  p->nCte; i++){. 
7d90: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 61 5b 69         pRet->a[i
7da0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ].pSelect = sqli
7db0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
7dc0: 20 70 2d 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74   p->a[i].pSelect
7dd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 52  , 0);.        pR
7de0: 65 74 2d 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d  et->a[i].pCols =
7df0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7e00: 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e  Dup(db, p->a[i].
7e10: 70 43 6f 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20  pCols, 0);.     
7e20: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e     pRet->a[i].zN
7e30: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
7e40: 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69  trDup(db, p->a[i
7e50: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ].zName);.      
7e60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7e70: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c  turn pRet;.}.#el
7e80: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 74 68  se.# define with
7e90: 44 75 70 28 78 2c 79 29 20 30 0a 23 65 6e 64 69  Dup(x,y) 0.#endi
7ea0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
7eb0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
7ec0: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
7ed0: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
7ee0: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
7ef0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
7f00: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
7f10: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
7f20: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
7f30: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
7f40: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
7f50: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
7f60: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
7f70: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
7f80: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
7f90: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
7fa0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
7fb0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
7fc0: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
7fd0: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
7fe0: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
7ff0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
8000: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
8010: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
8020: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
8030: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
8040: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
8050: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
8060: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
8070: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
8080: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
8090: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
80a0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
80b0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
80c0: 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
80d0: 63 6f 6e 74 61 69 6e 73 20 61 20 63 6f 6d 62 69  contains a combi
80e0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 45 58  nation of the EX
80f0: 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67 73 2e  PRDUP_XXX flags.
8100: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
8110: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
8120: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
8130: 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
8140: 65 64 20 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63  ed is a.** trunc
8150: 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
8160: 74 68 65 20 75 73 75 61 6c 20 45 78 70 72 20 73  the usual Expr s
8170: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69  tructure that wi
8180: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 61 73 0a  ll be stored as.
8190: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  ** part of the i
81a0: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
81b0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
81c0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
81d0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
81e0: 45 78 70 72 44 75 70 28 73 71 6c 69 74 65 33 20  ExprDup(sqlite3 
81f0: 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e  *db, Expr *p, in
8200: 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
8210: 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
8220: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
8230: 45 44 55 43 45 20 29 3b 0a 20 20 72 65 74 75 72  EDUCE );.  retur
8240: 6e 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2c  n exprDup(db, p,
8250: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78   flags, 0);.}.Ex
8260: 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45  prList *sqlite3E
8270: 78 70 72 4c 69 73 74 44 75 70 28 73 71 6c 69 74  xprListDup(sqlit
8280: 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74  e3 *db, ExprList
8290: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
82a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65  .  ExprList *pNe
82b0: 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  w;.  struct Expr
82c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
82d0: 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69  , *pOldItem;.  i
82e0: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
82f0: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
8300: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8310: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
8320: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
8330: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
8340: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
8350: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
8360: 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 69 20 3d  New->nExpr = i =
8370: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28   p->nExpr;.  if(
8380: 20 28 66 6c 61 67 73 20 26 20 45 58 50 52 44 55   (flags & EXPRDU
8390: 50 5f 52 45 44 55 43 45 29 3d 3d 30 20 29 20 66  P_REDUCE)==0 ) f
83a0: 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=1; i<p->nEx
83b0: 70 72 3b 20 69 2b 3d 69 29 7b 7d 0a 20 20 70 4e  pr; i+=i){}.  pN
83c0: 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20  ew->a = pItem = 
83d0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
83e0: 61 77 4e 4e 28 64 62 2c 20 20 69 2a 73 69 7a 65  awNN(db,  i*size
83f0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
8400: 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 7b   if( pItem==0 ){
8410: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
8420: 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ee(db, pNew);.  
8430: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
8440: 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70 2d  .  pOldItem = p-
8450: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
8460: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
8470: 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74 65  pItem++, pOldIte
8480: 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  m++){.    Expr *
8490: 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f 6c 64 49  pOldExpr = pOldI
84a0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
84b0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 73  pItem->pExpr = s
84c0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
84d0: 2c 20 70 4f 6c 64 45 78 70 72 2c 20 66 6c 61 67  , pOldExpr, flag
84e0: 73 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  s);.    pItem->z
84f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
8500: 53 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  StrDup(db, pOldI
8510: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
8520: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
8530: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8540: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 53  db, pOldItem->zS
8550: 70 61 6e 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  pan);.    pItem-
8560: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 4f 6c  >sortOrder = pOl
8570: 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  dItem->sortOrder
8580: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
8590: 65 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 6d  e = 0;.    pItem
85a0: 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 70  ->bSpanIsTab = p
85b0: 4f 6c 64 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73  OldItem->bSpanIs
85c0: 54 61 62 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Tab;.    pItem->
85d0: 75 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 75 3b  u = pOldItem->u;
85e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
85f0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ew;.}../*.** If 
8600: 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65 72  cursors, trigger
8610: 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75 62  s, views and sub
8620: 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c 20  queries are all 
8630: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  omitted from.** 
8640: 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  the build, then 
8650: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  none of the foll
8660: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20  owing routines, 
8670: 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73  except for .** s
8680: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
8690: 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ), can be called
86a0: 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  . sqlite3SelectD
86b0: 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d 65  up() is sometime
86c0: 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  s.** called with
86d0: 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74   a NULL argument
86e0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
86f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
8700: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
8710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8720: 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69  GER) \. || !defi
8730: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8740: 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69 73  SUBQUERY).SrcLis
8750: 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
8760: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
8770: 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 69 6e  , SrcList *p, in
8780: 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 72 63 4c  t flags){.  SrcL
8790: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
87a0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   i;.  int nByte;
87b0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
87c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
87d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
87e0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
87f0: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
8800: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
8810: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
8820: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
8830: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
8840: 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
8850: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
8860: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
8870: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
8880: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
8890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
88a0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
88b0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
88c0: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
88d0: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
88e0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
88f0: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8900: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61  &p->a[i];.    Ta
8910: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70  ble *pTab;.    p
8920: 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d 61  NewItem->pSchema
8930: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 63   = pOldItem->pSc
8940: 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49 74  hema;.    pNewIt
8950: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
8960: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8970: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  db, pOldItem->zD
8980: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
8990: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
89a0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
89b0: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
89c0: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
89d0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
89e0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
89f0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61   pOldItem->zAlia
8a00: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
8a10: 2d 3e 66 67 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  ->fg = pOldItem-
8a20: 3e 66 67 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  >fg;.    pNewIte
8a30: 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c  m->iCursor = pOl
8a40: 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  dItem->iCursor;.
8a50: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64      pNewItem->ad
8a60: 64 72 46 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64  drFillSub = pOld
8a70: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
8a80: 62 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  b;.    pNewItem-
8a90: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c  >regReturn = pOl
8aa0: 64 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  dItem->regReturn
8ab0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 49 74  ;.    if( pNewIt
8ac0: 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  em->fg.isIndexed
8ad0: 42 79 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  By ){.      pNew
8ae0: 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65  Item->u1.zIndexe
8af0: 64 42 79 20 3d 20 73 71 6c 69 74 65 33 44 62 53  dBy = sqlite3DbS
8b00: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
8b10: 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  em->u1.zIndexedB
8b20: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  y);.    }.    pN
8b30: 65 77 49 74 65 6d 2d 3e 70 49 42 49 6e 64 65 78  ewItem->pIBIndex
8b40: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 42   = pOldItem->pIB
8b50: 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
8b60: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  NewItem->fg.isTa
8b70: 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70  bFunc ){.      p
8b80: 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  NewItem->u1.pFun
8b90: 63 41 72 67 20 3d 20 0a 20 20 20 20 20 20 20 20  cArg = .        
8ba0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
8bb0: 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  tDup(db, pOldIte
8bc0: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 2c 20  m->u1.pFuncArg, 
8bd0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
8be0: 20 20 70 54 61 62 20 3d 20 70 4e 65 77 49 74 65    pTab = pNewIte
8bf0: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
8c00: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
8c10: 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( pTab ){.      
8c20: 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
8c30: 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65 6d    }.    pNewItem
8c40: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
8c50: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
8c60: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65   pOldItem->pSele
8c70: 63 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20  ct, flags);.    
8c80: 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  pNewItem->pOn = 
8c90: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
8ca0: 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  b, pOldItem->pOn
8cb0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 4e  , flags);.    pN
8cc0: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
8cd0: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
8ce0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8cf0: 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70 4e 65  pUsing);.    pNe
8d00: 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3d  wItem->colUsed =
8d10: 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c 55 73   pOldItem->colUs
8d20: 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ed;.  }.  return
8d30: 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20   pNew;.}.IdList 
8d40: 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75  *sqlite3IdListDu
8d50: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  p(sqlite3 *db, I
8d60: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
8d70: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
8d80: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   i;.  assert( db
8d90: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  !=0 );.  if( p==
8da0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
8db0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
8dc0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
8dd0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
8de0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
8df0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8e00: 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64 3b  w->nId = p->nId;
8e10: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
8e20: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
8e30: 4e 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a  N(db, p->nId*siz
8e40: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
8e50: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
8e60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
8e70: 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b  bFree(db, pNew);
8e80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
8e90: 20 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61   }.  /* Note tha
8ea0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69  t because the si
8eb0: 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
8ec0: 74 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20  tion for p->a[] 
8ed0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65  is not.  ** nece
8ee0: 73 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20  ssarily a power 
8ef0: 6f 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49  of two, sqlite3I
8f00: 64 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61  dListAppend() ma
8f10: 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a  y not be called.
8f20: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c    ** on the dupl
8f30: 69 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79  icate created by
8f40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
8f50: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8f60: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
8f70: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
8f80: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
8f90: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
8fa0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
8fb0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
8fc0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
8fd0: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
8fe0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8ff0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
9000: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
9010: 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49  tem->idx = pOldI
9020: 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20  tem->idx;.  }.  
9030: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
9040: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
9050: 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20  lectDup(sqlite3 
9060: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  *db, Select *p, 
9070: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65  int flags){.  Se
9080: 6c 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72  lect *pNew, *pPr
9090: 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ior;.  assert( d
90a0: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  b!=0 );.  if( p=
90b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
90c0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
90d0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
90e0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
90f0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
9100: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
9110: 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
9120: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
9130: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 66 6c 61 67   p->pEList, flag
9140: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  s);.  pNew->pSrc
9150: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
9160: 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 72 63  tDup(db, p->pSrc
9170: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
9180: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
9190: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
91a0: 3e 70 57 68 65 72 65 2c 20 66 6c 61 67 73 29 3b  >pWhere, flags);
91b0: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
91c0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
91d0: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 47  istDup(db, p->pG
91e0: 72 6f 75 70 42 79 2c 20 66 6c 61 67 73 29 3b 0a  roupBy, flags);.
91f0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
9200: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9210: 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
9220: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
9230: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
9240: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
9250: 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  b, p->pOrderBy, 
9260: 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e  flags);.  pNew->
9270: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
9280: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
9290: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
92a0: 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  ectDup(db, p->pP
92b0: 72 69 6f 72 2c 20 66 6c 61 67 73 29 3b 0a 20 20  rior, flags);.  
92c0: 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
92d0: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
92e0: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74  w;.  pNew->pNext
92f0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
9300: 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78  imit = sqlite3Ex
9310: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 4c 69  prDup(db, p->pLi
9320: 6d 69 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  mit, flags);.  p
9330: 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 73  New->pOffset = s
9340: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9350: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 66 6c  , p->pOffset, fl
9360: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c  ags);.  pNew->iL
9370: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
9380: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
9390: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
93a0: 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  = p->selFlags & 
93b0: 7e 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61  ~SF_UsesEphemera
93c0: 6c 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f  l;.  pNew->addrO
93d0: 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b  penEphm[0] = -1;
93e0: 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65  .  pNew->addrOpe
93f0: 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20  nEphm[1] = -1;. 
9400: 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f   pNew->nSelectRo
9410: 77 20 3d 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w = p->nSelectRo
9420: 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  w;.  pNew->pWith
9430: 20 3d 20 77 69 74 68 44 75 70 28 64 62 2c 20 70   = withDup(db, p
9440: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 73 71 6c 69  ->pWith);.  sqli
9450: 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
9460: 28 70 4e 65 77 2c 20 70 2d 3e 7a 53 65 6c 4e 61  (pNew, p->zSelNa
9470: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  me);.  return pN
9480: 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65  ew;.}.#else.Sele
9490: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
94a0: 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
94b0: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
94c0: 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72   flags){.  asser
94d0: 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74  t( p==0 );.  ret
94e0: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
94f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
9500: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
9510: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
9520: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
9530: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
9540: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
9550: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
9560: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
9570: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
9580: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
9590: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e  r occurs, the en
95a0: 74 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65  tire list is fre
95b0: 65 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69  ed and.** NULL i
95c0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
95d0: 6e 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75  non-NULL is retu
95e0: 72 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  rned, then it is
95f0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
9600: 68 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hat the new entr
9610: 79 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  y was successful
9620: 6c 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  ly appended..*/.
9630: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
9640: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
9650: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9660: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
9670: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9680: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9690: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  st,        /* Li
96a0: 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61  st to which to a
96b0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
96c0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
96d0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
96e0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
96f0: 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  to be appended. 
9700: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
9710: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
9720: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9730: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
9740: 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  );.  if( pList==
9750: 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
9760: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
9770: 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
9780: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
9790: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
97a0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
97b0: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
97c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 30 3b  List->nExpr = 0;
97d0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
97e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
97f0: 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28  awNN(db, sizeof(
9800: 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20  pList->a[0]));. 
9810: 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d     if( pList->a=
9820: 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d  =0 ) goto no_mem
9830: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
9840: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70  List->nExpr & (p
9850: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d  List->nExpr-1))=
9860: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
9870: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9880: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
9890: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
98a0: 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33  .    a = sqlite3
98b0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c  DbRealloc(db, pL
98c0: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
98d0: 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c  Expr*2*sizeof(pL
98e0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
98f0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
9900: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
9910: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
9920: 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73  >a = a;.  }.  as
9930: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
9940: 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a  0 );.  if( 1 ){.
9950: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
9960: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
9970: 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
9980: 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20  t->nExpr++];.   
9990: 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30   memset(pItem, 0
99a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29  , sizeof(*pItem)
99b0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45  );.    pItem->pE
99c0: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d  xpr = pExpr;.  }
99d0: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
99e0: 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20  ..no_mem:     . 
99f0: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
9a00: 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  g memory if mall
9a10: 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a  oc has failed. *
9a20: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
9a30: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
9a40: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
9a50: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
9a60: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ist);.  return 0
9a70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
9a80: 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 66 6f  he sort order fo
9a90: 72 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65  r the last eleme
9aa0: 6e 74 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  nt on the given 
9ab0: 45 78 70 72 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ExprList..*/.voi
9ac0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
9ad0: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 45 78  tSetSortOrder(Ex
9ae0: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 69  prList *p, int i
9af0: 53 6f 72 74 4f 72 64 65 72 29 7b 0a 20 20 69 66  SortOrder){.  if
9b00: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
9b10: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
9b20: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3c 30  E_SO_UNDEFINED<0
9b30: 20 26 26 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   && SQLITE_SO_AS
9b40: 43 3e 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 53  C>=0 && SQLITE_S
9b50: 4f 5f 44 45 53 43 3e 30 20 29 3b 0a 20 20 61 73  O_DESC>0 );.  as
9b60: 73 65 72 74 28 20 70 2d 3e 6e 45 78 70 72 3e 30  sert( p->nExpr>0
9b70: 20 29 3b 0a 20 20 69 66 28 20 69 53 6f 72 74 4f   );.  if( iSortO
9b80: 72 64 65 72 3c 30 20 29 7b 0a 20 20 20 20 61 73  rder<0 ){.    as
9b90: 73 65 72 74 28 20 70 2d 3e 61 5b 70 2d 3e 6e 45  sert( p->a[p->nE
9ba0: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
9bb0: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  ==SQLITE_SO_ASC 
9bc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9bd0: 20 7d 0a 20 20 70 2d 3e 61 5b 70 2d 3e 6e 45 78   }.  p->a[p->nEx
9be0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
9bf0: 3d 20 28 75 38 29 69 53 6f 72 74 4f 72 64 65 72  = (u8)iSortOrder
9c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
9c10: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e  he ExprList.a[].
9c20: 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66  zName element of
9c30: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9c40: 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a  ly added item.**
9c50: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
9c60: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70  on list..**.** p
9c70: 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55  List might be NU
9c80: 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  LL following an 
9c90: 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20  OOM error.  But 
9ca0: 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76  pName should nev
9cb0: 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20  er be.** NULL.  
9cc0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
9cd0: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68  cation fails, th
9ce0: 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  e pParse->db->ma
9cf0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a  llocFailed flag.
9d00: 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ** is set..*/.vo
9d10: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
9d20: 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72  stSetName(.  Par
9d30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9d40: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9d50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9d60: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
9d70: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
9d80: 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68 65  which to add the
9d90: 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   span. */.  Toke
9da0: 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
9db0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62      /* Name to b
9dc0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
9dd0: 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20 20   dequote        
9de0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
9df0: 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74  cause the name t
9e00: 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f  o be dequoted */
9e10: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  .){.  assert( pL
9e20: 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  ist!=0 || pParse
9e30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9e40: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
9e50: 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  List ){.    stru
9e60: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9e70: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73   *pItem;.    ass
9e80: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9e90: 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  r>0 );.    pItem
9ea0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
9eb0: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
9ec0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
9ed0: 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20  >zName==0 );.   
9ee0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
9ef0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9f00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
9f10: 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29  me->z, pName->n)
9f20: 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f 74  ;.    if( dequot
9f30: 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  e && pItem->zNam
9f40: 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f  e ) sqlite3Dequo
9f50: 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  te(pItem->zName)
9f60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
9f70: 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  et the ExprList.
9f80: 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e  a[].zSpan elemen
9f90: 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
9fa0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65  cently added ite
9fb0: 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72  m.** on the expr
9fc0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  ession list..**.
9fd0: 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62  ** pList might b
9fe0: 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67  e NULL following
9ff0: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
a000: 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64  But pSpan should
a010: 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c   never be.** NUL
a020: 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  L.  If a memory 
a030: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
a040: 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62  , the pParse->db
a050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
a060: 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a  lag.** is set..*
a070: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
a080: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20  prListSetSpan(. 
a090: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a0b0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
a0c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a0d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
a0e0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64   to which to add
a0f0: 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20   the span. */.  
a100: 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20  ExprSpan *pSpan 
a110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
a120: 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20  pan to be added 
a130: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
a140: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a150: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
a160: 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  t!=0 || db->mall
a170: 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20  ocFailed!=0 );. 
a180: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
a190: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a1a0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
a1b0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
a1c0: 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61  >nExpr-1];.    a
a1d0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
a1e0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  xpr>0 );.    ass
a1f0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
a200: 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e  ailed || pItem->
a210: 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45  pExpr==pSpan->pE
a220: 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  xpr );.    sqlit
a230: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
a240: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
a250: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73  pItem->zSpan = s
a260: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
a270: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
a280: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
a2b0: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
a2c0: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
a2d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a2e0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
a2f0: 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f  n list pEList co
a300: 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e  ntains more than
a310: 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73   iLimit elements
a320: 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72  ,.** leave an er
a330: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
a340: 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Parse..*/.void s
a350: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
a360: 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72  eckLength(.  Par
a370: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78  se *pParse,.  Ex
a380: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a  prList *pEList,.
a390: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
a3a0: 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d  bject.){.  int m
a3b0: 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  x = pParse->db->
a3c0: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
a3d0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74  MIT_COLUMN];.  t
a3e0: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
a3f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
a400: 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61  ==mx );.  testca
a410: 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  se( pEList && pE
a420: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b  List->nExpr==mx+
a430: 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  1 );.  if( pELis
a440: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
a450: 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c  pr>mx ){.    sql
a460: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a470: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
a480: 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a  olumns in %s", z
a490: 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Object);.  }.}..
a4a0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
a4b0: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
a4c0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
a4d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a4e0: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
a4f0: 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  b, ExprList *pLi
a500: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
a510: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a520: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
a530: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
a540: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
a550: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70  pList->a!=0 || p
a560: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29  List->nExpr==0 )
a570: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
a580: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
a590: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
a5a0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
a5b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
a5c0: 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78  e(db, pItem->pEx
a5d0: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
a5e0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
a5f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
a600: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a610: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
a620: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
a630: 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
a640: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
a650: 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
a660: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a670: 65 20 62 69 74 77 69 73 65 2d 4f 52 20 6f 66 20  e bitwise-OR of 
a680: 61 6c 6c 20 45 78 70 72 2e 66 6c 61 67 73 20 66  all Expr.flags f
a690: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 67 69 76  ields in the giv
a6a0: 65 6e 0a 2a 2a 20 45 78 70 72 4c 69 73 74 2e 0a  en.** ExprList..
a6b0: 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 45 78  */.u32 sqlite3Ex
a6c0: 70 72 4c 69 73 74 46 6c 61 67 73 28 63 6f 6e 73  prListFlags(cons
a6d0: 74 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  t ExprList *pLis
a6e0: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  t){.  int i;.  u
a6f0: 33 32 20 6d 20 3d 20 30 3b 0a 20 20 69 66 28 20  32 m = 0;.  if( 
a700: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
a710: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
a720: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
a730: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
a740: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
a750: 70 72 3b 0a 20 20 20 20 20 20 20 61 73 73 65 72  pr;.       asser
a760: 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20  t( pExpr!=0 );. 
a770: 20 20 20 20 20 20 6d 20 7c 3d 20 70 45 78 70 72        m |= pExpr
a780: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20  ->flags;.    }. 
a790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d   }.  return m;.}
a7a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
a7b0: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
a7c0: 72 20 63 61 6c 6c 62 61 63 6b 73 20 75 73 65 64  r callbacks used
a7d0: 20 74 6f 20 63 68 65 63 6b 20 65 78 70 72 65 73   to check expres
a7e0: 73 69 6f 6e 73 20 74 6f 0a 2a 2a 20 73 65 65 20  sions to.** see 
a7f0: 69 66 20 74 68 65 79 20 61 72 65 20 22 63 6f 6e  if they are "con
a800: 73 74 61 6e 74 22 20 66 6f 72 20 73 6f 6d 65 20  stant" for some 
a810: 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 63 6f  definition of co
a820: 6e 73 74 61 6e 74 2e 20 20 54 68 65 0a 2a 2a 20  nstant.  The.** 
a830: 57 61 6c 6b 65 72 2e 65 43 6f 64 65 20 76 61 6c  Walker.eCode val
a840: 75 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74 68  ue determines th
a850: 65 20 74 79 70 65 20 6f 66 20 22 63 6f 6e 73 74  e type of "const
a860: 61 6e 74 22 20 77 65 20 61 72 65 20 6c 6f 6f 6b  ant" we are look
a870: 69 6e 67 0a 2a 2a 20 66 6f 72 2e 0a 2a 2a 0a 2a  ing.** for..**.*
a880: 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63 6b  * These callback
a890: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
a8a0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
a8b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
a8c0: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  *.**     sqlite3
a8d0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29  ExprIsConstant()
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
a900: 3d 3d 31 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  ==1.**     sqlit
a910: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a920: 4e 6f 74 4a 6f 69 6e 28 29 20 20 20 20 20 20 20  NotJoin()       
a930: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
a940: 64 65 3d 3d 32 0a 2a 2a 20 20 20 20 20 73 71 6c  de==2.**     sql
a950: 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43  ite3ExprIsTableC
a960: 6f 6e 73 74 61 6e 74 28 29 20 20 20 20 20 20 20  onstant()       
a970: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65        pWalker->e
a980: 43 6f 64 65 3d 3d 33 0a 2a 2a 20 20 20 20 20 73  Code==3.**     s
a990: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
a9a0: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
a9b0: 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d          pWalker-
a9c0: 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20 35 0a 2a  >eCode==4 or 5.*
a9d0: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65  *.** In all case
a9e0: 73 2c 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 73  s, the callbacks
a9f0: 20 73 65 74 20 57 61 6c 6b 65 72 2e 65 43 6f 64   set Walker.eCod
aa00: 65 3d 30 20 61 6e 64 20 61 62 6f 72 74 20 69 66  e=0 and abort if
aa10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
aa20: 2a 2a 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 6e  ** is found to n
aa30: 6f 74 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ot be a constant
aa40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
aa50: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
aa60: 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29 20 69 73  tOrFunction() is
aa70: 20 75 73 65 64 20 66 6f 72 20 65 76 61 6c 75 61   used for evalua
aa80: 74 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  ting expressions
aa90: 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20  .** in a CREATE 
aaa0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
aab0: 20 20 54 68 65 20 57 61 6c 6b 65 72 2e 65 43 6f    The Walker.eCo
aac0: 64 65 20 76 61 6c 75 65 20 69 73 20 35 20 77 68  de value is 5 wh
aad0: 65 6e 20 70 61 72 73 69 6e 67 0a 2a 2a 20 61 6e  en parsing.** an
aae0: 20 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61   existing schema
aaf0: 20 61 6e 64 20 34 20 77 68 65 6e 20 70 72 6f 63   and 4 when proc
ab00: 65 73 73 69 6e 67 20 61 20 6e 65 77 20 73 74 61  essing a new sta
ab10: 74 65 6d 65 6e 74 2e 20 20 41 20 62 6f 75 6e 64  tement.  A bound
ab20: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 72 61  .** parameter ra
ab30: 69 73 65 73 20 61 6e 20 65 72 72 6f 72 20 66 6f  ises an error fo
ab40: 72 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 73  r new statements
ab50: 2c 20 62 75 74 20 69 73 20 73 69 6c 65 6e 74 6c  , but is silentl
ab60: 79 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  y converted.** t
ab70: 6f 20 4e 55 4c 4c 20 66 6f 72 20 65 78 69 73 74  o NULL for exist
ab80: 69 6e 67 20 73 63 68 65 6d 61 73 2e 20 20 54 68  ing schemas.  Th
ab90: 69 73 20 61 6c 6c 6f 77 73 20 73 71 6c 69 74 65  is allows sqlite
aba0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 74  _master tables t
abb0: 68 61 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  hat .** contain 
abc0: 61 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65  a bound paramete
abd0: 72 20 62 65 63 61 75 73 65 20 74 68 65 79 20 77  r because they w
abe0: 65 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ere generated by
abf0: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 0a   older versions.
ac00: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 74 6f 20  ** of SQLite to 
ac10: 62 65 20 70 61 72 73 65 64 20 62 79 20 6e 65 77  be parsed by new
ac20: 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
ac30: 51 4c 69 74 65 20 77 69 74 68 6f 75 74 20 72 61  QLite without ra
ac40: 69 73 69 6e 67 20 61 0a 2a 2a 20 6d 61 6c 66 6f  ising a.** malfo
ac50: 72 6d 65 64 20 73 63 68 65 6d 61 20 65 72 72 6f  rmed schema erro
ac60: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ac70: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
ac80: 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ant(Walker *pWal
ac90: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
aca0: 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61 6c  ){..  /* If pWal
acb0: 6b 65 72 2d 3e 65 43 6f 64 65 20 69 73 20 32 20  ker->eCode is 2 
acc0: 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66  then any term of
acd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ace0: 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a  that comes from.
acf0: 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55    ** the ON or U
ad00: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
ad10: 61 20 6c 65 66 74 20 6a 6f 69 6e 20 64 69 73 71  a left join disq
ad20: 75 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70  ualifies the exp
ad30: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f  ression.  ** fro
ad40: 6d 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72  m being consider
ad50: 65 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a  ed constant. */.
ad60: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
ad70: 43 6f 64 65 3d 3d 32 20 26 26 20 45 78 70 72 48  Code==2 && ExprH
ad80: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
ad90: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
ada0: 7b 0a 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65  {.    pWalker->e
adb0: 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 72 65  Code = 0;.    re
adc0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
add0: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 70    }..  switch( p
ade0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
adf0: 2f 2a 20 43 6f 6e 73 69 64 65 72 20 66 75 6e 63  /* Consider func
ae00: 74 69 6f 6e 73 20 74 6f 20 62 65 20 63 6f 6e 73  tions to be cons
ae10: 74 61 6e 74 20 69 66 20 61 6c 6c 20 74 68 65 69  tant if all thei
ae20: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  r arguments are 
ae30: 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 2a 2a 20  constant.    ** 
ae40: 61 6e 64 20 65 69 74 68 65 72 20 70 57 61 6c 6b  and either pWalk
ae50: 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f 72 20  er->eCode==4 or 
ae60: 35 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f  5 or the functio
ae70: 6e 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  n has the.    **
ae80: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
ae90: 53 54 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20  ST flag. */.    
aea0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
aeb0: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c  :.      if( pWal
aec0: 6b 65 72 2d 3e 65 43 6f 64 65 3e 3d 34 20 7c 7c  ker->eCode>=4 ||
aed0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
aee0: 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46  (pExpr,EP_ConstF
aef0: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
af00: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
af10: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
af20: 7b 0a 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65  {.        pWalke
af30: 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
af40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
af50: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
af60: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
af70: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
af80: 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  MN:.    case TK_
af90: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  AGG_FUNCTION:.  
afa0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
afb0: 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73 74  LUMN:.      test
afc0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
afd0: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
afe0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
aff0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
b000: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b010: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
b020: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a  AGG_FUNCTION );.
b030: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b040: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
b050: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  G_COLUMN );.    
b060: 20 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65    if( pWalker->e
b070: 43 6f 64 65 3d 3d 33 20 26 26 20 70 45 78 70 72  Code==3 && pExpr
b080: 2d 3e 69 54 61 62 6c 65 3d 3d 70 57 61 6c 6b 65  ->iTable==pWalke
b090: 72 2d 3e 75 2e 69 43 75 72 20 29 7b 0a 20 20 20  r->u.iCur ){.   
b0a0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
b0b0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
b0c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
b0d0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
b0e0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
b0f0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b100: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b110: 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20  _VARIABLE:.     
b120: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 65 43   if( pWalker->eC
b130: 6f 64 65 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20  ode==5 ){.      
b140: 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 63 6f    /* Silently co
b150: 6e 76 65 72 74 20 62 6f 75 6e 64 20 70 61 72 61  nvert bound para
b160: 6d 65 74 65 72 73 20 74 68 61 74 20 61 70 70 65  meters that appe
b170: 61 72 20 69 6e 73 69 64 65 20 6f 66 20 43 52 45  ar inside of CRE
b180: 41 54 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ATE.        ** s
b190: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61  tatements into a
b1a0: 20 4e 55 4c 4c 20 77 68 65 6e 20 70 61 72 73 69   NULL when parsi
b1b0: 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 73 74  ng the CREATE st
b1c0: 61 74 65 6d 65 6e 74 20 74 65 78 74 20 6f 75 74  atement text out
b1d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
b1e0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b1f0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
b200: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
b210: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c  _NULL;.      }el
b220: 73 65 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e  se if( pWalker->
b230: 65 43 6f 64 65 3d 3d 34 20 29 7b 0a 20 20 20 20  eCode==4 ){.    
b240: 20 20 20 20 2f 2a 20 41 20 62 6f 75 6e 64 20 70      /* A bound p
b250: 61 72 61 6d 65 74 65 72 20 69 6e 20 61 20 43 52  arameter in a CR
b260: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  EATE statement t
b270: 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
b280: 72 6f 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  rom.        ** s
b290: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
b2a0: 20 63 61 75 73 65 73 20 61 6e 20 65 72 72 6f 72   causes an error
b2b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 61 6c   */.        pWal
b2c0: 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
b2d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
b2e0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
b2f0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
b300: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 20 20 64  through */.    d
b310: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 74 65  efault:.      te
b320: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
b330: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 20  p==TK_SELECT ); 
b340: 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43  /* selectNodeIsC
b350: 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69 73  onstant will dis
b360: 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 74  allow */.      t
b370: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
b380: 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b  op==TK_EXISTS );
b390: 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49 73   /* selectNodeIs
b3a0: 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64 69  Constant will di
b3b0: 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  sallow */.      
b3c0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
b3d0: 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  nue;.  }.}.stati
b3e0: 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f 64 65  c int selectNode
b3f0: 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65  IsConstant(Walke
b400: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
b410: 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  ct *NotUsed){.  
b420: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
b430: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70 57 61  (NotUsed);.  pWa
b440: 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b  lker->eCode = 0;
b450: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62  .  return WRC_Ab
b460: 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  ort;.}.static in
b470: 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78  t exprIsConst(Ex
b480: 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46  pr *p, int initF
b490: 6c 61 67 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a  lag, int iCur){.
b4a0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
b4b0: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
b4c0: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64  of(w));.  w.eCod
b4d0: 65 20 3d 20 69 6e 69 74 46 6c 61 67 3b 0a 20 20  e = initFlag;.  
b4e0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
b4f0: 3d 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  = exprNodeIsCons
b500: 74 61 6e 74 3b 0a 20 20 77 2e 78 53 65 6c 65 63  tant;.  w.xSelec
b510: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
b520: 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  ctNodeIsConstant
b530: 3b 0a 20 20 77 2e 75 2e 69 43 75 72 20 3d 20 69  ;.  w.u.iCur = i
b540: 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  Cur;.  sqlite3Wa
b550: 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a 20  lkExpr(&w, p);. 
b560: 20 72 65 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b   return w.eCode;
b570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
b580: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b590: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
b5a0: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
b5b0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
b5c0: 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74  t.** and 0 if it
b5d0: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
b5e0: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
b5f0: 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  calls..**.** For
b600: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
b610: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
b620: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
b630: 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63  string (ex: "abc
b640: 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65  ").** is conside
b650: 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62  red a variable b
b660: 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74  ut a single-quot
b670: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27  ed string (ex: '
b680: 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f  abc') is.** a co
b690: 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  nstant..*/.int s
b6a0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
b6b0: 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20  tant(Expr *p){. 
b6c0: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
b6d0: 6e 73 74 28 70 2c 20 31 2c 20 30 29 3b 0a 7d 0a  nst(p, 1, 0);.}.
b6e0: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
b6f0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
b700: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
b710: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
b720: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
b730: 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f  * that does no o
b740: 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68  riginate from th
b750: 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
b760: 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e  auses of a join.
b770: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
b780: 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69  it involves vari
b790: 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f  ables or functio
b7a0: 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73  n calls or terms
b7b0: 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f   from.** an ON o
b7c0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  r USING clause..
b7d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
b7e0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a  prIsConstantNotJ
b7f0: 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  oin(Expr *p){.  
b800: 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e  return exprIsCon
b810: 73 74 28 70 2c 20 32 2c 20 30 29 3b 0a 7d 0a 0a  st(p, 2, 0);.}..
b820: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
b830: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
b840: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
b850: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
b860: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  n is constant.**
b870: 20 66 6f 72 20 61 6e 79 20 73 69 6e 67 6c 65 20   for any single 
b880: 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
b890: 20 77 69 74 68 20 63 75 72 73 6f 72 20 69 43 75   with cursor iCu
b8a0: 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
b8b0: 64 73 2c 20 74 68 65 0a 2a 2a 20 65 78 70 72 65  ds, the.** expre
b8c0: 73 73 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 20 72  ssion must not r
b8d0: 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 6f 6e 2d  efer to any non-
b8e0: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75  deterministic fu
b8f0: 6e 63 74 69 6f 6e 20 6e 6f 72 20 61 6e 79 0a 2a  nction nor any.*
b900: 2a 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68  * table other th
b910: 61 6e 20 69 43 75 72 2e 0a 2a 2f 0a 69 6e 74 20  an iCur..*/.int 
b920: 73 71 6c 69 74 65 33 45 78 70 72 49 73 54 61 62  sqlite3ExprIsTab
b930: 6c 65 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  leConstant(Expr 
b940: 2a 70 2c 20 69 6e 74 20 69 43 75 72 29 7b 0a 20  *p, int iCur){. 
b950: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
b960: 6e 73 74 28 70 2c 20 33 2c 20 69 43 75 72 29 3b  nst(p, 3, iCur);
b970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
b980: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
b990: 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  e.  Return non-z
b9a0: 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72 65  ero if the expre
b9b0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
b9c0: 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
b9d0: 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
b9e0: 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
b9f0: 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
ba00: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
ba10: 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
ba20: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
ba30: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
ba40: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
ba50: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
ba60: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
ba70: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
ba80: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
ba90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
baa0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
bab0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
bac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
bad0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
bae0: 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 2c 20 75  ction(Expr *p, u
baf0: 38 20 69 73 49 6e 69 74 29 7b 0a 20 20 61 73 73  8 isInit){.  ass
bb00: 65 72 74 28 20 69 73 49 6e 69 74 3d 3d 30 20 7c  ert( isInit==0 |
bb10: 7c 20 69 73 49 6e 69 74 3d 3d 31 20 29 3b 0a 20  | isInit==1 );. 
bb20: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
bb30: 6e 73 74 28 70 2c 20 34 2b 69 73 49 6e 69 74 2c  nst(p, 4+isInit,
bb40: 20 30 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   0);.}..#ifdef S
bb50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
bb60: 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
bb70: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
bb80: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
bb90: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
bba0: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 0a  sion contains a.
bbb0: 2a 2a 20 73 75 62 71 75 65 72 79 20 6f 66 20 73  ** subquery of s
bbc0: 6f 6d 65 20 6b 69 6e 64 2e 20 20 52 65 74 75 72  ome kind.  Retur
bbd0: 6e 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  n 0 if there are
bbe0: 20 6e 6f 20 73 75 62 71 75 65 72 69 65 73 2e 0a   no subqueries..
bbf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
bc00: 70 72 43 6f 6e 74 61 69 6e 73 53 75 62 71 75 65  prContainsSubque
bc10: 72 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 57  ry(Expr *p){.  W
bc20: 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
bc30: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
bc40: 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d  w));.  w.eCode =
bc50: 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   1;.  w.xExprCal
bc60: 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
bc70: 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
bc80: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
bc90: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
bca0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
bcb0: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
bcc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
bcd0: 6f 64 65 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  ode==0;.}.#endif
bce0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
bcf0: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
bd00: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
bd10: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
bd20: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
bd30: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
bd40: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
bd50: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
bd60: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
bd70: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
bd80: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
bd90: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
bda0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
bdb0: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
bdc0: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
bdd0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
bde0: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
bdf0: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
be00: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
be10: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
be20: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
be30: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
be40: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
be50: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
be60: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
be70: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
be80: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
be90: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
bea0: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
beb0: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
bec0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
bed0: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
bee0: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
bef0: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
bf00: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
bf10: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
bf20: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
bf30: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
bf40: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
bf50: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
bf60: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
bf70: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
bf80: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
bf90: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
bfa0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
bfb0: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
bfc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bfd0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
bfe0: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
bff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c000: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c010: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
c020: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
c030: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
c040: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
c050: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
c060: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
c070: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
c080: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
c090: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
c0a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
c0b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c0c0: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
c0d0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
c0e0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
c0f0: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
c100: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
c110: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
c120: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
c130: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
c140: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
c150: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
c160: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
c170: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
c180: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
c190: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
c1a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
c1b0: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
c1c0: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
c1d0: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
c1e0: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
c1f0: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
c200: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
c210: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
c220: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
c230: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
c240: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
c250: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
c260: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
c270: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
c280: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
c290: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
c2a0: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
c2b0: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
c2c0: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
c2d0: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
c2e0: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
c2f0: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
c300: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
c310: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
c320: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
c330: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
c340: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
c350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
c360: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
c370: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
c380: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
c390: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
c3a0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
c3b0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
c3c0: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
c3d0: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
c3e0: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
c3f0: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
c400: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c410: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
c420: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
c430: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
c440: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
c450: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
c460: 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
c470: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73  COLUMN:.      as
c480: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30  sert( p->pTab!=0
c490: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
c4a0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
c4b0: 28 70 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  (p, EP_CanBeNull
c4c0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
c4d0: 20 20 28 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30    (p->iColumn>=0
c4e0: 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f   && p->pTab->aCo
c4f0: 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
c500: 74 4e 75 6c 6c 3d 3d 30 29 3b 0a 20 20 20 20 64  tNull==0);.    d
c510: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
c520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
c530: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
c540: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   if the given ex
c550: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
c560: 6e 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75  nstant which wou
c570: 6c 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67  ld be.** unchang
c580: 65 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74  ed by OP_Affinit
c590: 79 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e  y with the affin
c5a0: 69 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ity given in the
c5b0: 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
c5c0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
c5d0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
c5e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
c5f0: 74 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20  the OP_Affinity 
c600: 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  operation.** can
c610: 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68   be omitted.  Wh
c620: 65 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75  en in doubt retu
c630: 72 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c  rn FALSE.  A fal
c640: 73 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69  se negative.** i
c650: 73 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66  s harmless.  A f
c660: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68  alse positive, h
c670: 6f 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75  owever, can resu
c680: 6c 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a  lt in the wrong.
c690: 2a 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e  ** answer..*/.in
c6a0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65  t sqlite3ExprNee
c6b0: 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e  dsNoAffinityChan
c6c0: 67 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70  ge(const Expr *p
c6d0: 2c 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75  , char aff){.  u
c6e0: 38 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d  8 op;.  if( aff=
c6f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42  =SQLITE_AFF_BLOB
c700: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77   ) return 1;.  w
c710: 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  hile( p->op==TK_
c720: 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  UPLUS || p->op==
c730: 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d  TK_UMINUS ){ p =
c740: 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f   p->pLeft; }.  o
c750: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28  p = p->op;.  if(
c760: 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52   op==TK_REGISTER
c770: 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a   ) op = p->op2;.
c780: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
c790: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
c7a0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  GER: {.      ret
c7b0: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
c7c0: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
c7d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
c7e0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20  UMERIC;.    }.  
c7f0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
c800: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
c810: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
c820: 52 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  REAL || aff==SQL
c830: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
c840: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c850: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
c860: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
c870: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
c880: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c890: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
c8a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c8b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
c8c0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  MN: {.      asse
c8d0: 72 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30  rt( p->iTable>=0
c8e0: 20 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74   );  /* p cannot
c8f0: 20 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48   be part of a CH
c900: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  ECK constraint *
c910: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
c920: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20  ->iColumn<0.    
c930: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
c940: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c950: 52 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  R || aff==SQLITE
c960: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20  _AFF_NUMERIC);. 
c970: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
c980: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
c990: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
c9a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
c9b0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
c9c0: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
c9d0: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
c9e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
c9f0: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
ca00: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
ca10: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
ca20: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
ca30: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
ca40: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
ca50: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
ca60: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
ca70: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
ca80: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
ca90: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
caa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 58 20 69 73  ;.}../*.** pX is
cab0: 20 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49   the RHS of an I
cac0: 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20  N operator.  If 
cad0: 70 58 20 69 73 20 61 20 53 45 4c 45 43 54 20 73  pX is a SELECT s
cae0: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 74 68 61  tatement .** tha
caf0: 74 20 63 61 6e 20 62 65 20 73 69 6d 70 6c 69 66  t can be simplif
cb00: 69 65 64 20 74 6f 20 61 20 64 69 72 65 63 74 20  ied to a direct 
cb10: 74 61 62 6c 65 20 61 63 63 65 73 73 2c 20 74 68  table access, th
cb20: 65 6e 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70  en return.** a p
cb30: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 53 45  ointer to the SE
cb40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
cb50: 20 49 66 20 70 58 20 69 73 20 6e 6f 74 20 61 20   If pX is not a 
cb60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
cb70: 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 53  ,.** or if the S
cb80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
cb90: 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 61 6e 69  needs to be mani
cba0: 66 65 73 74 65 64 20 69 6e 74 6f 20 61 20 74 72  fested into a tr
cbb0: 61 6e 73 69 65 6e 74 0a 2a 2a 20 74 61 62 6c 65  ansient.** table
cbc0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  , then return NU
cbd0: 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  LL..*/.#ifndef S
cbe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
cbf0: 45 52 59 0a 73 74 61 74 69 63 20 53 65 6c 65 63  ERY.static Selec
cc00: 74 20 2a 69 73 43 61 6e 64 69 64 61 74 65 46 6f  t *isCandidateFo
cc10: 72 49 6e 4f 70 74 28 45 78 70 72 20 2a 70 58 29  rInOpt(Expr *pX)
cc20: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 0a 20  {.  Select *p;. 
cc30: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
cc40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
cc50: 73 74 3b 0a 20 20 45 78 70 72 20 2a 70 52 65 73  st;.  Expr *pRes
cc60: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
cc70: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
cc80: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
cc90: 49 73 53 65 6c 65 63 74 29 20 29 20 72 65 74 75  IsSelect) ) retu
cca0: 72 6e 20 30 3b 20 20 2f 2a 20 4e 6f 74 20 61 20  rn 0;  /* Not a 
ccb0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
ccc0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ccd0: 79 28 70 58 2c 20 45 50 5f 56 61 72 53 65 6c 65  y(pX, EP_VarSele
cce0: 63 74 29 20 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)  ) return 0;
ccf0: 20 20 2f 2a 20 43 6f 72 72 65 6c 61 74 65 64 20    /* Correlated 
cd00: 73 75 62 71 20 2a 2f 0a 20 20 70 20 3d 20 70 58  subq */.  p = pX
cd10: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69  ->x.pSelect;.  i
cd20: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20 72  f( p->pPrior ) r
cd30: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
cd40: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20 63        /* Not a c
cd50: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
cd60: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
cd70: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
cd80: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
cd90: 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
cda0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
cdb0: 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
cdc0: 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
cdd0: 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
cde0: 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e 73   testcase( (p->s
cdf0: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
ce00: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
ce10: 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
ce20: 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ate );.    retur
ce30: 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54 49  n 0; /* No DISTI
ce40: 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64 20  NCT keyword and 
ce50: 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  no aggregate fun
ce60: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20 20  ctions */.  }.  
ce70: 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
ce80: 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  pBy==0 );       
ce90: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f         /* Has no
cea0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ceb0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   */.  if( p->pLi
cec0: 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cee0: 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61  Has no LIMIT cla
cef0: 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  use */.  assert(
cf00: 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29   p->pOffset==0 )
cf10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cf20: 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61 6e  /* No LIMIT mean
cf30: 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a 20  s no OFFSET */. 
cf40: 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
cf50: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
cf60: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
cf70: 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  o WHERE clause *
cf80: 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  /.  pSrc = p->pS
cf90: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
cfa0: 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  rc!=0 );.  if( p
cfb0: 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
cfc0: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
cfd0: 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72 6d    /* Single term
cfe0: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
cff0: 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 61  */.  if( pSrc->a
d000: 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72 65  [0].pSelect ) re
d010: 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 46  turn 0;     /* F
d020: 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ROM is not a sub
d030: 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a 2f  query or view */
d040: 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
d050: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 61 73 73  a[0].pTab;.  ass
d060: 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
d070: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
d080: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
d0a0: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
d0b0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
d0c0: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
d0d0: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
d0e0: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
d0f0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
d100: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
d110: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
d120: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
d130: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
d140: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
d150: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
d160: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 70 52 65 73  lt set */.  pRes
d170: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e   = pEList->a[0].
d180: 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52 65  pExpr;.  if( pRe
d190: 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  s->op!=TK_COLUMN
d1a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
d1b0: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
d1c0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 61 73 73 65 72  olumn */.  asser
d1d0: 74 28 20 70 52 65 73 2d 3e 69 54 61 62 6c 65 3d  t( pRes->iTable=
d1e0: 3d 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  =pSrc->a[0].iCur
d1f0: 73 6f 72 20 29 3b 20 20 2f 2a 20 4e 6f 74 20 61  sor );  /* Not a
d200: 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
d210: 75 65 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  uery */.  return
d220: 20 70 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   p;.}.#endif /* 
d230: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
d240: 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UERY */../*.** C
d250: 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69  ode an OP_Once i
d260: 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61  nstruction and a
d270: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
d280: 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75  r its flag. Retu
d290: 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65  rn the .** addre
d2a0: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
d2b0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  struction..*/.in
d2c0: 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  t sqlite3CodeOnc
d2d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
d2e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
d2f0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
d300: 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69  rse);      /* Vi
d310: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65  rtual machine be
d320: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72  ing coded */.  r
d330: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
d340: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e  eAddOp1(v, OP_On
d350: 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  ce, pParse->nOnc
d360: 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  e++);.}../*.** G
d370: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
d380: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66  t checks the lef
d390: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66  t-most column of
d3a0: 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75   index table iCu
d3b0: 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69  r to see if.** i
d3c0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e  t contains any N
d3d0: 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61  ULL entries.  Ca
d3e0: 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72  use the register
d3f0: 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74   at regHasNull t
d400: 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  o be set.** to a
d410: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
d420: 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
d430: 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73   no NULLs.  Caus
d440: 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61  e register regHa
d450: 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73  sNull.** to be s
d460: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43  et to NULL if iC
d470: 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  ur contains one 
d480: 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
d490: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
d4a0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61  oid sqlite3SetHa
d4b0: 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a  sNullFlag(Vdbe *
d4c0: 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74  v, int iCur, int
d4d0: 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20   regHasNull){.  
d4e0: 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 73 71 6c  int addr1;.  sql
d4f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d500: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
d510: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
d520: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
d530: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d540: 52 65 77 69 6e 64 2c 20 69 43 75 72 29 3b 20 56  Rewind, iCur); V
d550: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d560: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d570: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
d580: 2c 20 69 43 75 72 2c 20 30 2c 20 72 65 67 48 61  , iCur, 0, regHa
d590: 73 4e 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  sNull);.  sqlite
d5a0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
d5b0: 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52   OPFLAG_TYPEOFAR
d5c0: 47 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  G);.  VdbeCommen
d5d0: 74 28 28 76 2c 20 22 66 69 72 73 74 5f 65 6e 74  t((v, "first_ent
d5e0: 72 79 5f 69 6e 28 25 64 29 22 2c 20 69 43 75 72  ry_in(%d)", iCur
d5f0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
d600: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
d610: 72 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  r1);.}...#ifndef
d620: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d630: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 65 20  QUERY./*.** The 
d640: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 49  argument is an I
d650: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
d660: 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20 73 75  a list (not a su
d670: 62 71 75 65 72 79 29 20 6f 6e 20 74 68 65 20 0a  bquery) on the .
d680: 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  ** right-hand si
d690: 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
d6a0: 20 69 66 20 74 68 61 74 20 6c 69 73 74 20 69 73   if that list is
d6b0: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 73 74   constant..*/.st
d6c0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
d6d0: 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74 28  InRhsIsConstant(
d6e0: 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20 20 45 78  Expr *pIn){.  Ex
d6f0: 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69 6e 74 20  pr *pLHS;.  int 
d700: 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 21  res;.  assert( !
d710: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d720: 70 49 6e 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  pIn, EP_xIsSelec
d730: 74 29 20 29 3b 0a 20 20 70 4c 48 53 20 3d 20 70  t) );.  pLHS = p
d740: 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20 70 49 6e  In->pLeft;.  pIn
d750: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 72  ->pLeft = 0;.  r
d760: 65 73 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  es = sqlite3Expr
d770: 49 73 43 6f 6e 73 74 61 6e 74 28 70 49 6e 29 3b  IsConstant(pIn);
d780: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
d790: 70 4c 48 53 3b 0a 20 20 72 65 74 75 72 6e 20 72  pLHS;.  return r
d7a0: 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  es;.}.#endif../*
d7b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d7c0: 6e 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  n is used by the
d7d0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
d7e0: 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e 2e 29 20  of the IN (...) 
d7f0: 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 54 68 65  operator..** The
d800: 20 70 58 20 70 61 72 61 6d 65 74 65 72 20 69 73   pX parameter is
d810: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
d820: 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  on the RHS of th
d830: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77  e IN operator, w
d840: 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65  hich.** might be
d850: 20 65 69 74 68 65 72 20 61 20 6c 69 73 74 20 6f   either a list o
d860: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 72  f expressions or
d870: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a   a subquery..**.
d880: 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
d890: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
d8a0: 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20   find or create 
d8b0: 61 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20  a b-tree object 
d8c0: 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62 65 20 75  that can.** be u
d8d0: 73 65 64 20 65 69 74 68 65 72 20 74 6f 20 74 65  sed either to te
d8e0: 73 74 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  st for membershi
d8f0: 70 20 69 6e 20 74 68 65 20 52 48 53 20 73 65 74  p in the RHS set
d900: 20 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74   or to iterate t
d910: 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c 20 6d 65  hrough.** all me
d920: 6d 62 65 72 73 20 6f 66 20 74 68 65 20 52 48 53  mbers of the RHS
d930: 20 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 64   set, skipping d
d940: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  uplicates..**.**
d950: 20 41 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65   A cursor is ope
d960: 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d 74 72 65  ned on the b-tre
d970: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73  e object that is
d980: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
d990: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 61  IN operator.** a
d9a0: 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65 20 69 73  nd pX->iTable is
d9b0: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
d9c0: 78 20 6f 66 20 74 68 61 74 20 63 75 72 73 6f 72  x of that cursor
d9d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
d9e0: 72 6e 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  rned value of th
d9f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69  is function indi
da00: 63 61 74 65 73 20 74 68 65 20 62 2d 74 72 65 65  cates the b-tree
da10: 20 74 79 70 65 2c 20 61 73 20 66 6f 6c 6c 6f 77   type, as follow
da20: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e 5f 49 4e  s:.**.**   IN_IN
da30: 44 45 58 5f 52 4f 57 49 44 20 20 20 20 20 20 2d  DEX_ROWID      -
da40: 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73 20   The cursor was 
da50: 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 61 74 61  opened on a data
da60: 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20  base table..**  
da70: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
da80: 41 53 43 20 20 2d 20 54 68 65 20 63 75 72 73 6f  ASC  - The curso
da90: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
daa0: 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
dab0: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
dac0: 58 5f 49 4e 44 45 58 5f 44 45 53 43 20 2d 20 54  X_INDEX_DESC - T
dad0: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
dae0: 65 6e 65 64 20 6f 6e 20 61 20 64 65 73 63 65 6e  ened on a descen
daf0: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
db00: 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48 20 20 20   IN_INDEX_EPH   
db10: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
db20: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
db30: 61 20 73 70 65 63 69 61 6c 6c 79 20 63 72 65 61  a specially crea
db40: 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ted and.**      
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 65 70 68     populated eph
db70: 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  eremal table..**
db80: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50     IN_INDEX_NOOP
db90: 20 20 20 20 20 20 20 2d 20 4e 6f 20 63 75 72 73         - No curs
dba0: 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
dbb0: 2e 20 20 54 68 65 20 49 4e 20 6f 70 65 72 61 74  .  The IN operat
dbc0: 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 20 20  or must be.**   
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 65        implemente
dbf0: 64 20 61 73 20 61 20 73 65 71 75 65 6e 63 65 20  d as a sequence 
dc00: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a  of comparisons..
dc10: 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73 74 69 6e  **.** An existin
dc20: 67 20 62 2d 74 72 65 65 20 6d 69 67 68 74 20 62  g b-tree might b
dc30: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 52 48  e used if the RH
dc40: 53 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 20  S expression pX 
dc50: 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 73  is a simple.** s
dc60: 75 62 71 75 65 72 79 20 73 75 63 68 20 61 73 3a  ubquery such as:
dc70: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
dc80: 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20  T <column> FROM 
dc90: 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a 20 49 66  <table>.**.** If
dca0: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
dcb0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61  IN operator is a
dcc0: 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f 72 65 20   list or a more 
dcd0: 63 6f 6d 70 6c 65 78 20 73 75 62 71 75 65 72 79  complex subquery
dce0: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 65 70 68  , then.** an eph
dcf0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6d 69 67  emeral table mig
dd00: 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 67 65  ht need to be ge
dd10: 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
dd20: 20 52 48 53 20 61 6e 64 20 74 68 65 6e 0a 2a 2a   RHS and then.**
dd30: 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d 61 64 65   pX->iTable made
dd40: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
dd50: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
dd60: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 0a 2a   instead of an.*
dd70: 2a 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  * existing table
dd80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 46 6c  ..**.** The inFl
dd90: 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ags parameter mu
dda0: 73 74 20 63 6f 6e 74 61 69 6e 20 65 78 61 63 74  st contain exact
ddb0: 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 69  ly one of the bi
ddc0: 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d  ts.** IN_INDEX_M
ddd0: 45 4d 42 45 52 53 48 49 50 20 6f 72 20 49 4e 5f  EMBERSHIP or IN_
dde0: 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20 49 66 20  INDEX_LOOP.  If 
ddf0: 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73  inFlags contains
de00: 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  .** IN_INDEX_MEM
de10: 42 45 52 53 48 49 50 2c 20 74 68 65 6e 20 74 68  BERSHIP, then th
de20: 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c  e generated tabl
de30: 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  e will be used f
de40: 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20 6d 65 6d  or a.** fast mem
de50: 62 65 72 73 68 69 70 20 74 65 73 74 2e 20 20 57  bership test.  W
de60: 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e 44 45 58  hen the IN_INDEX
de70: 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20 73 65 74  _LOOP bit is set
de80: 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69 6e 64 65  , the.** IN inde
de90: 78 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  x will be used t
dea0: 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  o loop over all 
deb0: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 52 48  values of the RH
dec0: 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 20 6f  S of the.** IN o
ded0: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  perator..**.** W
dee0: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  hen IN_INDEX_LOO
def0: 50 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74  P is used (and t
df00: 68 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62  he b-tree will b
df10: 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
df20: 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65  e.** through the
df30: 20 73 65 74 20 6d 65 6d 62 65 72 73 29 20 74 68   set members) th
df40: 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  en the b-tree mu
df50: 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 64  st not contain d
df60: 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a 20 41 6e  uplicates..** An
df70: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
df80: 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 75 6e   must be used un
df90: 6c 65 73 73 20 74 68 65 20 73 65 6c 65 63 74 65  less the selecte
dfa0: 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 67 75  d <column> is gu
dfb0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
dfc0: 65 20 75 6e 69 71 75 65 20 2d 20 65 69 74 68 65  e unique - eithe
dfd0: 72 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  r because it is 
dfe0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
dff0: 52 59 20 4b 45 59 20 6f 72 20 69 74 0a 2a 2a 20  RY KEY or it.** 
e000: 68 61 73 20 61 20 55 4e 49 51 55 45 20 63 6f 6e  has a UNIQUE con
e010: 73 74 72 61 69 6e 74 20 6f 72 20 55 4e 49 51 55  straint or UNIQU
e020: 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 57  E index..**.** W
e030: 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d  hen IN_INDEX_MEM
e040: 42 45 52 53 48 49 50 20 69 73 20 75 73 65 64 20  BERSHIP is used 
e050: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
e060: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
e070: 20 66 6f 72 20 66 61 73 74 20 73 65 74 20 6d 65   for fast set me
e080: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 29 20  mbership tests) 
e090: 74 68 65 6e 20 61 6e 20 65 70 68 65 72 65 6d 61  then an epherema
e0a0: 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 0a 2a 2a  l table must .**
e0b0: 20 62 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20   be used unless 
e0c0: 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61 6e 20 49  <column> is an I
e0d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
e0e0: 45 59 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  EY or an index c
e0f0: 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75 6e 64 20  an .** be found 
e100: 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e 20 61 73  with <column> as
e110: 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73 74 20 63   its left-most c
e120: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
e130: 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  the IN_INDEX_NOO
e140: 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49 4e 44 45  P_OK and IN_INDE
e150: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 61 72 65  X_MEMBERSHIP are
e160: 20 62 6f 74 68 20 73 65 74 20 61 6e 64 0a 2a 2a   both set and.**
e170: 20 69 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   if the RHS of t
e180: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
e190: 73 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61 20  s a list (not a 
e1a0: 73 75 62 71 75 65 72 79 29 20 74 68 65 6e 20 74  subquery) then t
e1b0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
e1c0: 69 67 68 74 20 64 65 63 69 64 65 20 74 68 61 74  ight decide that
e1d0: 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68   creating an eph
e1e0: 65 6d 65 72 61 6c 20 62 2d 74 72 65 65 20 66 6f  emeral b-tree fo
e1f0: 72 20 6d 65 6d 62 65 72 73 68 69 70 0a 2a 2a 20  r membership.** 
e200: 74 65 73 74 69 6e 67 20 69 73 20 74 6f 6f 20 65  testing is too e
e210: 78 70 65 6e 73 69 76 65 20 61 6e 64 20 72 65 74  xpensive and ret
e220: 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  urn IN_INDEX_NOO
e230: 50 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  P.  In that case
e240: 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67  , the.** calling
e250: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
e260: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 4e  implement the IN
e270: 20 6f 70 65 72 61 74 6f 72 20 75 73 69 6e 67 20   operator using 
e280: 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 6f 66  a sequence.** of
e290: 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d 70 61 72   Eq or Ne compar
e2a0: 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ison operations.
e2b0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
e2c0: 62 2d 74 72 65 65 20 69 73 20 62 65 69 6e 67 20  b-tree is being 
e2d0: 75 73 65 64 20 66 6f 72 20 6d 65 6d 62 65 72 73  used for members
e2e0: 68 69 70 20 74 65 73 74 73 2c 20 74 68 65 20 63  hip tests, the c
e2f0: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
e300: 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ** might need to
e310: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
e320: 20 6e 6f 74 20 74 68 65 20 52 48 53 20 73 69 64   not the RHS sid
e330: 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
e340: 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ator.** contains
e350: 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20 70 72 52   a NULL.  If prR
e360: 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6e 6f 74  hsHasNull is not
e370: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
e380: 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68 65 72 65  and .** if there
e390: 20 69 73 20 61 6e 79 20 63 68 61 6e 63 65 20 74   is any chance t
e3a0: 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 6d 69  hat the (...) mi
e3b0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55  ght contain a NU
e3c0: 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a 2a 20 72  LL value at.** r
e3d0: 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20 61 20 72  untime, then a r
e3e0: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
e3f0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 67  ated and the reg
e400: 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 72 69  ister number wri
e410: 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70 72 52 68  tten.** to *prRh
e420: 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20 74 68 65  sHasNull. If the
e430: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
e440: 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29 20 63  that the (...) c
e450: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 4e 55 4c  ontains a.** NUL
e460: 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 2a 70  L value, then *p
e470: 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20 6c  rRhsHasNull is l
e480: 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
e490: 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74  *.** If a regist
e4a0: 65 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  er is allocated 
e4b0: 61 6e 64 20 69 74 73 20 6c 6f 63 61 74 69 6f 6e  and its location
e4c0: 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 72 52 68   stored in *prRh
e4d0: 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65 6e 0a 2a  sHasNull, then.*
e4e0: 2a 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  * the value in t
e4f0: 68 61 74 20 72 65 67 69 73 74 65 72 20 77 69 6c  hat register wil
e500: 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 65  l be NULL if the
e510: 20 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73   b-tree contains
e520: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
e530: 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 61 6e 64  NULL values, and
e540: 20 69 74 20 77 69 6c 6c 20 62 65 20 73 6f 6d 65   it will be some
e550: 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20   non-NULL value 
e560: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
e570: 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 4e 55 4c  ntains no.** NUL
e580: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66  L values..*/.#if
e590: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e5a0: 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73 71  _SUBQUERY.int sq
e5b0: 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
e5c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e5d0: 45 78 70 72 20 2a 70 58 2c 20 75 33 32 20 69 6e  Expr *pX, u32 in
e5e0: 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70 72 52 68  Flags, int *prRh
e5f0: 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 53 65 6c  sHasNull){.  Sel
e600: 65 63 74 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ect *p;         
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20     /* SELECT to 
e630: 74 68 65 20 72 69 67 68 74 20 6f 66 20 49 4e 20  the right of IN 
e640: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
e650: 74 20 65 54 79 70 65 20 3d 20 30 3b 20 20 20 20  t eType = 0;    
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 52      /* Type of R
e680: 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f 49 4e 44  HS table. IN_IND
e690: 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 54  EX_* */.  int iT
e6a0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
e6b0: 62 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  b++;            
e6c0: 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20 74 68 65  /* Cursor of the
e6d0: 20 52 48 53 20 74 61 62 6c 65 20 2a 2f 0a 20 20   RHS table */.  
e6e0: 69 6e 74 20 6d 75 73 74 42 65 55 6e 69 71 75 65  int mustBeUnique
e6f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e700: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
e710: 20 52 48 53 20 6d 75 73 74 20 62 65 20 75 6e 69   RHS must be uni
e720: 71 75 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  que */.  Vdbe *v
e730: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e740: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f  e(pParse);     /
e750: 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * Virtual machin
e760: 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
e770: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e  ..  assert( pX->
e780: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 6d  op==TK_IN );.  m
e790: 75 73 74 42 65 55 6e 69 71 75 65 20 3d 20 28 69  ustBeUnique = (i
e7a0: 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45  nFlags & IN_INDE
e7b0: 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a 20 20 2f  X_LOOP)!=0;..  /
e7c0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
e7d0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  f an existing ta
e7e0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 63 61 6e  ble or index can
e7f0: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
e800: 20 73 61 74 69 73 66 79 20 74 68 65 20 71 75 65   satisfy the que
e810: 72 79 2e 20 20 54 68 69 73 20 69 73 20 70 72 65  ry.  This is pre
e820: 66 65 72 61 62 6c 65 20 74 6f 20 67 65 6e 65 72  ferable to gener
e830: 61 74 69 6e 67 20 61 20 6e 65 77 20 0a 20 20 2a  ating a new .  *
e840: 2a 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  * ephemeral tabl
e850: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
e860: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
e870: 20 28 70 20 3d 20 69 73 43 61 6e 64 69 64 61 74   (p = isCandidat
e880: 65 46 6f 72 49 6e 4f 70 74 28 70 58 29 29 21 3d  eForInOpt(pX))!=
e890: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e8a0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e8b0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e8c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
e8d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ection */.    Ta
e8e0: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74       /* Table <t
e910: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78  able>. */.    Ex
e920: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
e950: 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  on <column> */. 
e960: 20 20 20 69 31 36 20 69 43 6f 6c 3b 20 20 20 20     i16 iCol;    
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
e990: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f  ex of column <co
e9a0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36  lumn> */.    i16
e9b0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e9e0: 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
e9f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
ea00: 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20  pEList!=0 );    
ea10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
ea20: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
ea30: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
ea40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
ea50: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
ea60: 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61  pr!=0 ); /* Beca
ea70: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
ea80: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
ea90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
eaa0: 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20  pSrc!=0 );      
eab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
eac0: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
ead0: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
eae0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  .    pTab = p->p
eaf0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
eb00: 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70      pExpr = p->p
eb10: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
eb20: 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 28 69  r;.    iCol = (i
eb30: 31 36 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  16)pExpr->iColum
eb40: 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f  n;.   .    /* Co
eb50: 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
eb60: 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
eb70: 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
eb80: 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
eb90: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
eba0: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
ebb0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
ebc0: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
ebd0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
ebe0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
ebf0: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
ec00: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
ec10: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
ec20: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
ec30: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
ec40: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
ec50: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
ec60: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
ec70: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
ec80: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
ec90: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
eca0: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
ecb0: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
ecc0: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
ecd0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
ece0: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
ecf0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
ed00: 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
ed10: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
ed20: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
ed30: 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
ed40: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
ed50: 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
ed60: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
ed70: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
ed80: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
ed90: 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
eda0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
edb0: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
edc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
edd0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
ee00: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  riable */..     
ee10: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
ee20: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  n sequence used 
ee30: 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  by the compariso
ee40: 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69  n. If an index i
ee50: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
ee60: 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
ee70: 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20  f a temp-table, 
ee80: 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72  it must be order
ee90: 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20  ed according.   
eea0: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f     ** to this co
eeb0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
eec0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  .  */.      Coll
eed0: 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
eee0: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
eef0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ef00: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pX->pLeft, pExpr
ef10: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  );..      /* Che
ef20: 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
ef30: 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
ef40: 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
ef50: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
ef60: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68  comparison is th
ef70: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66  e same as the af
ef80: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f  finity of the co
ef90: 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a  lumn. If.      *
efa0: 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  * it is not, it 
efb0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
efc0: 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  to use any index
efd0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
efe0: 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
eff0: 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41   = sqlite3IndexA
f000: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54  ffinityOk(pX, pT
f010: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
f020: 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20  ffinity);..     
f030: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
f040: 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
f050: 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
f060: 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
f070: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f080: 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61      if( (pIdx->a
f090: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
f0a0: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  ).         && sq
f0b0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
f0c0: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
f0d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30  dx->azColl[0], 0
f0e0: 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20  )==pReq.        
f0f0: 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71   && (!mustBeUniq
f100: 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65  ue || (pIdx->nKe
f110: 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69  yCol==1 && IsUni
f120: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 29  queIndex(pIdx)))
f130: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
f140: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
f150: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
f160: 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
f170: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f190: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
f1a0: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
f1b0: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
f1c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f1d0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
f1e0: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
f1f0: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
f200: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
f210: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
f220: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
f230: 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ( IN_INDEX_INDEX
f240: 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45  _DESC == IN_INDE
f250: 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b  X_INDEX_ASC+1 );
f260: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
f270: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
f280: 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53  X_ASC + pIdx->aS
f290: 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20  ortOrder[0];..  
f2a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
f2b0: 73 48 61 73 4e 75 6c 6c 20 26 26 20 21 70 54 61  sHasNull && !pTa
f2c0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
f2d0: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
f2e0: 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
f2f0: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
f300: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
f310: 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
f320: 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20  llFlag(v, iTab, 
f330: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  *prRhsHasNull);.
f340: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f360: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
f370: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
f380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f390: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
f3a0: 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
f3b0: 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
f3c0: 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
f3d0: 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
f3e0: 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
f3f0: 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
f400: 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
f410: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
f420: 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
f430: 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
f440: 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
f450: 6f 6e 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77  ontant or has tw
f460: 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
f470: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  ,.  ** then it i
f480: 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61  s not worth crea
f490: 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
f4a0: 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75  l table to evalu
f4b0: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20  ate.  ** the IN 
f4c0: 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75  operator so retu
f4d0: 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
f4e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
f4f0: 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46  pe==0.   && (inF
f500: 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
f510: 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21  NOOP_OK).   && !
f520: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f530: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
f540: 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65  ).   && (!sqlite
f550: 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
f560: 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c  (pX) || pX->x.pL
f570: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20  ist->nExpr<=2). 
f580: 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   ){.    eType = 
f590: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
f5a0: 20 7d 0a 20 20 20 20 20 0a 0a 20 20 69 66 28 20   }.     ..  if( 
f5b0: 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
f5c0: 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  /* Could not fin
f5d0: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
f5e0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
f5f0: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
f600: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
f610: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
f620: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
f630: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
f640: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
f650: 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75      u32 savedNQu
f660: 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
f670: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
f680: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
f690: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70  ll = 0;.    eTyp
f6a0: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
f6b0: 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67  ;.    if( inFlag
f6c0: 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
f6d0: 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  P ){.      pPars
f6e0: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
f6f0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
f700: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
f710: 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
f720: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
f730: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
f740: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
f750: 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
f760: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
f770: 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
f780: 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
f790: 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
f7a0: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
f7b0: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
f7c0: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
f7d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
f7e0: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
f7f0: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
f800: 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
f810: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
f820: 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
f830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
f840: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
f850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
f860: 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ype;.}.#endif../
f870: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f880: 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
f890: 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
f8a0: 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
f8b0: 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a  ession, EXISTS,.
f8c0: 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ** or IN operato
f8d0: 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
f8e0: 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
f8f0: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
f900: 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
f910: 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
f920: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
f930: 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
f940: 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
f950: 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
f960: 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
f970: 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
f980: 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
f990: 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
f9a0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
f9b0: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
f9c0: 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
f9d0: 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
f9e0: 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
f9f0: 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
fa00: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
fa10: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
fa20: 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
fa30: 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
fa40: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
fa50: 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
fa60: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70  n-zero, then exp
fa70: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
fa80: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
fa90: 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
faa0: 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c   "<rowid> IN (?,
fab0: 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c   ?, ?)", where <
fac0: 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65  rowid> is a refe
fad0: 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65  rence.** to some
fae0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c   integer key col
faf0: 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42  umn of a table B
fb00: 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
fb10: 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69  ase, use an.** i
fb20: 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20  ntkey B-Tree to 
fb30: 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
fb40: 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20   IN(...) values 
fb50: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
fb60: 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29  sual.** (slower)
fb70: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
fb80: 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a   keys B-Tree..**
fb90: 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e  .** If rMayHaveN
fba0: 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ull is non-zero,
fbb0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
fbc0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
fbd0: 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20  s an IN.** (not 
fbe0: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
fbf0: 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65  TS) and that the
fc00: 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61   RHS might conta
fc10: 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c  ins NULLs..** Al
fc20: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
fc30: 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
fc40: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  e the register g
fc50: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
fc60: 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e  Null.** to NULL.
fc70: 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
fc80: 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  es will take car
fc90: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
fca0: 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76  is register.** v
fcb0: 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
fcc0: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
fcd0: 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
fce0: 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
fcf0: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
fd00: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
fd10: 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
fd20: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
fd30: 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  For IN operators
fd40: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
fd50: 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75  occurs, the retu
fd60: 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a  rn value is 0..*
fd70: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
fd80: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
fd90: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
fda0: 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
fdb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
fdc0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
fdd0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
fde0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
fdf0: 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
fe00: 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
fe10: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
fe20: 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20  t rHasNullFlag, 
fe30: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
fe40: 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
fe50: 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
fe60: 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
fe70: 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
fe80: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
fe90: 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
fea0: 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
feb0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70   */.){.  int jmp
fec0: 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20  IfDynamic = -1; 
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
fef0: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
ff00: 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ff30: 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
ff40: 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
ff50: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ff60: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ff70: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
ff80: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
ff90: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ffa0: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
ffb0: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
ffc0: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
ffd0: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
ffe0: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
fff0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
10000 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
10010 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
10020 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
10030 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
10040 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
10050 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
10060 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
10070 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
10080 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
10090 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
100a0 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
100b0 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
100c0 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
100d0 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
100e0 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
100f0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
10100 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
10110 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
10120 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
10130 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
10140 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
10150 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
10160 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
10170 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
10180 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
10190 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e   ){.    jmpIfDyn
101a0 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43 6f  amic = sqlite3Co
101b0 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
101c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
101d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
101e0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
101f0 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  N.  if( pParse->
10200 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
10210 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
10220 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
10230 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
10240 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
10250 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 6a 6d   %d",.        jm
10260 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22 22  pIfDynamic>=0?""
10270 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c 0a  :"CORRELATED ",.
10280 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
10290 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a  p==TK_IN?"LIST":
102a0 22 53 43 41 4c 41 52 22 2c 0a 20 20 20 20 20 20  "SCALAR",.      
102b0 20 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53    pParse->iNextS
102c0 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
102d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
102e0 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
102f0 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
10300 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
10310 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
10320 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
10330 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
10340 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
10350 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
10360 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
10370 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
10380 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
10390 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
103a0 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103c0 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
103d0 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
103e0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
103f0 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
10400 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
10410 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
10420 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
10430 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
10440 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
10450 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
10460 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66  on */..      aff
10470 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
10480 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
10490 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
104a0 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
104b0 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
104c0 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
104d0 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
104e0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
104f0 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
10500 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
10510 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
10520 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
10530 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
10540 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
10550 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
10560 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
10570 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
10580 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
10590 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
105a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
105b0 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
105c0 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
105d0 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
105e0 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
105f0 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
10600 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
10610 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
10620 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
10630 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
10640 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
10650 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
10660 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
10670 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
10680 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
10690 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
106a0 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
106b0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
106c0 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
106d0 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
106e0 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
106f0 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
10700 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
10710 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
10720 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
10730 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
10740 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
10750 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
10760 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
10770 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
10780 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
10790 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
107a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
107b0 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
107c0 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77  ->iTable, !isRow
107d0 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  id);.      pKeyI
107e0 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
107f0 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
10800 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
10810 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20  db, 1, 1);..    
10820 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
10830 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
10840 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
10850 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
10860 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
10870 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
10880 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
10890 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
108a0 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
108b0 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
108c0 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
108d0 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
108e0 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
108f0 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
10900 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10910 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
10920 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ect = pExpr->x.p
10930 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
10940 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
10950 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
10960 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
10970 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
10980 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
10990 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
109a0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
109b0 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
109c0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
109d0 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38  st.affSdst = (u8
109e0 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
109f0 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
10a00 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
10a10 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
10a20 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
10a30 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
10a40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 0;.        tes
10a50 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
10a60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
10a70 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
10a80 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 65 79    testcase( pKey
10a90 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f 2a 20 43 61  Info==0 ); /* Ca
10aa0 75 73 65 64 20 62 79 20 4f 4f 4d 20 69 6e 20 73  used by OOM in s
10ab0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
10ac0 6f 63 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oc() */.        
10ad0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
10ae0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10af0 74 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  t, &dest) ){.   
10b00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
10b10 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
10b20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
10b30 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
10b40 20 20 7d 0a 20 20 20 20 20 20 20 20 70 45 4c 69    }.        pELi
10b50 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
10b60 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73  List;.        as
10b70 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 21 3d  sert( pKeyInfo!=
10b80 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c  0 ); /* OOM will
10b90 20 63 61 75 73 65 20 65 78 69 74 20 61 66 74 65   cause exit afte
10ba0 72 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  r sqlite3Select(
10bb0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  ) */.        ass
10bc0 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
10bd0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10be0 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ( pEList->nExpr>
10bf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
10c00 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
10c10 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
10c20 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
10c30 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43      pKeyInfo->aC
10c40 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  oll[0] = sqlite3
10c50 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
10c60 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
10c70 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d      pEList->a[0]
10cc0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
10cd0 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28  else if( ALWAYS(
10ce0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
10cf0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
10d00 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
10d10 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
10d20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
10d30 20 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 65     ** For each e
10d40 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64  xpression, build
10d50 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72   an index key fr
10d60 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  om the evaluatio
10d70 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
10d80 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
10d90 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10da0 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61  . If <expr> is a
10db0 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73   column, then us
10dc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  e.        ** tha
10dd0 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  t columns affini
10de0 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67  ty when building
10df0 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
10e00 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20  <expr> is not.  
10e10 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d        ** a colum
10e20 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61  n, use numeric a
10e30 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20  ffinity..       
10e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
10e50 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  i;.        ExprL
10e60 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
10e70 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
10e80 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
10e90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
10ea0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  ;.        int r1
10eb0 2c 20 72 32 2c 20 72 33 3b 0a 0a 20 20 20 20 20  , r2, r3;..     
10ec0 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
10ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
10ee0 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
10ef0 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20  AFF_BLOB;.      
10f00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10f10 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
10f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
10f30 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
10f40 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f  iteable(pKeyInfo
10f50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
10f60 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
10f70 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  ] = sqlite3ExprC
10f80 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
10f90 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
10fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
10fb0 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
10fc0 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
10fd0 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
10fe0 2a 2f 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  */.        r1 = 
10ff0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11000 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
11010 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47     r2 = sqlite3G
11020 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11030 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11040 73 52 6f 77 69 64 20 29 20 73 71 6c 69 74 65 33  sRowid ) sqlite3
11050 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11060 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32 29 3b 0a 20  _Null, 0, r2);. 
11070 20 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4c 69         for(i=pLi
11080 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
11090 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b 20  =pList->a; i>0; 
110a0 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i--, pItem++){. 
110b0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
110c0 45 32 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  E2 = pItem->pExp
110d0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  r;.          int
110e0 20 69 56 61 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20   iValToIns;..   
110f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
11100 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
11110 6f 74 20 63 6f 6e 73 74 61 6e 74 20 74 68 65 6e  ot constant then
11120 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   we will need to
11130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
11140 73 61 62 6c 65 20 74 68 65 20 74 65 73 74 20 74  sable the test t
11150 68 61 74 20 77 61 73 20 67 65 6e 65 72 61 74 65  hat was generate
11160 64 20 61 62 6f 76 65 20 74 68 61 74 20 6d 61 6b  d above that mak
11170 65 73 20 73 75 72 65 0a 20 20 20 20 20 20 20 20  es sure.        
11180 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 6f    ** this code o
11190 6e 6c 79 20 65 78 65 63 75 74 65 73 20 6f 6e 63  nly executes onc
111a0 65 2e 20 20 42 65 63 61 75 73 65 20 66 6f 72 20  e.  Because for 
111b0 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20  a non-constant. 
111c0 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
111d0 65 73 73 69 6f 6e 20 77 65 20 6e 65 65 64 20 74  ession we need t
111e0 6f 20 72 65 72 75 6e 20 74 68 69 73 20 63 6f 64  o rerun this cod
111f0 65 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 20  e each time..   
11200 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11210 20 20 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e      if( jmpIfDyn
11220 61 6d 69 63 3e 3d 30 20 26 26 20 21 73 71 6c 69  amic>=0 && !sqli
11230 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
11240 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
11250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11260 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
11270 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b 0a   jmpIfDynamic);.
11280 20 20 20 20 20 20 20 20 20 20 20 20 6a 6d 70 49              jmpI
11290 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 0a 20  fDynamic = -1;. 
112a0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
112b0 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
112c0 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
112d0 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
112e0 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
112f0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
11300 69 66 28 20 69 73 52 6f 77 69 64 20 26 26 20 73  if( isRowid && s
11310 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
11320 67 65 72 28 70 45 32 2c 20 26 69 56 61 6c 54 6f  ger(pE2, &iValTo
11330 49 6e 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ins) ){.        
11340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11350 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
11360 72 74 49 6e 74 2c 20 70 45 78 70 72 2d 3e 69 54  rtInt, pExpr->iT
11370 61 62 6c 65 2c 20 72 32 2c 20 69 56 61 6c 54 6f  able, r2, iValTo
11380 49 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ins);.          
11390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
113a0 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 45     r3 = sqlite3E
113b0 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
113c0 61 72 73 65 2c 20 70 45 32 2c 20 72 31 29 3b 0a  arse, pE2, r1);.
113d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
113e0 69 73 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  isRowid ){.     
113f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11410 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72 33 2c 0a  _MustBeInt, r3,.
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11450 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
11460 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65              Vdbe
11470 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
11480 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11490 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
114a0 4f 50 5f 49 6e 73 65 72 74 2c 20 70 45 78 70 72  OP_Insert, pExpr
114b0 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 72 33  ->iTable, r2, r3
114c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
114d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
114e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
114f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
11500 52 65 63 6f 72 64 2c 20 72 33 2c 20 31 2c 20 72  Record, r3, 1, r
11510 32 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  2, &affinity, 1)
11520 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11530 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11540 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
11550 50 61 72 73 65 2c 20 72 33 2c 20 31 29 3b 0a 20  Parse, r3, 1);. 
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
11570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11580 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
11590 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72  pExpr->iTable, r
115a0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
115b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
115c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
115d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
115e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
115f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11600 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
11610 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
11620 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11630 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
11640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11650 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
11660 20 28 76 6f 69 64 20 2a 29 70 4b 65 79 49 6e 66   (void *)pKeyInf
11670 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
11680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11690 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
116a0 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
116b0 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
116c0 43 54 3a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  CT:.    default:
116d0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   {.      /* If t
116e0 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
116f0 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
11700 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
11710 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
11720 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
11730 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
11740 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
11750 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
11760 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
11770 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
11780 6c 75 6d 6e 2e 20 20 49 66 20 74 68 69 73 20 69  lumn.  If this i
11790 73 20 61 6e 20 45 58 49 53 54 53 2c 20 77 72 69  s an EXISTS, wri
117a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  te.      ** an i
117b0 6e 74 65 67 65 72 20 30 20 28 6e 6f 74 20 65 78  nteger 0 (not ex
117c0 69 73 74 73 29 20 6f 72 20 31 20 28 65 78 69 73  ists) or 1 (exis
117d0 74 73 29 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  ts) into a memor
117e0 79 20 63 65 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  y cell.      ** 
117f0 61 6e 64 20 72 65 63 6f 72 64 20 74 68 61 74 20  and record that 
11800 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
11810 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
11820 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
11830 53 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sel;            
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11850 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11860 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20   to encode */.  
11870 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
11880 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
11890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
118a0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53 45   to deal with SE
118b0 4c 45 43 74 20 72 65 73 75 6c 74 20 2a 2f 0a 0a  LECt result */..
118c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
118d0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
118e0 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20 74 65  ISTS );.      te
118f0 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
11900 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
11910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
11920 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
11930 54 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  TS || pExpr->op=
11940 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 0a 20  =TK_SELECT );.. 
11950 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
11960 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
11970 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
11980 29 20 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  ) );.      pSel 
11990 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
119a0 63 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ct;.      sqlite
119b0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
119c0 26 64 65 73 74 2c 20 30 2c 20 2b 2b 70 50 61 72  &dest, 0, ++pPar
119d0 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  se->nMem);.     
119e0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
119f0 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20 20  TK_SELECT ){.   
11a00 20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20       dest.eDest 
11a10 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
11a20 20 20 20 64 65 73 74 2e 69 53 64 73 74 20 3d 20     dest.iSdst = 
11a30 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20  dest.iSDParm;.  
11a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11a50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
11a60 6c 6c 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50  ll, 0, dest.iSDP
11a70 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64  arm);.        Vd
11a80 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49  beComment((v, "I
11a90 6e 69 74 20 73 75 62 71 75 65 72 79 20 72 65 73  nit subquery res
11aa0 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 65  ult"));.      }e
11ab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 65 73  lse{.        des
11ac0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 45 78  t.eDest = SRT_Ex
11ad0 69 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71  ists;.        sq
11ae0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11af0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
11b00 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
11b10 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
11b20 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 45  ment((v, "Init E
11b30 58 49 53 54 53 20 72 65 73 75 6c 74 22 29 29 3b  XISTS result"));
11b40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
11b50 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
11b60 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 65  (pParse->db, pSe
11b70 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  l->pLimit);.    
11b80 20 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d    pSel->pLimit =
11b90 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
11ba0 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45 52  arse, TK_INTEGER
11bb0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bd0 20 20 20 20 20 20 20 20 20 20 26 73 71 6c 69 74            &sqlit
11be0 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b  e3IntTokens[1]);
11bf0 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 69 4c 69  .      pSel->iLi
11c00 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
11c10 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sel->selFlags &=
11c20 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b   ~SF_MultiValue;
11c30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
11c40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11c50 20 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b   pSel, &dest) ){
11c60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11c70 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
11c80 20 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44   rReg = dest.iSD
11c90 50 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72  Parm;.      Expr
11ca0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
11cb0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
11cc0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
11cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
11ce0 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29  ( rHasNullFlag )
11cf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
11d00 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70  HasNullFlag(v, p
11d10 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48  Expr->iTable, rH
11d20 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d  asNullFlag);.  }
11d30 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e  ..  if( jmpIfDyn
11d40 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73  amic>=0 ){.    s
11d50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11d60 72 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d  re(v, jmpIfDynam
11d70 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ic);.  }.  sqlit
11d80 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
11d90 50 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72  Parse);..  retur
11da0 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66  n rReg;.}.#endif
11db0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11dc0 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66  SUBQUERY */..#if
11dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11de0 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20  _SUBQUERY./*.** 
11df0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
11e00 72 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69  r an IN expressi
11e10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  on..**.**      x
11e20 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
11e30 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76  .**      x IN (v
11e40 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e  alue, value, ...
11e50 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ).**.** The left
11e60 2d 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29  -hand side (LHS)
11e70 20 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70   is a scalar exp
11e80 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69  ression.  The ri
11e90 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52  ght-hand side (R
11ea0 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72  HS).** is an arr
11eb0 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ay of zero or mo
11ec0 72 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20  re values.  The 
11ed0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
11ee0 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ue if the LHS is
11ef0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
11f00 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54  thin the RHS.  T
11f10 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11f20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e  expression is un
11f30 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20  known (NULL).** 
11f40 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55  if the LHS is NU
11f50 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53  LL or if the LHS
11f60 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
11f70 64 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53  d within the RHS
11f80 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20   and the.** RHS 
11f90 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
11fa0 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73  more NULL values
11fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11fc0 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
11fd0 6f 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74  ode that jumps t
11fe0 6f 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66  o destIfFalse if
11ff0 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20   the LHS is not 
12000 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  .** contained wi
12010 74 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49  thin the RHS.  I
12020 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77  f due to NULLs w
12030 65 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69  e cannot determi
12040 6e 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a  ne if the LHS.**
12050 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
12060 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75   the RHS then ju
12070 6d 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c  mp to destIfNull
12080 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  .  If the LHS is
12090 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69   contained.** wi
120a0 74 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65  thin the RHS the
120b0 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a  n fall through..
120c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
120d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
120e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
120f0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
12100 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
12110 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
12120 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
12130 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
12140 68 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e  he IN expression
12150 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66   */.  int destIf
12160 46 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a  False,      /* J
12170 75 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20  ump here if LHS 
12180 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
12190 20 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   in the RHS */. 
121a0 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20   int destIfNull 
121b0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
121c0 65 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ere if the resul
121d0 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64  ts are unknown d
121e0 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29  ue to NULLs */.)
121f0 7b 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e  {.  int rRhsHasN
12200 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67  ull = 0;  /* Reg
12210 69 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72  ister that is tr
12220 75 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69  ue if RHS contai
12230 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a  ns NULL values *
12240 2f 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74  /.  char affinit
12250 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  y;        /* Com
12260 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
12270 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   to use */.  int
12280 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
12290 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68     /* Type of th
122a0 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72  e RHS */.  int r
122b0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
122c0 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73   /* Temporary us
122d0 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  e register */.  
122e0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
122f0 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
12300 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
12310 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
12320 6f 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20  ompute the RHS. 
12330 20 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65    After this ste
12340 70 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  p, the table wit
12350 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45  h cursor.  ** pE
12360 78 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c  xpr->iTable will
12370 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
12380 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
12390 70 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a  p the RHS..  */.
123a0 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
123b0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
123c0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
123d0 4f 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69  OOM detected pri
123e0 6f 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  or to this routi
123f0 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  ne */.  VdbeNoop
12400 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67  Comment((v, "beg
12410 69 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20  in IN expr"));. 
12420 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
12430 46 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72  FindInIndex(pPar
12440 73 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20  se, pExpr,.     
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58          IN_INDEX
12470 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e  _MEMBERSHIP | IN
12480 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a  _INDEX_NOOP_OK,.
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
124b0 74 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66  tIfFalse==destIf
124c0 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73  Null ? 0 : &rRhs
124d0 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  HasNull);..  /* 
124e0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
124f0 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
12500 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
12510 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
12520 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
12530 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
12540 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
12550 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
12560 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20  ble for.  ** P4 
12570 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  of OP_MakeRecord
12580 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74  ..  */.  affinit
12590 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
125a0 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
125b0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48    /* Code the LH
125c0 53 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  S, the <expr> fr
125d0 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
125e0 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ..)"..  */.  sql
125f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
12600 68 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20  h(pParse);.  r1 
12610 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12620 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
12630 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
12640 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
12650 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20  eft, r1);..  /* 
12660 49 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  If sqlite3FindIn
12670 49 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20  Index() did not 
12680 66 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61  find or create a
12690 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  n index that is.
126a0 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f    ** suitable fo
126b0 72 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65  r evaluating the
126c0 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68   IN operator, th
126d0 65 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e  en evaluate usin
126e0 67 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  g a.  ** sequenc
126f0 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73  e of comparisons
12700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
12710 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f  pe==IN_INDEX_NOO
12720 50 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  P ){.    ExprLis
12730 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
12740 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43  ->x.pList;.    C
12750 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
12760 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
12770 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
12780 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e  ->pLeft);.    in
12790 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69  t labelOk = sqli
127a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
127b0 28 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c  (v);.    int r2,
127c0 20 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20   regToFree;.    
127d0 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20  int regCkNull = 
127e0 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  0;.    int ii;. 
127f0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
12800 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
12810 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
12820 20 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74   );.    if( dest
12830 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61  IfNull!=destIfFa
12840 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67  lse ){.      reg
12850 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  CkNull = sqlite3
12860 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
12870 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
12880 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12890 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72 31  P_BitAnd, r1, r1
128a0 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20  , regCkNull);.  
128b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
128c0 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  ; ii<pList->nExp
128d0 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
128e0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
128f0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
12900 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45   pList->a[ii].pE
12910 78 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29  xpr, &regToFree)
12920 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43  ;.      if( regC
12930 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33  kNull && sqlite3
12940 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c  ExprCanBeNull(pL
12950 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72  ist->a[ii].pExpr
12960 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
12970 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12980 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67  , OP_BitAnd, reg
12990 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43  CkNull, r2, regC
129a0 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  kNull);.      }.
129b0 20 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69        if( ii<pLi
129c0 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64  st->nExpr-1 || d
129d0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
129e0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
129f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a00 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31  Op4(v, OP_Eq, r1
12a10 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20  , labelOk, r2,. 
12a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a30 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
12a40 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
12a50 51 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Q);.        Vdbe
12a60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69  CoverageIf(v, ii
12a70 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29  <pList->nExpr-1)
12a80 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
12a90 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d  verageIf(v, ii==
12aa0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
12ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12ac0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
12ad0 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
12ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12af0 61 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75  assert( destIfNu
12b00 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
12b10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12b20 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12b30 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74 49  OP_Ne, r1, destI
12b40 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20  fFalse, r2,.    
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f        (void*)pCo
12b70 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
12b80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12b90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12ba0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
12bb0 20 61 66 66 69 6e 69 74 79 20 7c 20 53 51 4c 49   affinity | SQLI
12bc0 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
12bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12be0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12bf0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
12c00 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oFree);.    }.  
12c10 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20    if( regCkNull 
12c20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12c30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12c40 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75  _IsNull, regCkNu
12c50 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  ll, destIfNull);
12c60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12c70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12c80 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
12c90 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20  fFalse);.    }. 
12ca0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
12cb0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
12cc0 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69  belOk);.    sqli
12cd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12ce0 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b 4e  g(pParse, regCkN
12cf0 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ull);.  }else{. 
12d00 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
12d10 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  LHS is NULL, the
12d20 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
12d30 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72 20  either false or 
12d40 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20  NULL depending. 
12d50 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72     ** on whether
12d60 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70 74   the RHS is empt
12d70 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65 63  y or not, respec
12d80 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  tively..    */. 
12d90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
12da0 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70  prCanBeNull(pExp
12db0 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
12dc0 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75 6c     if( destIfNul
12dd0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
12de0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f  {.        /* Sho
12df0 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 6f  rtcut for the co
12e00 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
12e10 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e 55  the false and NU
12e20 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a  LL outcomes are.
12e30 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
12e40 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ame. */.        
12e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e60 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
12e70 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  r1, destIfNull);
12e80 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12e90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12ea0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 31         int addr1
12eb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12ec0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp1(v, OP_NotNu
12ed0 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f 76  ll, r1); VdbeCov
12ee0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12ef0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12f00 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12f10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
12f20 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
12f30 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
12f40 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
12f50 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
12f60 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  v, destIfNull);.
12f70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12f80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
12f90 64 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ddr1);.      }. 
12fa0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
12fb0 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
12fc0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  ROWID ){.      /
12fd0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
12fe0 74 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52  the RHS is the R
12ff0 4f 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d  OWID of table b-
13000 74 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tree.      */.  
13010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13020 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
13030 42 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49  BeInt, r1, destI
13040 66 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76  fFalse); VdbeCov
13050 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13060 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13070 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74  3(v, OP_NotExist
13080 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
13090 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
130a0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
130b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
130c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
130d0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
130e0 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78   RHS is an index
130f0 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a   b-tree..      *
13100 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
13110 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13120 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
13130 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
13140 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
13150 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
13160 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
13170 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
13180 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
13190 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65  * "x IN (...)" e
131a0 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
131b0 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55  e either 0 or NU
131c0 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20  LL. If the set. 
131d0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
131e0 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
131f0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
13200 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
13210 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  t .      ** cont
13220 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
13230 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
13240 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
13250 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
13260 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
13270 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a   NULL..      */.
13280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
13290 73 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49  stIfFalse!=destI
132a0 66 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73  fNull || rRhsHas
132b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
132c0 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
132d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
132e0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
132f0 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77  ns if it is know
13300 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  n at compile tim
13310 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20  e that the RHS. 
13320 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74         ** cannot
13330 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
13340 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
13350 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
13360 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
13370 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
13380 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
13390 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
133a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
133b0 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68    ** Also run th
133c0 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c  is branch if NUL
133d0 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  L is equivalent 
133e0 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20  to FALSE.       
133f0 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72   ** for this par
13400 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61  ticular IN opera
13410 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
13420 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13430 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
13440 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
13450 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
13460 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
13470 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
13480 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
134a0 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
134b0 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
134c0 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
134d0 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
134e0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
134f0 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
13500 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
13510 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
13520 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
13530 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20  utcome..        
13540 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
13550 64 64 72 31 3b 0a 20 20 0a 20 20 20 20 20 20 20  ddr1;.  .       
13560 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
13570 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
13580 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
13590 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
135a0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
135b0 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  en the answer is
135c0 20 54 52 55 45 20 74 68 65 20 70 72 65 73 65 6e   TRUE the presen
135d0 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74  ce of NULLs in t
135e0 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20 20  he RHS does.    
135f0 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65      ** not matte
13600 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  r.  If the LHS i
13610 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13620 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65 6e  in the RHS, then
13630 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
13640 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20 69  answer is NULL i
13650 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  f the RHS contai
13660 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65  ns NULLs and the
13670 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20 20   answer is.     
13680 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74     ** FALSE if t
13690 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
136a0 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ree..        */.
136b0 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d 20          addr1 = 
136c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
136d0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
136e0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
136f0 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20   0, r1, 1);.    
13700 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
13710 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
13720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13730 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68  , OP_IsNull, rRh
13740 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
13750 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56  Null);.        V
13760 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13780 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
13790 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
137a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
137b0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
137c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
137d0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
137e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
137f0 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
13800 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
13810 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  rse);.  VdbeComm
13820 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
13830 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69  expr"));.}.#endi
13840 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13850 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
13860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13870 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
13880 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
13890 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
138a0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
138b0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
138c0 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
138d0 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
138e0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
138f0 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
13900 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
13910 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
13920 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
13930 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
13940 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
13950 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
13960 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
13970 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
13980 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
13990 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
139a0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
139b0 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
139c0 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
139d0 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
139e0 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
139f0 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
13a00 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
13a10 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
13a20 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
13a30 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
13a40 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
13a50 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
13a60 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
13a70 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
13a80 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
13a90 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
13aa0 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
13ab0 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
13ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13ad0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
13ae0 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
13af0 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
13b00 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
13b10 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
13b20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
13b30 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
13b40 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
13b50 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
13b60 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
13b70 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
13b80 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
13b90 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
13ba0 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
13bb0 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
13bc0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
13bd0 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
13be0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
13bf0 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
13c00 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
13c10 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13c20 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
13c30 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
13c40 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
13c50 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
13c60 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
13c70 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
13c80 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
13c90 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
13ca0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13cb0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
13cc0 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
13cd0 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
13ce0 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
13cf0 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
13d00 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
13d10 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
13d20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
13d30 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
13d40 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
13d50 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
13d60 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
13d70 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
13d80 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
13d90 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
13da0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
13db0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13dc0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
13dd0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
13de0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
13df0 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
13e00 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
13e10 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13e20 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
13e30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13e40 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
13e50 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
13e60 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
13e70 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69  "", z);.#else.#i
13e80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13e90 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20  T_HEX_INTEGER.  
13ea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
13eb0 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c  strnicmp(z,"0x",
13ec0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
13ed0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13ee0 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69  (pParse, "hex li
13ef0 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25  teral too big: %
13f00 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65  s", z);.      }e
13f10 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
13f20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
13f30 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
13f40 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
13f50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
13f60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61   }.}../*.** Clea
13f70 72 20 61 20 63 61 63 68 65 20 65 6e 74 72 79 2e  r a cache entry.
13f80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13f90 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
13fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
13fb0 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
13fc0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 74 65  *p){.  if( p->te
13fd0 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69 66 28  mpReg ){.    if(
13fe0 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
13ff0 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50 61 72  g<ArraySize(pPar
14000 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20 29 7b  se->aTempReg) ){
14010 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
14020 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
14030 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 70 2d  nTempReg++] = p-
14040 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20  >iReg;.    }.   
14050 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
14060 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  .  }.}.../*.** R
14070 65 63 6f 72 64 20 69 6e 20 74 68 65 20 63 6f 6c  ecord in the col
14080 75 6d 6e 20 63 61 63 68 65 20 74 68 61 74 20 61  umn cache that a
14090 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6c 75   particular colu
140a0 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a 20 70 61 72  mn from a.** par
140b0 74 69 63 75 6c 61 72 20 74 61 62 6c 65 20 69 73  ticular table is
140c0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 70 61 72   stored in a par
140d0 74 69 63 75 6c 61 72 20 72 65 67 69 73 74 65 72  ticular register
140e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
140f0 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28  3ExprCacheStore(
14100 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14110 6e 74 20 69 54 61 62 2c 20 69 6e 74 20 69 43 6f  nt iTab, int iCo
14120 6c 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  l, int iReg){.  
14130 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 69 6e  int i;.  int min
14140 4c 72 75 3b 0a 20 20 69 6e 74 20 69 64 78 4c 72  Lru;.  int idxLr
14150 75 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  u;.  struct yCol
14160 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Cache *p;..  /* 
14170 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20  Unless an error 
14180 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 72 65  has occurred, re
14190 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
141a0 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
141b0 76 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ve. */.  assert(
141c0 20 69 52 65 67 3e 30 20 7c 7c 20 70 50 61 72 73   iReg>0 || pPars
141d0 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
141e0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
141f0 6c 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  led );.  assert(
14200 20 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f   iCol>=-1 && iCo
14210 6c 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46  l<32768 );  /* F
14220 69 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  inite column num
14230 62 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  bers */..  /* Th
14240 65 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43  e SQLITE_ColumnC
14250 61 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c  ache flag disabl
14260 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  es the column ca
14270 63 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  che.  This is us
14280 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74  ed.  ** for test
14290 69 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65  ing only - to ve
142a0 72 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65  rify that SQLite
142b0 20 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65   always gets the
142c0 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a   same answer.  *
142d0 2a 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f  * with and witho
142e0 75 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ut the column ca
142f0 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  che..  */.  if( 
14300 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
14310 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  bled(pParse->db,
14320 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
14330 63 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  che) ) return;..
14340 20 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61    /* First repla
14350 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
14360 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  entry..  **.  **
14370 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77   Actually, the w
14380 61 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ay the column ca
14390 63 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  che is currently
143a0 20 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75   used, we are gu
143b0 61 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68  aranteed.  ** th
143c0 61 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69  at the object wi
143d0 6c 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79  ll never already
143e0 20 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56   be in cache.  V
143f0 65 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61  erify this guara
14400 6e 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ntee..  */.#ifnd
14410 65 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28  ef NDEBUG.  for(
14420 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14430 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14440 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14450 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73  ++, p++){.    as
14460 73 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30  sert( p->iReg==0
14470 20 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69   || p->iTable!=i
14480 54 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d  Tab || p->iColum
14490 6e 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23  n!=iCol );.  }.#
144a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64  endif..  /* Find
144b0 20 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61   an empty slot a
144c0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f  nd replace it */
144d0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
144e0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
144f0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
14500 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14510 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
14520 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
14530 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d  iLevel = pParse-
14540 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20  >iCacheLevel;.  
14550 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
14560 69 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69  iTab;.      p->i
14570 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20  Column = iCol;. 
14580 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69       p->iReg = i
14590 52 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65  Reg;.      p->te
145a0 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20  mpReg = 0;.     
145b0 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
145c0 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
145d0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
145e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
145f0 6c 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65  lace the last re
14600 63 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20  cently used */. 
14610 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66   minLru = 0x7fff
14620 66 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d  ffff;.  idxLru =
14630 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20   -1;.  for(i=0, 
14640 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14650 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14660 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
14670 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
14680 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20  lru<minLru ){.  
14690 20 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a      idxLru = i;.
146a0 20 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70        minLru = p
146b0 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->lru;.    }.  }
146c0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64  .  if( ALWAYS(id
146d0 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20  xLru>=0) ){.    
146e0 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f  p = &pParse->aCo
146f0 6c 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a  lCache[idxLru];.
14700 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20      p->iLevel = 
14710 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
14720 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  vel;.    p->iTab
14730 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70  le = iTab;.    p
14740 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c  ->iColumn = iCol
14750 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20  ;.    p->iReg = 
14760 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d  iReg;.    p->tem
14770 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pReg = 0;.    p-
14780 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69  >lru = pParse->i
14790 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20  CacheCnt++;.    
147a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f  return;.  }.}../
147b0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
147c0 61 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74  at registers bet
147d0 77 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b  ween iReg..iReg+
147e0 6e 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67  nReg-1 are being
147f0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a   overwritten..**
14800 20 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65   Purge the range
14810 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72   of registers fr
14820 6f 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  om the column ca
14830 63 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  che..*/.void sql
14840 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
14850 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ove(Parse *pPars
14860 65 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74  e, int iReg, int
14870 20 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   nReg){.  int i;
14880 0a 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69  .  int iLast = i
14890 52 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a  Reg + nReg - 1;.
148a0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
148b0 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
148c0 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
148d0 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
148e0 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
148f0 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72   p++){.    int r
14900 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20   = p->iReg;.    
14910 69 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72  if( r>=iReg && r
14920 3c 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  <=iLast ){.     
14930 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72   cacheEntryClear
14940 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
14950 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a     p->iReg = 0;.
14960 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14970 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  ** Remember the 
14980 63 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63  current column c
14990 61 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41  ache context.  A
149a0 6e 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61  ny new entries a
149b0 64 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f  dded.** added to
149c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
149d0 65 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c  e after this cal
149e0 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68  l are removed wh
149f0 65 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  en the.** corres
14a00 70 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75  ponding pop occu
14a10 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
14a20 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
14a30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
14a40 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
14a50 65 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66  eLevel++;.#ifdef
14a60 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
14a70 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
14a80 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
14a90 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
14aa0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53  .    printf("PUS
14ab0 48 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72  H to %d\n", pPar
14ac0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
14ad0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
14ae0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f  /*.** Remove fro
14af0 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
14b00 68 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  he any entries t
14b10 68 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73  hat were added s
14b20 69 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20  ince the.** the 
14b30 70 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33  previous sqlite3
14b40 45 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70  ExprCachePush op
14b50 65 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  eration.  In oth
14b60 65 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72  er words, restor
14b70 65 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74  e.** the cache t
14b80 6f 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  o the state it w
14b90 61 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20  as in prior the 
14ba0 6d 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68  most recent Push
14bb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14bc0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61  3ExprCachePop(Pa
14bd0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
14be0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14bf0 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
14c00 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
14c10 69 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29  iCacheLevel>=1 )
14c20 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63  ;.  pParse->iCac
14c30 68 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65  heLevel--;.#ifde
14c40 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
14c50 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
14c60 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
14c70 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
14c80 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f  {.    printf("PO
14c90 50 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61  P  to %d\n", pPa
14ca0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
14cb0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14cc0 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
14cd0 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
14ce0 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14cf0 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14d00 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26    if( p->iReg &&
14d10 20 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73   p->iLevel>pPars
14d20 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29  e->iCacheLevel )
14d30 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74  {.      cacheEnt
14d40 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20  ryClear(pParse, 
14d50 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65  p);.      p->iRe
14d60 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
14d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61  .}../*.** When a
14d80 20 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69   cached column i
14d90 73 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73  s reused, make s
14da0 75 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67  ure that its reg
14db0 69 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c  ister is.** no l
14dc0 6f 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20  onger available 
14dd0 61 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74  as a temp regist
14de0 65 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37  er.  ticket #387
14df0 39 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a  9:  that same.**
14e00 20 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20   register might 
14e10 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  be in the cache 
14e20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63  in multiple plac
14e30 65 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  es, so be sure t
14e40 6f 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c  o.** get them al
14e50 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
14e60 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
14e70 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61  hePinRegister(Pa
14e80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14e90 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b   iReg){.  int i;
14ea0 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  .  struct yColCa
14eb0 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d  che *p;.  for(i=
14ec0 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
14ed0 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
14ee0 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14ef0 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
14f00 70 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b  p->iReg==iReg ){
14f10 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65  .      p->tempRe
14f20 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
14f30 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
14f40 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 6c  code that will l
14f50 6f 61 64 20 69 6e 74 6f 20 72 65 67 69 73 74 65  oad into registe
14f60 72 20 72 65 67 4f 75 74 20 61 20 76 61 6c 75 65  r regOut a value
14f70 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 70 70 72   that is.** appr
14f80 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
14f90 69 49 64 78 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  iIdxCol-th colum
14fa0 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e  n of index pIdx.
14fb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14fc0 45 78 70 72 43 6f 64 65 4c 6f 61 64 49 6e 64 65  ExprCodeLoadInde
14fd0 78 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73 65  xColumn(.  Parse
14fe0 20 2a 70 50 61 72 73 65 2c 20 20 2f 2a 20 54 68   *pParse,  /* Th
14ff0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
15000 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  t */.  Index *pI
15010 64 78 2c 20 20 20 20 2f 2a 20 54 68 65 20 69 6e  dx,    /* The in
15020 64 65 78 20 77 68 6f 73 65 20 63 6f 6c 75 6d 6e  dex whose column
15030 20 69 73 20 74 6f 20 62 65 20 6c 6f 61 64 65 64   is to be loaded
15040 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75   */.  int iTabCu
15050 72 2c 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  r,    /* Cursor 
15060 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
15070 62 6c 65 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74  ble row */.  int
15080 20 69 49 64 78 43 6f 6c 2c 20 20 20 20 2f 2a 20   iIdxCol,    /* 
15090 54 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  The column of th
150a0 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 6c 6f  e index to be lo
150b0 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  aded */.  int re
150c0 67 4f 75 74 20 20 20 20 20 20 2f 2a 20 53 74 6f  gOut      /* Sto
150d0 72 65 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6c  re the index col
150e0 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 74 68 69  umn value in thi
150f0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b  s register */.){
15100 0a 20 20 69 31 36 20 69 54 61 62 43 6f 6c 20 3d  .  i16 iTabCol =
15110 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
15120 69 49 64 78 43 6f 6c 5d 3b 0a 20 20 69 66 28 20  iIdxCol];.  if( 
15130 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f 45 58 50 52  iTabCol==XN_EXPR
15140 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15150 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29  pIdx->aColExpr )
15160 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
15170 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 6e 45  dx->aColExpr->nE
15180 78 70 72 3e 69 49 64 78 43 6f 6c 20 29 3b 0a 20  xpr>iIdxCol );. 
15190 20 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66     pParse->iSelf
151a0 54 61 62 20 3d 20 69 54 61 62 43 75 72 3b 0a 20  Tab = iTabCur;. 
151b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
151c0 64 65 43 6f 70 79 28 70 50 61 72 73 65 2c 20 70  deCopy(pParse, p
151d0 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
151e0 5b 69 49 64 78 43 6f 6c 5d 2e 70 45 78 70 72 2c  [iIdxCol].pExpr,
151f0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
15200 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
15210 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
15220 66 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  fTable(pParse->p
15230 56 64 62 65 2c 20 70 49 64 78 2d 3e 70 54 61 62  Vdbe, pIdx->pTab
15240 6c 65 2c 20 69 54 61 62 43 75 72 2c 0a 20 20 20  le, iTabCur,.   
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 69 54 61 62 43 6f 6c 2c 20 72 65 67 4f 75 74   iTabCol, regOut
15280 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15290 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
152a0 20 65 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   extract the val
152b0 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  ue of the iCol-t
152c0 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61  h column of a ta
152d0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
152e0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
152f0 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a 20 20  olumnOfTable(.  
15300 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
15310 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e 64 65  /* The VDBE unde
15320 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
15330 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
15340 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
15350 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
15360 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
15370 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 54 68  TabCur,    /* Th
15380 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2e 20  e table cursor. 
15390 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72 73 6f   Or the PK curso
153a0 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  r for WITHOUT RO
153b0 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  WID */.  int iCo
153c0 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  l,       /* Inde
153d0 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
153e0 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a 20 20  to extract */.  
153f0 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20 20 20  int regOut      
15400 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
15410 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73 20 72  alue into this r
15420 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
15430 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20 69 43  if( iCol<0 || iC
15440 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
15450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15460 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
15470 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c 20 72  owid, iTabCur, r
15480 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  egOut);.  }else{
15490 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 49 73  .    int op = Is
154a0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 3f 20  Virtual(pTab) ? 
154b0 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f 50 5f  OP_VColumn : OP_
154c0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20  Column;.    int 
154d0 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66  x = iCol;.    if
154e0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
154f0 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d 20 73  ) ){.      x = s
15500 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
15510 64 65 78 28 73 71 6c 69 74 65 33 50 72 69 6d 61  dex(sqlite3Prima
15520 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
15530 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  , iCol);.    }. 
15540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15550 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54 61 62  dOp3(v, op, iTab
15560 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74 29 3b  Cur, x, regOut);
15570 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e  .  }.  if( iCol>
15580 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15590 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74 28 76  3ColumnDefault(v
155a0 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20 72 65  , pTab, iCol, re
155b0 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
155c0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
155d0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72  e that will extr
155e0 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  act the iColumn-
155f0 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 0a 2a  th column from.*
15600 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  * table pTab and
15610 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75 6d   store the colum
15620 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72 65 67  n value in a reg
15630 69 73 74 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 41 6e  ister. .**.** An
15640 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
15650 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  to store the col
15660 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67  umn value in reg
15670 69 73 74 65 72 20 69 52 65 67 2e 20 20 54 68 69  ister iReg.  Thi
15680 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 67 61 72 61  s.** is not gara
15690 6e 74 65 65 65 64 20 66 6f 72 20 47 65 74 43 6f  nteeed for GetCo
156a0 6c 75 6d 6e 28 29 20 2d 20 74 68 65 20 72 65 73  lumn() - the res
156b0 75 6c 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  ult can be store
156c0 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 72 65 67 69  d in.** any regi
156d0 73 74 65 72 2e 20 20 42 75 74 20 74 68 65 20 72  ster.  But the r
156e0 65 73 75 6c 74 20 69 73 20 67 75 61 72 61 6e 74  esult is guarant
156f0 65 65 64 20 74 6f 20 6c 61 6e 64 20 69 6e 20 72  eed to land in r
15700 65 67 69 73 74 65 72 20 69 52 65 67 0a 2a 2a 20  egister iReg.** 
15710 66 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 54 6f 52  for GetColumnToR
15720 65 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  eg()..**.** Ther
15730 65 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65  e must be an ope
15740 6e 20 63 75 72 73 6f 72 20 74 6f 20 70 54 61 62  n cursor to pTab
15750 20 69 6e 20 69 54 61 62 6c 65 20 77 68 65 6e 20   in iTable when 
15760 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
15770 69 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 69  is called.  If i
15780 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e 20 63 6f  Column<0 then co
15790 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
157a0 74 68 61 74 20 65 78 74 72 61 63 74 73 20 74 68  that extracts th
157b0 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20  e rowid..*/.int 
157c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
157d0 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50 61 72 73  etColumn(.  Pars
157e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
157f0 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
15800 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
15810 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
15820 70 54 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73  pTab,     /* Des
15830 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
15840 74 61 62 6c 65 20 77 65 20 61 72 65 20 72 65 61  table we are rea
15850 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ding from */.  i
15860 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt iColumn,     
15870 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
15880 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  table column */.
15890 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
158a0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
158b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
158c0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
158d0 69 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  iReg,        /* 
158e0 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65  Store results he
158f0 72 65 20 2a 2f 0a 20 20 75 38 20 70 35 20 20 20  re */.  u8 p5   
15900 20 20 20 20 20 20 20 20 20 2f 2a 20 50 35 20 76           /* P5 v
15910 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43 6f 6c 75  alue for OP_Colu
15920 6d 6e 20 2b 20 46 4c 41 47 53 20 2a 2f 0a 29 7b  mn + FLAGS */.){
15930 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
15940 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
15950 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
15960 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66  olCache *p;..  f
15970 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
15980 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
15990 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
159a0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
159b0 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26   if( p->iReg>0 &
159c0 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  & p->iTable==iTa
159d0 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d  ble && p->iColum
159e0 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  n==iColumn ){.  
159f0 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61      p->lru = pPa
15a00 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b  rse->iCacheCnt++
15a10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
15a20 78 70 72 43 61 63 68 65 50 69 6e 52 65 67 69 73  xprCachePinRegis
15a30 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69  ter(pParse, p->i
15a40 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Reg);.      retu
15a50 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20  rn p->iReg;.    
15a60 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74  }.  }  .  assert
15a70 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
15a80 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
15a90 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70  lumnOfTable(v, p
15aa0 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  Tab, iTable, iCo
15ab0 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69  lumn, iReg);.  i
15ac0 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c  f( p5 ){.    sql
15ad0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15ae0 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65  (v, p5);.  }else
15af0 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  {   .    sqlite3
15b00 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
15b10 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69  Parse, iTable, i
15b20 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
15b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67   }.  return iReg
15b40 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
15b50 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
15b60 6e 54 6f 52 65 67 28 0a 20 20 50 61 72 73 65 20  nToReg(.  Parse 
15b70 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61  *pParse,   /* Pa
15b80 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
15b90 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
15ba0 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
15bb0 61 62 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  ab,     /* Descr
15bc0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 61  iption of the ta
15bd0 62 6c 65 20 77 65 20 61 72 65 20 72 65 61 64 69  ble we are readi
15be0 6e 67 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ng from */.  int
15bf0 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a   iColumn,     /*
15c00 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   Index of the ta
15c10 62 6c 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ble column */.  
15c20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
15c30 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70   /* The cursor p
15c40 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74  ointing to the t
15c50 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  able */.  int iR
15c60 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  eg         /* St
15c70 6f 72 65 20 72 65 73 75 6c 74 73 20 68 65 72 65  ore results here
15c80 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 31 20   */.){.  int r1 
15c90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
15ca0 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
15cb0 65 2c 20 70 54 61 62 2c 20 69 43 6f 6c 75 6d 6e  e, pTab, iColumn
15cc0 2c 20 69 54 61 62 6c 65 2c 20 69 52 65 67 2c 20  , iTable, iReg, 
15cd0 30 29 3b 0a 20 20 69 66 28 20 72 31 21 3d 69 52  0);.  if( r1!=iR
15ce0 65 67 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  eg ) sqlite3Vdbe
15cf0 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d 3e 70  AddOp2(pParse->p
15d00 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  Vdbe, OP_SCopy, 
15d10 72 31 2c 20 69 52 65 67 29 3b 0a 7d 0a 0a 0a 2f  r1, iReg);.}.../
15d20 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 63  *.** Clear all c
15d30 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74 72  olumn cache entr
15d40 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ies..*/.void sql
15d50 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
15d60 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ar(Parse *pParse
15d70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
15d80 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
15d90 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  p;..#if SQLITE_D
15da0 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
15db0 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
15dc0 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
15dd0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
15de0 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a 20  tf("CLEAR\n");. 
15df0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
15e00 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
15e10 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
15e20 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
15e30 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, p++){.    if
15e40 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20 20  ( p->iReg ){.   
15e50 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
15e60 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
15e70 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
15e80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15e90 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
15ea0 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66 66  fact that an aff
15eb0 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61 73  inity change has
15ec0 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43 6f   occurred on iCo
15ed0 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72 73  unt.** registers
15ee0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 69   starting with i
15ef0 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Start..*/.void s
15f00 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
15f10 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50 61  ffinityChange(Pa
15f20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15f30 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43 6f   iStart, int iCo
15f40 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  unt){.  sqlite3E
15f50 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
15f60 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20 69  Parse, iStart, i
15f70 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Count);.}../*.**
15f80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
15f90 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20 66  o move content f
15fa0 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69 46  rom registers iF
15fb0 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65 67  rom...iFrom+nReg
15fc0 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69 54  -1.** over to iT
15fd0 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20 4b  o..iTo+nReg-1. K
15fe0 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  eep the column c
15ff0 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65 2e  ache up-to-date.
16000 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16010 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61 72  ExprCodeMove(Par
16020 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
16030 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c 20  iFrom, int iTo, 
16040 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73 73  int nReg){.  ass
16050 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f 2b  ert( iFrom>=iTo+
16060 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e 52  nReg || iFrom+nR
16070 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71 6c  eg<=iTo );.  sql
16080 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
16090 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
160a0 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69 54  _Move, iFrom, iT
160b0 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c 69  o, nReg);.  sqli
160c0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
160d0 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f 6d  ve(pParse, iFrom
160e0 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66 20  , nReg);.}..#if 
160f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
16100 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
16110 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
16120 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
16130 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
16140 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65 20  register in the 
16150 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54 6f  range iFrom..iTo
16160 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a 20   (inclusive).** 
16170 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
16180 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  of the column ca
16190 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
161a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
161b0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
161c0 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d  and testcase() m
161d0 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61 6e  acros only.** an
161e0 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61  d does not appea
161f0 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  r in a normal bu
16200 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ild..*/.static i
16210 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  nt usedAsColumnC
16220 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72  ache(Parse *pPar
16230 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
16240 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20 69  nt iTo){.  int i
16250 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
16260 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69  ache *p;.  for(i
16270 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
16280 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
16290 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
162a0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  +, p++){.    int
162b0 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20   r = p->iReg;.  
162c0 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20 26    if( r>=iFrom &
162d0 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75 72  & r<=iTo ) retur
162e0 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45 53  n 1;    /*NO_TES
162f0 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  T*/.  }.  return
16300 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
16310 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c 20  SQLITE_DEBUG || 
16320 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
16330 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  TEST */../*.** C
16340 6f 6e 76 65 72 74 20 61 6e 20 65 78 70 72 65 73  onvert an expres
16350 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20 54  sion node to a T
16360 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73 74  K_REGISTER.*/.st
16370 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54 6f  atic void exprTo
16380 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a 70  Register(Expr *p
16390 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 70  , int iReg){.  p
163a0 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a 20  ->op2 = p->op;. 
163b0 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47 49   p->op = TK_REGI
163c0 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62 6c  STER;.  p->iTabl
163d0 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70 72  e = iReg;.  Expr
163e0 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70 2c  ClearProperty(p,
163f0 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f 2a   EP_Skip);.}../*
16400 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
16410 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  e into the curre
16420 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75  nt Vdbe to evalu
16430 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ate the given.**
16440 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41 74   expression.  At
16450 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20 74  tempt to store t
16460 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72 65  he results in re
16470 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22 2e  gister "target".
16480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
16490 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72 65  egister where re
164a0 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64  sults are stored
164b0 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 69  ..**.** With thi
164c0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72 65  s routine, there
164d0 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65 65   is no guarantee
164e0 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77 69   that results wi
164f0 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64 20  ll.** be stored 
16500 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65 20  in target.  The 
16510 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65 20  result might be 
16520 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20 6f  stored in some o
16530 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65 72  ther.** register
16540 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65 6e   if it is conven
16550 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20 20  ient to do so.  
16560 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
16570 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68 65  tion.** must che
16580 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  ck the return co
16590 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  de and move the 
165a0 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 64  results to the d
165b0 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73 74  esired.** regist
165c0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
165d0 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
165e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
165f0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
16600 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
16610 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
16620 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d 20  dbe;  /* The VM 
16630 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
16640 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  on */.  int op; 
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
16670 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
16680 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61 72   int inReg = tar
16690 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  get;       /* Re
166a0 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e 20  sults stored in 
166b0 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20 2a  register inReg *
166c0 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  /.  int regFree1
166d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
166e0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65   If non-zero fre
166f0 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  e this temporary
16700 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
16710 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b  nt regFree2 = 0;
16720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
16730 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68 69  on-zero free thi
16740 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  s temporary regi
16750 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 31  ster */.  int r1
16760 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20 20  , r2, r3, r4;   
16770 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 72      /* Various r
16780 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20  egister numbers 
16790 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
167a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 2f   = pParse->db; /
167b0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
167c0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
167d0 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20 20  xpr tempX;      
167e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
167f0 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  orary expression
16800 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   node */..  asse
16810 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26 20  rt( target>0 && 
16820 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d 3e  target<=pParse->
16830 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76 3d  nMem );.  if( v=
16840 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
16850 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
16860 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16870 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16880 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
16890 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f 4e  ){.    op = TK_N
168a0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
168b0 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
168c0 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
168d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
168e0 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  K_AGG_COLUMN: {.
168f0 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70        AggInfo *p
16900 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d  AggInfo = pExpr-
16910 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20  >pAggInfo;.     
16920 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
16930 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41 67  col *pCol = &pAg
16940 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78 70  gInfo->aCol[pExp
16950 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20 20  r->iAgg];.      
16960 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e 64  if( !pAggInfo->d
16970 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20 20  irectMode ){.   
16980 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
16990 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20 20  l->iMem>0 );.   
169a0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43 6f       inReg = pCo
169b0 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20 20  l->iMem;.       
169c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
169d0 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66 6f  lse if( pAggInfo
169e0 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20  ->useSortingIdx 
169f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
16a00 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16a10 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67 49  OP_Column, pAggI
16a20 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78 50  nfo->sortingIdxP
16a30 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Tab,.           
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
16a60 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b  Column, target);
16a70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
16a90 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c 6c   Otherwise, fall
16aa0 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
16ab0 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a 2f  K_COLUMN case */
16ac0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16ad0 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
16ae0 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 45     int iTab = pE
16af0 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
16b00 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29 7b     if( iTab<0 ){
16b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
16b20 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29 7b  rse->ckBase>0 ){
16b30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  .          /* Ge
16b40 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20 63  nerating CHECK c
16b50 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69 6e  onstraints or in
16b60 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61 72  serting into par
16b70 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tial index */.  
16b80 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
16b90 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 2b  pExpr->iColumn +
16ba0 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3b   pParse->ckBase;
16bb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16bc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16bd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
16be0 64 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69  ding an expressi
16bf0 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20  on that is part 
16c00 6f 66 20 61 6e 20 69 6e 64 65 78 20 77 68 65 72  of an index wher
16c10 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
16c20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74           ** in t
16c30 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 20 74  he index refer t
16c40 6f 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 77  o the table to w
16c50 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 62  hich the index b
16c60 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20  elongs */.      
16c70 20 20 20 20 69 54 61 62 20 3d 20 70 50 61 72 73      iTab = pPars
16c80 65 2d 3e 69 53 65 6c 66 54 61 62 3b 0a 20 20 20  e->iSelfTab;.   
16c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16ca0 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
16cb0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
16cc0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
16cd0 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
16d00 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
16d10 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d30 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
16d40 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
16d50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16d60 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
16d70 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
16d80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
16d90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
16db0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16dc0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
16dd0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
16de0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
16df0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
16e00 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
16e10 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
16e20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
16e30 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
16e40 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16e50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
16e60 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
16e70 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
16e80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16e90 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16ea0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16ec0 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20  beLoadString(v, 
16ed0 74 61 72 67 65 74 2c 20 70 45 78 70 72 2d 3e 75  target, pExpr->u
16ee0 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  .zToken);.      
16ef0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16f00 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
16f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
16f20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
16f30 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ull, 0, target);
16f40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16f50 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
16f60 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
16f70 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
16f80 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69  _BLOB: {.      i
16f90 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  nt n;.      cons
16fa0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
16fb0 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20   char *zBlob;.  
16fc0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16fd0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16fe0 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16ff0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17000 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
17010 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78  n[0]=='x' || pEx
17020 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d  pr->u.zToken[0]=
17030 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61 73  ='X' );.      as
17040 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
17050 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29  Token[1]=='\'' )
17060 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45 78  ;.      z = &pEx
17070 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b  pr->u.zToken[2];
17080 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
17090 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20  e3Strlen30(z) - 
170a0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
170b0 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20   z[n]=='\'' );. 
170c0 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c       zBlob = sql
170d0 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73 71  ite3HexToBlob(sq
170e0 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c 20  lite3VdbeDb(v), 
170f0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  z, n);.      sql
17100 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
17110 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20  , OP_Blob, n/2, 
17120 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62  target, 0, zBlob
17130 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
17140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17150 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
17160 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
17170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17190 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
171a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ue) );.      ass
171b0 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ert( pExpr->u.zT
171c0 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20  oken!=0 );.     
171d0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
171e0 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29  u.zToken[0]!=0 )
171f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17210 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
17220 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74  >iColumn, target
17230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
17240 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21  pr->u.zToken[1]!
17250 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
17260 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
17270 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20  Token[0]=='?' . 
17280 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
17290 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  trcmp(pExpr->u.z
172a0 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61  Token, pParse->a
172b0 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
172c0 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20  umn-1])==0 );.  
172d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172e0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
172f0 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
17300 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
17310 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
17320 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
17330 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17340 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
17350 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70  .      inReg = p
17360 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
17370 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17390 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61  OMIT_CAST.    ca
173a0 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20  se TK_CAST: {.  
173b0 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
173c0 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ns of the form: 
173d0 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53 20    CAST(pLeft AS 
173e0 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20  token) */.      
173f0 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45  inReg = sqlite3E
17400 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50  xprCodeTarget(pP
17410 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
17420 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  ft, target);.   
17430 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
17440 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rget ){.        
17450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17460 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69  2(v, OP_SCopy, i
17470 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b 0a 20  nReg, target);. 
17480 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74         inReg = t
17490 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d 0a 20  arget;.      }. 
174a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
174b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 61 73  AddOp2(v, OP_Cas
174c0 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  t, target,.     
174d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174e0 20 20 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69     sqlite3Affini
174f0 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
17500 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20 20  zToken, 0));.   
17510 20 20 20 74 65 73 74 63 61 73 65 28 20 75 73 65     testcase( use
17520 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70  dAsColumnCache(p
17530 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 69 6e  Parse, inReg, in
17540 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20 73 71  Reg) );.      sq
17550 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17560 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17570 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29 3b 0a  rse, inReg, 1);.
17580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17590 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
175a0 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f  ITE_OMIT_CAST */
175b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
175c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
175d0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
175e0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
175f0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
17600 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
17610 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
17620 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
17630 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
17640 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
17650 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
17660 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
17670 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
17680 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
17690 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ee2);.      code
176a0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
176b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45  pExpr->pLeft, pE
176c0 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c  xpr->pRight, op,
176d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
176e0 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67     r1, r2, inReg
176f0 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  , SQLITE_STOREP2
17700 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17710 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
17720 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
17730 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17740 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
17750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
17760 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
17770 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
17780 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
17790 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
177a0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
177b0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
177c0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
177d0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
177e0 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
177f0 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
17800 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
17810 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
17820 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
17830 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
17840 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
17850 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
17860 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
17870 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
17880 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61  =OP_Eq);.      a
17890 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
178a0 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
178b0 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
178c0 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
178d0 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ne);.      tes
178e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
178f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
17900 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
17910 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      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 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
17940 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
17950 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17960 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
17970 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
17980 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
17990 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
179a0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
179b0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
179c0 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
179d0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
179e0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
179f0 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
17a00 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
17a10 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
17a20 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
17a30 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
17a40 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
17a50 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
17a60 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65 67 2c    r1, r2, inReg,
17a90 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
17aa0 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  | SQLITE_NULLEQ)
17ab0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
17ac0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
17ad0 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
17ae0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
17af0 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
17b00 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
17b10 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
17b20 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
17b30 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
17b40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17b50 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20  ase TK_AND:.    
17b60 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20  case TK_OR:.    
17b70 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20  case TK_PLUS:.  
17b80 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a    case TK_STAR:.
17b90 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
17ba0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  S:.    case TK_R
17bb0 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EM:.    case TK_
17bc0 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
17bd0 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
17be0 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20  ase TK_SLASH:.  
17bf0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
17c00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  :.    case TK_RS
17c10 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65 20  HIFT: .    case 
17c20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20  TK_CONCAT: {.   
17c30 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41 4e     assert( TK_AN
17c40 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20 20 20  D==OP_And );    
17c50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17c60 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a  ( op==TK_AND );.
17c70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
17c80 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20 20 20  _OR==OP_Or );   
17c90 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
17ca0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52 20 29  ase( op==TK_OR )
17cb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17cc0 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20  TK_PLUS==OP_Add 
17cd0 29 3b 20 20 20 20 20 20 20 20 20 20 20 74 65 73  );           tes
17ce0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 50 4c  tcase( op==TK_PL
17cf0 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  US );.      asse
17d00 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50  rt( TK_MINUS==OP
17d10 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20 20 20  _Subtract );    
17d20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17d30 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20 20 20  K_MINUS );.     
17d40 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
17d50 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
17d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17d70 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a 20 20  op==TK_REM );.  
17d80 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
17d90 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64  ITAND==OP_BitAnd
17da0 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73   );      testcas
17db0 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41 4e 44  e( op==TK_BITAND
17dc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17dd0 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42  ( TK_BITOR==OP_B
17de0 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20 20 74  itOr );        t
17df0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17e00 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20 20 61  BITOR );.      a
17e10 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
17e20 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20 20 20  =OP_Divide );   
17e30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
17e40 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a 20 20  ==TK_SLASH );.  
17e50 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
17e60 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
17e70 65 66 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  eft );   testcas
17e80 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49 46 54  e( op==TK_LSHIFT
17e90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17ea0 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_RSHIFT==OP_
17eb0 53 68 69 66 74 52 69 67 68 74 20 29 3b 20 20 74  ShiftRight );  t
17ec0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
17ed0 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  RSHIFT );.      
17ee0 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41  assert( TK_CONCA
17ef0 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 20  T==OP_Concat ); 
17f00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
17f10 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29 3b 0a  p==TK_CONCAT );.
17f20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17f30 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17f40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17f50 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
17f60 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
17f70 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17f80 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17f90 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
17fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17fb0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
17fc0 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74  , r2, r1, target
17fd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17fe0 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
17ff0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18000 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
18010 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18020 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18030 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
18040 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
18050 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
18060 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20    assert( pLeft 
18070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
18080 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47  ft->op==TK_INTEG
18090 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ER ){.        co
180a0 64 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  deInteger(pParse
180b0 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61 72 67  , pLeft, 1, targ
180c0 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  et);.#ifndef SQL
180d0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
180e0 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 7d 65  G_POINT.      }e
180f0 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f  lse if( pLeft->o
18100 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
18110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
18120 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
18130 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
18140 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 63  ue) );.        c
18150 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65 66 74  odeReal(v, pLeft
18160 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c 20 74  ->u.zToken, 1, t
18170 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20  arget);.#endif. 
18180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18190 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d 20 54      tempX.op = T
181a0 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  K_INTEGER;.     
181b0 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73 20 3d     tempX.flags =
181c0 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f   EP_IntValue|EP_
181d0 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 20  TokenOnly;.     
181e0 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61 6c 75     tempX.u.iValu
181f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  e = 0;.        r
18200 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
18210 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
18220 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72 65 65  &tempX, &regFree
18230 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d  1);.        r2 =
18240 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18250 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
18260 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
18270 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20 20 73  ree2);.        s
18280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
18290 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
182a0 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65 74 29   r2, r1, target)
182b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
182c0 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
182d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
182e0 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b   inReg = target;
182f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18300 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
18310 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
18320 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
18330 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e   assert( TK_BITN
18340 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b  OT==OP_BitNot );
18350 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
18360 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a 20 20  =TK_BITNOT );.  
18370 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
18380 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20 20 20  OT==OP_Not );   
18390 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
183a0 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a 20 20  op==TK_NOT );.  
183b0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
183c0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
183d0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
183e0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
183f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18400 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18410 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67      inReg = targ
18420 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  et;.      sqlite
18430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
18440 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b 0a 20  p, r1, inReg);. 
18450 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18460 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
18470 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
18480 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
18490 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
184a0 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49 53     assert( TK_IS
184b0 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20  NULL==OP_IsNull 
184c0 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
184d0 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a  p==TK_ISNULL );.
184e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
184f0 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
18500 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61 73 65  Null ); testcase
18510 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  ( op==TK_NOTNULL
18520 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
18530 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18540 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61  P_Integer, 1, ta
18550 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72 31 20  rget);.      r1 
18560 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18570 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
18580 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
18590 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
185a0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
185b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 64 64  ==0 );.      add
185c0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
185d0 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72 31 29  ddOp1(v, op, r1)
185e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
185f0 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
18600 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  _ISNULL);.      
18610 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
18620 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
18630 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18640 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18650 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74 61 72  _Integer, 0, tar
18660 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
18670 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
18680 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
18690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
186a0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
186b0 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 41  CTION: {.      A
186c0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20  ggInfo *pInfo = 
186d0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
186e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f  .      if( pInfo
186f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
18700 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
18710 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18720 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
18730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
18740 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
18750 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
18760 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45 78 70  ate: %s()", pExp
18770 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
18780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18790 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e 66 6f     inReg = pInfo
187a0 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d 3e 69  ->aFunc[pExpr->i
187b0 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20 20 20  Agg].iMem;.     
187c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
187d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
187e0 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
187f0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46      ExprList *pF
18800 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  arg;       /* Li
18810 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  st of function a
18820 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
18830 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20 20 20    int nFarg;    
18840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18850 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61  er of function a
18860 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
18870 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18890 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
188a0 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
188b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
188c0 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  zId;       /* Th
188d0 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  e function name 
188e0 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f 6e  */.      u32 con
188f0 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20  stMask = 0;     
18900 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74  /* Mask of funct
18910 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 68  ion arguments th
18920 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20  at are constant 
18930 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18950 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
18960 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
18970 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20 20  = ENC(db);      
18980 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63 6f  /* The text enco
18990 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 69  ding used by thi
189a0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
189b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
189c0 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20  ll = 0;    /* A 
189d0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
189e0 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ce */..      ass
189f0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18a00 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18a10 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
18a20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
18a30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
18a40 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a  P_TokenOnly) ){.
18a50 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
18a60 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
18a70 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20          pFarg = 
18a80 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
18a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
18aa0 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70 46  arg = pFarg ? pF
18ab0 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  arg->nExpr : 0;.
18ac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
18ad0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
18ae0 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
18af0 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20  e) );.      zId 
18b00 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
18b10 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
18b20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
18b30 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 46 61  ion(db, zId, nFa
18b40 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  rg, enc, 0);.   
18b50 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 7c     if( pDef==0 |
18b60 7c 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  | pDef->xFinaliz
18b70 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
18b80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18b90 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
18ba0 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 28 29 22   function: %s()"
18bb0 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
18bc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
18bd0 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70 74        /* Attempt
18be0 20 61 20 64 69 72 65 63 74 20 69 6d 70 6c 65 6d   a direct implem
18bf0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18c00 62 75 69 6c 74 2d 69 6e 20 43 4f 41 4c 45 53 43  built-in COALESC
18c10 45 28 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  E() and.      **
18c20 20 49 46 4e 55 4c 4c 28 29 20 66 75 6e 63 74 69   IFNULL() functi
18c30 6f 6e 73 2e 20 20 54 68 69 73 20 61 76 6f 69 64  ons.  This avoid
18c40 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 65 76  s unnecessary ev
18c50 61 6c 75 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20  aluation of.    
18c60 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 70    ** arguments p
18c70 61 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 6f  ast the first no
18c80 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e  n-NULL argument.
18c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18ca0 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
18cb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
18cc0 43 5f 43 4f 41 4c 45 53 43 45 20 29 7b 0a 20 20  C_COALESCE ){.  
18cd0 20 20 20 20 20 20 69 6e 74 20 65 6e 64 43 6f 61        int endCoa
18ce0 6c 65 73 63 65 20 3d 20 73 71 6c 69 74 65 33 56  lesce = sqlite3V
18cf0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
18d00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18d10 20 6e 46 61 72 67 3e 3d 32 20 29 3b 0a 20 20 20   nFarg>=2 );.   
18d20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18d30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
18d40 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
18d50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
18d60 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 46 61 72   for(i=1; i<nFar
18d70 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
18d80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18d90 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  dOp2(v, OP_NotNu
18da0 6c 6c 2c 20 74 61 72 67 65 74 2c 20 65 6e 64 43  ll, target, endC
18db0 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20  oalesce);.      
18dc0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18dd0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  (v);.          s
18de0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
18df0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 74 61  emove(pParse, ta
18e00 72 67 65 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  rget, 1);.      
18e10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
18e20 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
18e30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18e40 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
18e50 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e  se, pFarg->a[i].
18e60 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
18e70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18e80 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
18e90 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  arse);.        }
18ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18eb0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18ec0 28 76 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29  (v, endCoalesce)
18ed0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18ee0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18ef0 2f 2a 20 54 68 65 20 55 4e 4c 49 4b 45 4c 59 28  /* The UNLIKELY(
18f00 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  ) function is a 
18f10 6e 6f 2d 6f 70 2e 20 20 54 68 65 20 72 65 73 75  no-op.  The resu
18f20 6c 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  lt is the value.
18f30 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
18f40 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
18f50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18f60 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
18f70 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
18f80 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
18f90 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
18fa0 72 67 3e 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg>=1 );.       
18fb0 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
18fc0 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28 70  ExprCodeTarget(p
18fd0 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
18fe0 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
18ff0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
19000 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 61 72   for(i=0; i<nFar
19020 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
19030 20 69 66 28 20 69 3c 33 32 20 26 26 20 73 71 6c   if( i<32 && sql
19040 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
19050 6e 74 28 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  nt(pFarg->a[i].p
19060 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
19070 20 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d     testcase( i==
19080 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
19090 63 6f 6e 73 74 4d 61 73 6b 20 7c 3d 20 4d 41 53  constMask |= MAS
190a0 4b 42 49 54 33 32 28 69 29 3b 0a 20 20 20 20 20  KBIT32(i);.     
190b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
190c0 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
190d0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
190e0 4e 45 45 44 43 4f 4c 4c 29 21 3d 30 20 26 26 20  NEEDCOLL)!=0 && 
190f0 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
19100 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
19110 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
19120 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
19130 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
19140 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19150 20 20 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a     if( pFarg ){.
19160 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 73          if( cons
19170 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 20 20 20  tMask ){.       
19180 20 20 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e     r1 = pParse->
19190 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
191a0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
191b0 3d 20 6e 46 61 72 67 3b 0a 20 20 20 20 20 20 20  = nFarg;.       
191c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
191d0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
191e0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
191f0 65 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20  e, nFarg);.     
19200 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
19210 20 46 6f 72 20 6c 65 6e 67 74 68 28 29 20 61 6e   For length() an
19220 64 20 74 79 70 65 6f 66 28 29 20 66 75 6e 63 74  d typeof() funct
19230 69 6f 6e 73 20 77 69 74 68 20 61 20 63 6f 6c 75  ions with a colu
19240 6d 6e 20 61 72 67 75 6d 65 6e 74 2c 0a 20 20 20  mn argument,.   
19250 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
19260 50 35 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  P5 parameter to 
19270 74 68 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70  the OP_Column op
19280 63 6f 64 65 20 74 6f 20 4f 50 46 4c 41 47 5f 4c  code to OPFLAG_L
19290 45 4e 47 54 48 41 52 47 0a 20 20 20 20 20 20 20  ENGTHARG.       
192a0 20 2a 2a 20 6f 72 20 4f 50 46 4c 41 47 5f 54 59   ** or OPFLAG_TY
192b0 50 45 4f 46 41 52 47 20 72 65 73 70 65 63 74 69  PEOFARG respecti
192c0 76 65 6c 79 2c 20 74 6f 20 61 76 6f 69 64 20 75  vely, to avoid u
192d0 6e 6e 65 63 65 73 73 61 72 79 20 64 61 74 61 0a  nnecessary data.
192e0 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 61 64 69          ** loadi
192f0 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ng..        */. 
19300 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
19310 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
19320 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54  QLITE_FUNC_LENGT
19330 48 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59  H|SQLITE_FUNC_TY
19340 50 45 4f 46 29 29 21 3d 30 20 29 7b 0a 20 20 20  PEOF))!=0 ){.   
19350 20 20 20 20 20 20 20 75 38 20 65 78 70 72 4f 70         u8 exprOp
19360 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
19370 72 74 28 20 6e 46 61 72 67 3d 3d 31 20 29 3b 0a  rt( nFarg==1 );.
19380 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19390 28 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45  ( pFarg->a[0].pE
193a0 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
193b0 20 20 20 20 65 78 70 72 4f 70 20 3d 20 70 46 61      exprOp = pFa
193c0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  rg->a[0].pExpr->
193d0 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  op;.          if
193e0 28 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c  ( exprOp==TK_COL
193f0 55 4d 4e 20 7c 7c 20 65 78 70 72 4f 70 3d 3d 54  UMN || exprOp==T
19400 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
19410 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
19420 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
19430 4c 45 4e 47 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c  LENGTH==OPFLAG_L
19440 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20  ENGTHARG );.    
19450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19460 53 51 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45  SQLITE_FUNC_TYPE
19470 4f 46 3d 3d 4f 50 46 4c 41 47 5f 54 59 50 45 4f  OF==OPFLAG_TYPEO
19480 46 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  FARG );.        
19490 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
194a0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
194b0 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47  OPFLAG_LENGTHARG
194c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
194d0 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
194e0 72 2d 3e 6f 70 32 20 3d 20 0a 20 20 20 20 20 20  r->op2 = .      
194f0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
19500 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 4f  ->funcFlags & (O
19510 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 7c  PFLAG_LENGTHARG|
19520 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
19530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19540 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
19550 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19560 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 20  hePush(pParse); 
19570 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65      /* Ticket 2e
19580 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20  a2425d34be */.  
19590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
195a0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
195b0 61 72 73 65 2c 20 70 46 61 72 67 2c 20 72 31 2c  arse, pFarg, r1,
195c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f      SQLITE_ECEL_
195f0 44 55 50 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f  DUP|SQLITE_ECEL_
19600 46 41 43 54 4f 52 29 3b 0a 20 20 20 20 20 20 20  FACTOR);.       
19610 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
19620 65 50 6f 70 28 70 50 61 72 73 65 29 3b 20 20 20  ePop(pParse);   
19630 20 20 20 2f 2a 20 54 69 63 6b 65 74 20 32 65 61     /* Ticket 2ea
19640 32 34 32 35 64 33 34 62 65 20 2a 2f 0a 20 20 20  2425d34be */.   
19650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19660 20 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 20 20    r1 = 0;.      
19670 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19680 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
19690 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  LE.      /* Poss
196a0 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64 20 74 68  ibly overload th
196b0 65 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 74 68  e function if th
196c0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
196d0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 76   is.      ** a v
196e0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6c  irtual table col
196f0 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  umn..      **.  
19700 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e 66 69 78      ** For infix
19710 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c 49 4b 45   functions (LIKE
19720 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58 50 2c 20  , GLOB, REGEXP, 
19730 61 6e 64 20 4d 41 54 43 48 29 20 75 73 65 20 74  and MATCH) use t
19740 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
19750 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 74  nd argument, not
19760 20 74 68 65 20 66 69 72 73 74 2c 20 61 73 20 74   the first, as t
19770 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
19780 65 73 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  est to.      ** 
19790 73 65 65 20 69 66 20 69 74 20 69 73 20 61 20 63  see if it is a c
197a0 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69 72 74 75  olumn in a virtu
197b0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  al table.  This 
197c0 69 73 20 64 6f 6e 65 20 62 65 63 61 75 73 65 0a  is done because.
197d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66        ** the lef
197e0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 66  t operand of inf
197f0 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 74 68  ix functions (th
19800 65 20 6f 70 65 72 61 6e 64 20 77 65 20 77 61 6e  e operand we wan
19810 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6f  t to.      ** co
19820 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61 64 69 6e  ntrol overloadin
19830 67 29 20 65 6e 64 73 20 75 70 20 61 73 20 74 68  g) ends up as th
19840 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19850 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
19860 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  * function.  The
19870 20 65 78 70 72 65 73 73 69 6f 6e 20 22 41 20 67   expression "A g
19880 6c 6f 62 20 42 22 20 69 73 20 65 71 75 69 76 61  lob B" is equiva
19890 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20 20 20 2a  lent to .      *
198a0 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e 20 20 57  * "glob(B,A).  W
198b0 65 20 77 61 6e 74 20 74 6f 20 75 73 65 20 74 68  e want to use th
198c0 65 20 41 20 69 6e 20 22 41 20 67 6c 6f 62 20 42  e A in "A glob B
198d0 22 20 74 6f 20 74 65 73 74 0a 20 20 20 20 20 20  " to test.      
198e0 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ** for function 
198f0 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20 20 42 75  overloading.  Bu
19900 74 20 77 65 20 75 73 65 20 74 68 65 20 42 20 74  t we use the B t
19910 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28 42 2c 41  erm in "glob(B,A
19920 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  )"..      */.   
19930 20 20 20 69 66 28 20 6e 46 61 72 67 3e 3d 32 20     if( nFarg>=2 
19940 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
19950 20 26 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 29   & EP_InfixFunc)
19960 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
19970 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76   = sqlite3VtabOv
19980 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64  erloadFunction(d
19990 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20  b, pDef, nFarg, 
199a0 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70 45 78 70  pFarg->a[1].pExp
199b0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
199c0 69 66 28 20 6e 46 61 72 67 3e 30 20 29 7b 0a 20  if( nFarg>0 ){. 
199d0 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71         pDef = sq
199e0 6c 69 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61  lite3VtabOverloa
199f0 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44  dFunction(db, pD
19a00 65 66 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67  ef, nFarg, pFarg
19a10 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
19a20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
19a30 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
19a40 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
19a50 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
19a60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
19a70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
19a80 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
19a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19aa0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
19ab0 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c  ollSeq, 0, 0, 0,
19ac0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
19ad0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
19ae0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
19af0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
19b00 4f 50 5f 46 75 6e 63 74 69 6f 6e 30 2c 20 63 6f  OP_Function0, co
19b10 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74 61 72  nstMask, r1, tar
19b20 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  get,.           
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
19b40 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46 55 4e  ar*)pDef, P4_FUN
19b50 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
19b60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
19b70 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29 3b 0a  (v, (u8)nFarg);.
19b80 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 20        if( nFarg 
19b90 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d 30 20  && constMask==0 
19ba0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19bb0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
19bc0 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 6e  ge(pParse, r1, n
19bd0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Farg);.      }. 
19be0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19bf0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
19c00 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
19c10 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
19c20 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
19c30 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 74  ELECT: {.      t
19c40 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
19c50 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20 20 20  EXISTS );.      
19c60 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
19c70 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
19c80 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
19c90 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50  CodeSubselect(pP
19ca0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20  arse, pExpr, 0, 
19cb0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
19cc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19cd0 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TK_IN: {.      i
19ce0 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65 20 3d  nt destIfFalse =
19cf0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19d00 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19d10 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
19d20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
19d30 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
19d40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19d50 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
19d60 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
19d70 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
19d80 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
19d90 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
19da0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
19db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19dc0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19dd0 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 1, target);.  
19de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19df0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
19e00 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
19e10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19e20 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
19e30 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b 0a 20  m, target, 0);. 
19e40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19e50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
19e60 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
19e70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19e80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19e90 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
19ea0 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  /...    /*.    *
19eb0 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79  *    x BETWEEN y
19ec0 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20   AND z.    **.  
19ed0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75    ** This is equ
19ee0 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a  ivalent to.    *
19ef0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79  *.    **    x>=y
19f00 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a   AND x<=z.    **
19f10 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f  .    ** X is sto
19f20 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
19f30 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
19f40 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
19f50 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
19f60 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73  xpr..    ** Z is
19f70 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72   stored in pExpr
19f80 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
19f90 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xpr..    */.    
19fa0 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
19fb0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
19fc0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
19fd0 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63  eft;.      struc
19fe0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
19ff0 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d  *pLItem = pExpr-
1a000 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  >x.pList->a;.   
1a010 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
1a020 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b  = pLItem->pExpr;
1a030 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ..      r1 = sql
1a040 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a050 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1a060 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1a070 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1a080 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1a090 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65 67 46  e, pRight, &regF
1a0a0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74 65 73  ree2);.      tes
1a0b0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1a0c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1a0d0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1a0e0 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20  0 );.      r3 = 
1a0f0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
1a100 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
1a110 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r4 = sqlite3Get
1a120 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a130 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1a140 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
1a150 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c  , pRight, OP_Ge,
1a160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a170 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 53     r1, r2, r3, S
1a180 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 20  QLITE_STOREP2); 
1a190 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a1a0 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b  ;.      pLItem++
1a1b0 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
1a1c0 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
1a1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a1e0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a1f0 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b 0a 20  se, regFree2);. 
1a200 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1a210 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1a220 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72  arse, pRight, &r
1a230 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20  egFree2);.      
1a240 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1a250 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  e2==0 );.      c
1a260 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
1a270 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1a280 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72 32 2c  , OP_Le, r1, r2,
1a290 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r4, SQLITE_STOR
1a2a0 45 50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  EP2);.      Vdbe
1a2b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1a2c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a2d0 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64 2c 20  dOp3(v, OP_And, 
1a2e0 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74 29 3b  r3, r4, target);
1a2f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
1a300 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1a310 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  rse, r3);.      
1a320 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a330 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 34  mpReg(pParse, r4
1a340 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a350 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1a360 4b 5f 53 50 41 4e 3a 0a 20 20 20 20 63 61 73 65  K_SPAN:.    case
1a370 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
1a380 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
1a390 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
1a3a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a3b0 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1a3c0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
1a3d0 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
1a3e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
1a3f0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1a400 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1a410 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1a420 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1a430 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1a440 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1a450 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1a460 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1a470 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1a480 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1a490 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1a4a0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1a4b0 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1a4c0 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1a4d0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1a4e0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1a4f0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1a500 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1a510 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1a520 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1a530 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1a540 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1a550 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1a560 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1a570 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1a580 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1a590 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
1a5a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
1a5b0 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
1a5c0 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
1a5d0 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
1a5e0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
1a5f0 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
1a600 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
1a610 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
1a620 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
1a630 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
1a640 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
1a650 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
1a660 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
1a670 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
1a680 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
1a690 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
1a6a0 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
1a6b0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
1a6c0 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
1a6d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a6e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
1a6f0 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
1a700 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
1a710 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
1a720 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
1a730 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
1a740 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
1a750 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
1a760 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
1a770 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
1a780 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
1a790 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
1a7a0 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
1a7b0 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
1a7c0 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
1a7d0 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
1a7e0 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
1a7f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1a800 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1a810 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
1a820 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
1a830 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1a840 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
1a850 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
1a860 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
1a870 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
1a880 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
1a890 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
1a8a0 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
1a8b0 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
1a8c0 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
1a8d0 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
1a8e0 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
1a8f0 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
1a900 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
1a910 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a920 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
1a930 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
1a940 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
1a950 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
1a960 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
1a970 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
1a980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1a990 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
1a9a0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
1a9b0 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
1a9c0 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
1a9d0 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
1a9e0 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
1a9f0 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
1aa00 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
1aa10 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
1aa20 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
1aa30 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
1aa40 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
1aa50 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
1aa60 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
1aa70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aa80 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
1aa90 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
1aaa0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
1aab0 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
1aac0 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
1aad0 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
1aae0 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
1aaf0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
1ab00 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
1ab10 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
1ab20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
1ab30 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
1ab40 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
1ab50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ab60 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
1ab70 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
1ab80 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
1ab90 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
1aba0 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
1abb0 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
1abc0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
1abd0 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
1abe0 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
1abf0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
1ac00 6c 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  l..      **.    
1ac10 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1ac20 3a 20 52 2d 36 30 39 38 35 2d 35 37 36 36 32 20  : R-60985-57662 
1ac30 53 51 4c 69 74 65 20 77 69 6c 6c 20 63 6f 6e 76  SQLite will conv
1ac40 65 72 74 20 74 68 65 20 76 61 6c 75 65 20 62 61  ert the value ba
1ac50 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 66  ck to.      ** f
1ac60 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 77 68  loating point wh
1ac70 65 6e 20 65 78 74 72 61 63 74 69 6e 67 20 69 74  en extracting it
1ac80 20 66 72 6f 6d 20 74 68 65 20 72 65 63 6f 72 64   from the record
1ac90 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1aca0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
1acb0 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54 61  0 .       && pTa
1acc0 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
1acd0 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
1ace0 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
1acf0 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  L.      ){.     
1ad00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ad10 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c 41  dOp1(v, OP_RealA
1ad20 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74 29  ffinity, target)
1ad30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1ad40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ad50 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1ad60 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20 20   ** Form A:.    
1ad70 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45 4e  **   CASE x WHEN
1ad80 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   e1 THEN r1 WHEN
1ad90 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e 20   e2 THEN r2 ... 
1ada0 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e 20  WHEN eN THEN rN 
1adb0 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20 2a  ELSE y END.    *
1adc0 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42 3a  *.    ** Form B:
1add0 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
1ade0 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57  HEN e1 THEN r1 W
1adf0 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e  HEN e2 THEN r2 .
1ae00 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20  .. WHEN eN THEN 
1ae10 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20  rN ELSE y END.  
1ae20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d    **.    ** Form
1ae30 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72 61   A is can be tra
1ae40 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74 68  nsformed into th
1ae50 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1ae60 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  m B as follows:.
1ae70 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57 48      **   CASE WH
1ae80 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31 20  EN x=e1 THEN r1 
1ae90 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20 72  WHEN x=e2 THEN r
1aea0 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20 20  2 ....    **    
1aeb0 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54 48      WHEN x=eN TH
1aec0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1aed0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58  .    **.    ** X
1aee0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
1aef0 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  is in pExpr->pLe
1af00 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
1af10 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65 6d  in the last elem
1af20 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78 2e  ent of pExpr->x.
1af30 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d 3e  pList if pExpr->
1af40 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 69  x.pList->nExpr i
1af50 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20 54  s.    ** odd.  T
1af60 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70 74  he Y is also opt
1af70 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20 6e  ional.  If the n
1af80 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1af90 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20 20  s in x.pList.   
1afa0 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68 65   ** is even, the
1afb0 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20 61  n Y is omitted a
1afc0 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69 73  nd the "otherwis
1afd0 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  e" result is NUL
1afe0 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73 20  L..    ** Ei is 
1aff0 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
1b000 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20 69  >a[i*2] and Ri i
1b010 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  s pExpr->pList->
1b020 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a 2a  a[i*2+1]..    **
1b030 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 75  .    ** The resu
1b040 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  lt of the expres
1b050 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20 66  sion is the Ri f
1b060 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  or the first mat
1b070 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a 2a  ching Ei,.    **
1b080 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20   or if there is 
1b090 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 20  no matching Ei, 
1b0a0 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59 2c  the ELSE term Y,
1b0b0 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 0a   or if there is.
1b0c0 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20 74      ** no ELSE t
1b0d0 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a  erm, NULL..    *
1b0e0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61  /.    default: a
1b0f0 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43 41  ssert( op==TK_CA
1b100 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e  SE ); {.      in
1b110 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20 20  t endLabel;     
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f  /* GOTO label fo
1b140 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73 74  r end of CASE st
1b150 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mt */.      int 
1b160 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20 20  nextCase;       
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b180 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72 20   GOTO label for 
1b190 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73 65  next WHEN clause
1b1a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 45   */.      int nE
1b1b0 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32              /* 2
1b1d0 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45 4e  x number of WHEN
1b1e0 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
1b1f0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1b220 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c  r */.      ExprL
1b230 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b250 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65 72  List of WHEN ter
1b260 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  ms */.      stru
1b270 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1b280 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f 2a   *aListelem;  /*
1b290 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20 74   Array of WHEN t
1b2a0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45 78  erms */.      Ex
1b2b0 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20 20  pr opCompare;   
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78 70  /* The X==Ei exp
1b2e0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
1b2f0 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70 72     /* The X expr
1b320 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
1b330 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30 3b  Expr *pTest = 0;
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72 6d    /* X==Ei (form
1b360 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20 28   A) or just Ei (
1b370 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20 20  form B) */.     
1b380 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 69   VVA_ONLY( int i
1b390 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50 61  CacheLevel = pPa
1b3a0 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1b3b0 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ; )..      asser
1b3c0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
1b3d0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1b3e0 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78 70  sSelect) && pExp
1b3f0 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20 20  r->x.pList );.  
1b400 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
1b410 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
1b420 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
1b430 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1b440 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
1b450 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
1b460 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
1b470 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
1b480 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20 3d        endLabel =
1b490 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1b4a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1b4b0 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72 2d  if( (pX = pExpr-
1b4c0 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20 20  >pLeft)!=0 ){.  
1b4d0 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a 70        tempX = *p
1b4e0 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  X;.        testc
1b4f0 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ase( pX->op==TK_
1b500 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
1b510 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72    exprToRegister
1b520 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65 33  (&tempX, sqlite3
1b530 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1b540 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72 65  rse, pX, &regFre
1b550 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74 65  e1));.        te
1b560 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1b570 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6f  ==0 );.        o
1b580 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54 4b  pCompare.op = TK
1b590 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70 43  _EQ;.        opC
1b5a0 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20 26  ompare.pLeft = &
1b5b0 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20 70  tempX;.        p
1b5c0 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61 72  Test = &opCompar
1b5d0 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 69  e;.        /* Ti
1b5e0 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63 64  cket b351d95f9cd
1b5f0 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38 66  5ef17e9d9dbae18f
1b600 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a 20  5ca8611190001:. 
1b610 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76 61         ** The va
1b620 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31 20  lue in regFree1 
1b630 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79 2d  might get SCopy-
1b640 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  ed into the file
1b650 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20   result..       
1b660 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72 65   ** So make sure
1b670 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72 65   that the regFre
1b680 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20 6e  e1 register is n
1b690 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f 74  ot reused for ot
1b6a0 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  her.        ** p
1b6b0 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73 73  urposes and poss
1b6c0 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65 6e  ibly overwritten
1b6d0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
1b6e0 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20 20  gFree1 = 0;.    
1b6f0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1b700 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69 3d  0; i<nExpr-1; i=
1b710 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i+2){.        sq
1b720 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1b730 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1b740 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20 20      if( pX ){.  
1b750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b760 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pTest!=0 );.    
1b770 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
1b780 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65 6c  pRight = aListel
1b790 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  em[i].pExpr;.   
1b7a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b7b0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61 4c        pTest = aL
1b7c0 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72  istelem[i].pExpr
1b7d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b7e0 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20 73      nextCase = s
1b7f0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1b800 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
1b810 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74 2d  testcase( pTest-
1b820 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
1b830 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b840 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1b850 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78 74  rse, pTest, next
1b860 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Case, SQLITE_JUM
1b870 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1b880 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69 73    testcase( aLis
1b890 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
1b8a0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1b8b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b8c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1b8d0 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e, aListelem[i+1
1b8e0 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74 29  ].pExpr, target)
1b8f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b900 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 65 6e 64  3VdbeGoto(v, end
1b910 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Label);.        
1b920 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1b930 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1b940 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b950 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1b960 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20  nextCase);.     
1b970 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45   }.      if( (nE
1b980 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20  xpr&1)!=0 ){.   
1b990 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1b9a0 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
1b9b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b9c0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1b9d0 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78  e, pEList->a[nEx
1b9e0 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  pr-1].pExpr, tar
1b9f0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
1ba00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1ba10 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1ba20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ba30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ba40 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1ba50 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
1ba60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1ba70 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ba80 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1ba90 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  >0 .           |
1baa0 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  | pParse->iCache
1bab0 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76  Level==iCacheLev
1bac0 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  el );.      sqli
1bad0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1bae0 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29  bel(v, endLabel)
1baf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bb00 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1bb10 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1bb20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49  .    case TK_RAI
1bb30 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  SE: {.      asse
1bb40 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  rt( pExpr->affin
1bb50 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b  ity==OE_Rollback
1bb60 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
1bb70 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d  pExpr->affinity=
1bb80 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20  =OE_Abort.      
1bb90 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61       || pExpr->a
1bba0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c  ffinity==OE_Fail
1bbb0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1bbc0 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1bbd0 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20  OE_Ignore.      
1bbe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
1bbf0 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
1bc00 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
1bc10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1bc20 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
1bc40 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
1bc50 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
1bc60 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
1bc70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1bc80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1bc90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66    if( pExpr->aff
1bca0 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20  inity==OE_Abort 
1bcb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bcc0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
1bcd0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1bce0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1bcf0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1bd00 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
1bd10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
1bd20 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1bd30 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  Ignore ){.      
1bd40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bd50 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20  Op4(.           
1bd60 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c   v, OP_Halt, SQL
1bd70 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72  ITE_OK, OE_Ignor
1bd80 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  e, 0, pExpr->u.z
1bd90 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20  Token,0);.      
1bda0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1bdb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1bdc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
1bdd0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
1bde0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e  arse, SQLITE_CON
1bdf0 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c  STRAINT_TRIGGER,
1be00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1be20 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20  Expr->affinity, 
1be30 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
1be40 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
1be50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1be60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1be70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1be80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1be90 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69  egFree1);.  sqli
1bea0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1beb0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1bec0 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  e2);.  return in
1bed0 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61  Reg;.}../*.** Fa
1bee0 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64  ctor out the cod
1bef0 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  e of the given e
1bf00 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69  xpression to ini
1bf10 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1bf20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bf30 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1bf40 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1bf50 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1bf60 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
1bf70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
1bf80 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1bf90 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68   to code when th
1bfa0 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a  e VDBE initializ
1bfb0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44  es */.  int regD
1bfc0 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  est,      /* Sto
1bfd0 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  re the value in 
1bfe0 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
1bff0 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20  .  u8 reusable  
1c000 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1c010 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
1c020 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29  is reusable */.)
1c030 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b  {.  ExprList *p;
1c040 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74  .  assert( Const
1c050 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29  FactorOk(pParse)
1c060 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65   );.  p = pParse
1c070 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1c080 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
1c090 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
1c0a0 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  b, pExpr, 0);.  
1c0b0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  p = sqlite3ExprL
1c0c0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1c0d0 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69  , p, pExpr);.  i
1c0e0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72  f( p ){.     str
1c0f0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
1c100 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1c110 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  [p->nExpr-1];.  
1c120 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e     pItem->u.iCon
1c130 73 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44  stExprReg = regD
1c140 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d  est;.     pItem-
1c150 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73  >reusable = reus
1c160 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72  able;.  }.  pPar
1c170 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d  se->pConstExpr =
1c180 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   p;.}../*.** Gen
1c190 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
1c1a0 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73  aluate an expres
1c1b0 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  sion and store t
1c1c0 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
1c1d0 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20  to a register.  
1c1e0 52 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73  Return the regis
1c1f0 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ter number where
1c200 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1c210 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a  are stored..**.*
1c220 2a 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65  * If the registe
1c230 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  r is a temporary
1c240 20 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63   register that c
1c250 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65  an be deallocate
1c260 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65  d,.** then write
1c270 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f   its number into
1c280 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20   *pReg.  If the 
1c290 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  result register 
1c2a0 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70  is not.** a temp
1c2b0 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20  orary, then set 
1c2c0 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pReg to zero..*
1c2d0 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
1c2e0 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65   a constant, the
1c2f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  n this routine m
1c300 69 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68  ight generate th
1c310 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69  is.** code to fi
1c320 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20  ll the register 
1c330 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  in the initializ
1c340 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66  ation section of
1c350 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f   the.** VDBE pro
1c360 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74  gram, in order t
1c370 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20  o factor it out 
1c380 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f  of the evaluatio
1c390 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73  n loop..*/.int s
1c3a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1c3b0 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mp(Parse *pParse
1c3c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
1c3d0 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74  nt *pReg){.  int
1c3e0 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   r2;.  pExpr = s
1c3f0 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c400 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
1c410 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f  if( ConstFactorO
1c420 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20  k(pParse).   && 
1c430 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45  pExpr->op!=TK_RE
1c440 47 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c  GISTER.   && sql
1c450 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
1c460 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29  ntNotJoin(pExpr)
1c470 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  .  ){.    ExprLi
1c480 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  st *p = pParse->
1c490 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
1c4a0 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67  int i;.    *pReg
1c4b0 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70    = 0;.    if( p
1c4c0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
1c4d0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1c4e0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
1c4f0 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70  (pItem=p->a, i=p
1c500 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49  ->nExpr; i>0; pI
1c510 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20  tem++, i--){.   
1c520 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1c530 72 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69  reusable && sqli
1c540 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
1c550 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70  Item->pExpr,pExp
1c560 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  r,-1)==0 ){.    
1c570 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74        return pIt
1c580 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72  em->u.iConstExpr
1c590 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Reg;.        }. 
1c5a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c5b0 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e   r2 = ++pParse->
1c5c0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1c5d0 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28  3ExprCodeAtInit(
1c5e0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72  pParse, pExpr, r
1c5f0 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1c600 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
1c610 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
1c620 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d  Parse);.    r2 =
1c630 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c640 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1c650 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69  Expr, r1);.    i
1c660 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20  f( r2==r1 ){.   
1c670 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20     *pReg = r1;. 
1c680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c690 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1c6a0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1c6b0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  );.      *pReg =
1c6c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1c6d0 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a  return r2;.}../*
1c6e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c6f0 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
1c700 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20  uate expression 
1c710 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20  pExpr and store 
1c720 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69  the.** results i
1c730 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1c740 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20  t.  The results 
1c750 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
1c760 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72  o appear.** in r
1c770 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
1c780 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1c790 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
1c7a0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1c7b0 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b  pr, int target){
1c7c0 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20  .  int inReg;.. 
1c7d0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1c7e0 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61  0 && target<=pPa
1c7f0 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69  rse->nMem );.  i
1c800 66 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70  f( pExpr && pExp
1c810 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  r->op==TK_REGIST
1c820 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ER ){.    sqlite
1c830 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1c840 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f  se->pVdbe, OP_Co
1c850 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  py, pExpr->iTabl
1c860 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65  e, target);.  }e
1c870 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d  lse{.    inReg =
1c880 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1c890 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
1c8a0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
1c8b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1c8c0 65 2d 3e 70 56 64 62 65 21 3d 30 20 7c 7c 20 70  e->pVdbe!=0 || p
1c8d0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1c8e0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
1c8f0 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74  f( inReg!=target
1c900 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62   && pParse->pVdb
1c910 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1c920 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61  e3VdbeAddOp2(pPa
1c930 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53  rse->pVdbe, OP_S
1c940 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72  Copy, inReg, tar
1c950 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  get);.    }.  }.
1c960 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
1c970 74 72 61 6e 73 69 65 6e 74 20 63 6f 70 79 20 6f  transient copy o
1c980 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  f expression pEx
1c990 70 72 20 61 6e 64 20 74 68 65 6e 20 63 6f 64 65  pr and then code
1c9a0 20 69 74 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c   it using.** sql
1c9b0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 20  ite3ExprCode(). 
1c9c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
1c9d0 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71  rks just like sq
1c9e0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 0a  lite3ExprCode().
1c9f0 2a 2a 20 65 78 63 65 70 74 20 74 68 61 74 20 74  ** except that t
1ca00 68 65 20 69 6e 70 75 74 20 65 78 70 72 65 73 73  he input express
1ca10 69 6f 6e 20 69 73 20 67 75 61 72 61 6e 74 65 65  ion is guarantee
1ca20 64 20 74 6f 20 62 65 20 75 6e 63 68 61 6e 67 65  d to be unchange
1ca30 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1ca40 65 33 45 78 70 72 43 6f 64 65 43 6f 70 79 28 50  e3ExprCodeCopy(P
1ca50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1ca60 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74  pr *pExpr, int t
1ca70 61 72 67 65 74 29 7b 0a 20 20 73 71 6c 69 74 65  arget){.  sqlite
1ca80 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1ca90 64 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  db;.  pExpr = sq
1caa0 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1cab0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 69 66   pExpr, 0);.  if
1cac0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
1cad0 6c 65 64 20 29 20 73 71 6c 69 74 65 33 45 78 70  led ) sqlite3Exp
1cae0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1caf0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1cb00 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1cb10 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  e(db, pExpr);.}.
1cb20 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1cb30 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65  code that will e
1cb40 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69  valuate expressi
1cb50 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f  on pExpr and sto
1cb60 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  re the.** result
1cb70 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  s in register ta
1cb80 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c  rget.  The resul
1cb90 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ts are guarantee
1cba0 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69  d to appear.** i
1cbb0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1cbc0 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  t.  If the expre
1cbd0 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
1cbe0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1cbf0 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68  tine.** might ch
1cc00 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65  oose to code the
1cc10 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69   expression at i
1cc20 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1cc30 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1cc40 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f  te3ExprCodeFacto
1cc50 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  rable(Parse *pPa
1cc60 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1cc70 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20  , int target){. 
1cc80 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43   if( pParse->okC
1cc90 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73 71  onstFactor && sq
1cca0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
1ccb0 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
1ccc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ccd0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1cce0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30  pExpr, target, 0
1ccf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cd00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1cd10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74  pParse, pExpr, t
1cd20 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  arget);.  }.}../
1cd30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1cd40 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74 65  de that evaluate
1cd50 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
1cd60 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20  ession and puts 
1cd70 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  the result.** in
1cd80 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1cd90 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b  ..**.** Also mak
1cda0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1cdb0 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c  expression resul
1cdc0 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20  ts into another 
1cdd0 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65 72  "cache" register
1cde0 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74  .** and modify t
1cdf0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f  he expression so
1ce00 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 74   that the next t
1ce10 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75 61  ime it is evalua
1ce20 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75  ted,.** the resu
1ce30 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  lt is a copy of 
1ce40 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73 74  the cache regist
1ce50 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1ce60 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1ce70 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  or expressions t
1ce80 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c  hat are used mul
1ce90 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e  tiple .** times.
1cea0 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c 75    They are evalu
1ceb0 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68  ated once and th
1cec0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
1ced0 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61   expression.** a
1cee0 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f  re reused..*/.vo
1cef0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  id sqlite3ExprCo
1cf00 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73 65  deAndCache(Parse
1cf10 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
1cf20 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65  pExpr, int targe
1cf30 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  t){.  Vdbe *v = 
1cf40 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1cf50 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73   int iMem;..  as
1cf60 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1cf70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1cf80 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54  r->op!=TK_REGIST
1cf90 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ER );.  sqlite3E
1cfa0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1cfb0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
1cfc0 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73    iMem = ++pPars
1cfd0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
1cfe0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cff0 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c  OP_Copy, target,
1d000 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f   iMem);.  exprTo
1d010 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c 20  Register(pExpr, 
1d020 69 4d 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iMem);.}../*.** 
1d030 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
1d040 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
1d050 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
1d060 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
1d070 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
1d080 6c 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75  list into a sequ
1d090 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
1d0a0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74  s beginning at t
1d0b0 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arget..**.** Ret
1d0c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1d0d0 66 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75  f elements evalu
1d0e0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
1d0f0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20  SQLITE_ECEL_DUP 
1d100 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68  flag prevents th
1d110 65 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d  e arguments from
1d120 20 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64   being.** filled
1d130 20 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e   using OP_SCopy.
1d140 20 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62    OP_Copy must b
1d150 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  e used instead..
1d160 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1d170 5f 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67  _ECEL_FACTOR arg
1d180 75 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e  ument allows con
1d190 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  stant arguments 
1d1a0 74 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65  to be.** factore
1d1b0 64 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69  d out into initi
1d1c0 61 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a  alization code..
1d1d0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1d1e0 5f 45 43 45 4c 5f 52 45 46 20 66 6c 61 67 20 6d  _ECEL_REF flag m
1d1f0 65 61 6e 73 20 74 68 61 74 20 65 78 70 72 65 73  eans that expres
1d200 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  sions in the lis
1d210 74 20 77 69 74 68 0a 2a 2a 20 45 78 70 72 4c 69  t with.** ExprLi
1d220 73 74 2e 61 5b 5d 2e 75 2e 78 2e 69 4f 72 64 65  st.a[].u.x.iOrde
1d230 72 42 79 43 6f 6c 3e 30 20 68 61 76 65 20 61 6c  rByCol>0 have al
1d240 72 65 61 64 79 20 62 65 65 6e 20 65 76 61 6c 75  ready been evalu
1d250 61 74 65 64 20 61 6e 64 20 73 74 6f 72 65 64 0a  ated and stored.
1d260 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  ** in registers 
1d270 61 74 20 73 72 63 52 65 67 2c 20 61 6e 64 20 73  at srcReg, and s
1d280 6f 20 74 68 65 20 76 61 6c 75 65 20 63 61 6e 20  o the value can 
1d290 62 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  be copied from t
1d2a0 68 65 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  here..*/.int sql
1d2b0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
1d2c0 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
1d2d0 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
1d2e0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1d2f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1d300 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
1d310 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
1d320 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
1d330 74 20 74 61 72 67 65 74 2c 20 20 20 20 20 20 20  t target,       
1d340 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
1d350 74 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  te results */.  
1d360 69 6e 74 20 73 72 63 52 65 67 2c 20 20 20 20 20  int srcReg,     
1d370 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 72 65 67     /* Source reg
1d380 69 73 74 65 72 73 20 69 66 20 53 51 4c 49 54 45  isters if SQLITE
1d390 5f 45 43 45 4c 5f 52 45 46 20 2a 2f 0a 20 20 75  _ECEL_REF */.  u
1d3a0 38 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  8 flags         
1d3b0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 43 45 4c    /* SQLITE_ECEL
1d3c0 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
1d3d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1d3e0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d3f0 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 75  int i, j, n;.  u
1d400 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c 61 67  8 copyOp = (flag
1d410 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  s & SQLITE_ECEL_
1d420 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79 20 3a  DUP) ? OP_Copy :
1d430 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 56 64 62   OP_SCopy;.  Vdb
1d440 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1d450 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
1d460 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 61 73  pList!=0 );.  as
1d470 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 29  sert( target>0 )
1d480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1d490 73 65 2d 3e 70 56 64 62 65 21 3d 30 20 29 3b 20  se->pVdbe!=0 ); 
1d4a0 20 2f 2a 20 4e 65 76 65 72 20 67 65 74 73 20 74   /* Never gets t
1d4b0 68 69 73 20 66 61 72 20 6f 74 68 65 72 77 69 73  his far otherwis
1d4c0 65 20 2a 2f 0a 20 20 6e 20 3d 20 70 4c 69 73 74  e */.  n = pList
1d4d0 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 21  ->nExpr;.  if( !
1d4e0 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1d4f0 61 72 73 65 29 20 29 20 66 6c 61 67 73 20 26 3d  arse) ) flags &=
1d500 20 7e 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41   ~SQLITE_ECEL_FA
1d510 43 54 4f 52 3b 0a 20 20 66 6f 72 28 70 49 74 65  CTOR;.  for(pIte
1d520 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
1d530 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d   i<n; i++, pItem
1d540 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
1d550 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Expr = pItem->pE
1d560 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  xpr;.    if( (fl
1d570 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
1d580 4c 5f 52 45 46 29 21 3d 30 20 26 26 20 28 6a 20  L_REF)!=0 && (j 
1d590 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 75 2e  = pList->a[i].u.
1d5a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30  x.iOrderByCol)>0
1d5b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d5c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
1d5d0 6f 70 79 4f 70 2c 20 6a 2b 73 72 63 52 65 67 2d  opyOp, j+srcReg-
1d5e0 31 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20  1, target+i);.  
1d5f0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 6c 61    }else if( (fla
1d600 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs & SQLITE_ECEL
1d610 5f 46 41 43 54 4f 52 29 21 3d 30 20 26 26 20 73  _FACTOR)!=0 && s
1d620 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1d630 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1d640 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1d650 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72 73  CodeAtInit(pPars
1d660 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1d670 2b 69 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  +i, 0);.    }els
1d680 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 52  e{.      int inR
1d690 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  eg = sqlite3Expr
1d6a0 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73  CodeTarget(pPars
1d6b0 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1d6c0 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  +i);.      if( i
1d6d0 6e 52 65 67 21 3d 74 61 72 67 65 74 2b 69 20 29  nReg!=target+i )
1d6e0 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
1d6f0 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 20 20 69   *pOp;.        i
1d700 66 28 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f  f( copyOp==OP_Co
1d710 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  py.         && (
1d720 70 4f 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47  pOp=sqlite3VdbeG
1d730 65 74 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70  etOp(v, -1))->op
1d740 63 6f 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20  code==OP_Copy.  
1d750 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70         && pOp->p
1d760 31 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52  1+pOp->p3+1==inR
1d770 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
1d780 4f 70 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31  Op->p2+pOp->p3+1
1d790 3d 3d 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20  ==target+i.     
1d7a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1d7b0 70 4f 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20  pOp->p3++;.     
1d7c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d7d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1d7e0 64 64 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c  ddOp2(v, copyOp,
1d7f0 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69   inReg, target+i
1d800 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d820 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
1d830 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1d840 65 20 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20  e for a BETWEEN 
1d850 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  operator..**.** 
1d860 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20 41     x BETWEEN y A
1d870 4e 44 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ND z.**.** The a
1d880 62 6f 76 65 20 69 73 20 65 71 75 69 76 61 6c 65  bove is equivale
1d890 6e 74 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to .**.**    
1d8a0 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a  x>=y AND x<=z.**
1d8b0 0a 2a 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73  .** Code it as s
1d8c0 75 63 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65  uch, taking care
1d8d0 20 74 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f   to do the commo
1d8e0 6e 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  n subexpression.
1d8f0 2a 2a 20 65 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f  ** elimination o
1d900 66 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  f x..*/.static v
1d910 6f 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77  oid exprCodeBetw
1d920 65 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  een(.  Parse *pP
1d930 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
1d940 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
1d950 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
1d960 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1d970 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45  ,      /* The BE
1d980 54 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e  TWEEN expression
1d990 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20   */.  int dest, 
1d9a0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
1d9b0 68 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70  here if the jump
1d9c0 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69   is taken */.  i
1d9d0 6e 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20  nt jumpIfTrue,  
1d9e0 20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d   /* Take the jum
1d9f0 70 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e  p if the BETWEEN
1da00 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
1da10 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
1da20 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1da30 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1da40 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
1da50 45 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20  Expr exprAnd;   
1da60 20 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65    /* The AND ope
1da70 72 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41  rator in  x>=y A
1da80 4e 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78  ND x<=z  */.  Ex
1da90 70 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20  pr compLeft;    
1daa0 2f 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65  /* The  x>=y  te
1dab0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d  rm */.  Expr com
1dac0 70 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65  pRight;   /* The
1dad0 20 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a    x<=z  term */.
1dae0 20 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20    Expr exprX;   
1daf0 20 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73      /* The  x  s
1db00 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  ubexpression */.
1db10 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d    int regFree1 =
1db20 20 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79   0; /* Temporary
1db30 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
1db40 0a 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  ..  assert( !Exp
1db50 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1db60 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1db70 29 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a  ) );.  exprX = *
1db80 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1db90 65 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f  exprAnd.op = TK_
1dba0 41 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70  AND;.  exprAnd.p
1dbb0 4c 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74  Left = &compLeft
1dbc0 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67  ;.  exprAnd.pRig
1dbd0 68 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b  ht = &compRight;
1dbe0 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d  .  compLeft.op =
1dbf0 20 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65   TK_GE;.  compLe
1dc00 66 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ft.pLeft = &expr
1dc10 58 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52  X;.  compLeft.pR
1dc20 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  ight = pExpr->x.
1dc30 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
1dc40 72 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f  r;.  compRight.o
1dc50 70 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d  p = TK_LE;.  com
1dc60 70 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26  pRight.pLeft = &
1dc70 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67  exprX;.  compRig
1dc80 68 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70  ht.pRight = pExp
1dc90 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
1dca0 2e 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f  .pExpr;.  exprTo
1dcb0 52 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c  Register(&exprX,
1dcc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1dcd0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78  Temp(pParse, &ex
1dce0 70 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29  prX, &regFree1))
1dcf0 3b 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72  ;.  if( jumpIfTr
1dd00 75 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ue ){.    sqlite
1dd10 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1dd20 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65  se, &exprAnd, de
1dd30 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
1dd40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1dd50 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1dd60 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e  (pParse, &exprAn
1dd70 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  d, dest, jumpIfN
1dd80 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ull);.  }.  sqli
1dd90 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1dda0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1ddb0 65 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72  e1);..  /* Ensur
1ddc0 65 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20  e adequate test 
1ddd0 63 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65  coverage */.  te
1dde0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1ddf0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1de00 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1de10 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1de20 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1de30 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1de40 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1de50 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1de60 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20  ( jumpIfTrue==0 
1de70 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1de80 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1de90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1dea0 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20  umpIfTrue==0 && 
1deb0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1dec0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1ded0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1dee0 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1def0 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65  pIfNull==0 && re
1df00 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1df10 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1df20 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1df30 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72  Null==0 && regFr
1df40 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74  ee1!=0 );.  test
1df50 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65  case( jumpIfTrue
1df60 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  !=0 && jumpIfNul
1df70 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31  l!=0 && regFree1
1df80 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==0 );.  testcas
1df90 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30  e( jumpIfTrue!=0
1dfa0 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
1dfb0 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30  0 && regFree1!=0
1dfc0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   );.}../*.** Gen
1dfd0 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1dfe0 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
1dff0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
1e000 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
1e010 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
1e020 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
1e030 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75  ssion is true bu
1e040 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
1e050 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
1e060 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
1e070 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
1e080 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1e090 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
1e0a0 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
1e0b0 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
1e0c0 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74  alse), then.** t
1e0d0 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1e0e0 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66  the jumpIfNull f
1e0f0 6c 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55  lag is SQLITE_JU
1e100 4d 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  MPIFNULL..**.** 
1e110 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1e120 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1e130 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
1e140 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
1e150 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
1e160 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
1e170 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
1e180 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
1e190 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1e1a0 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
1e1b0 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
1e1c0 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
1e1d0 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
1e1e0 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
1e1f0 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
1e200 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
1e210 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
1e220 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
1e230 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
1e240 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
1e250 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
1e260 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
1e270 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
1e280 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61  fTrue(Parse *pPa
1e290 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
1e2a0 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20  , int dest, int 
1e2b0 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56  jumpIfNull){.  V
1e2c0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
1e2d0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
1e2e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1e2f0 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree1 = 0;.  int 
1e300 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20  regFree2 = 0;.  
1e310 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61  int r1, r2;..  a
1e320 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c  ssert( jumpIfNul
1e330 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  l==SQLITE_JUMPIF
1e340 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75  NULL || jumpIfNu
1e350 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  ll==0 );.  if( N
1e360 45 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20  EVER(v==0) )    
1e370 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69   return;  /* Exi
1e380 73 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63  stence of VDBE c
1e390 68 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72  hecked by caller
1e3a0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
1e3b0 70 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75  pExpr==0) ) retu
1e3c0 72 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74  rn;  /* No way t
1e3d0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a  his can happen *
1e3e0 2f 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  /.  op = pExpr->
1e3f0 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
1e400 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
1e410 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
1e420 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
1e430 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1e440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1e450 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1e460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e470 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1e480 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1e490 32 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  2,jumpIfNull^SQL
1e4a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1e4b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e4c0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1e4d0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1e4e0 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1e4f0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1e500 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
1e510 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e520 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1e530 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
1e540 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e550 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1e560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e570 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
1e580 52 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  R: {.      testc
1e590 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e5a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e5b0 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1e5c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e5d0 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
1e5e0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
1e5f0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1e600 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1e610 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1e620 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1e630 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1e640 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e650 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e660 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1e670 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e680 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
1e690 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
1e6a0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1e6b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
1e6c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e6d0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1e6e0 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
1e6f0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
1e700 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e710 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20  case TK_IS:.    
1e720 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 0a 20  case TK_ISNOT:. 
1e730 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
1e740 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
1e750 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1e760 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
1e770 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f 49    op = (op==TK_I
1e780 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b 5f  S) ? TK_EQ : TK_
1e790 4e 45 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66  NE;.      jumpIf
1e7a0 4e 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55  Null = SQLITE_NU
1e7b0 4c 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46  LLEQ;.      /* F
1e7c0 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20  all thru */.    
1e7d0 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
1e7e0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
1e7f0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
1e800 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
1e810 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
1e820 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
1e830 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e840 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e850 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
1e860 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e870 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1e880 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
1e890 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
1e8a0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1e8b0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1e8c0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
1e8d0 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
1e8e0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
1e8f0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
1e900 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e920 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
1e930 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
1e940 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
1e950 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
1e960 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
1e970 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1e980 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
1e990 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
1e9a0 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
1e9b0 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
1e9c0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
1e9d0 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
1e9e0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
1e9f0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ea00 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
1ea10 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
1ea20 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1ea30 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
1ea40 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1ea50 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
1ea60 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
1ea70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1ea80 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
1ea90 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
1eaa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1eab0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
1eac0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
1ead0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
1eae0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1eaf0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1eb00 4f 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e  OP_Eq && jumpIfN
1eb10 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ull!=SQLITE_NULL
1eb20 45 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  EQ);.      asser
1eb30 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b  t(TK_NE==OP_Ne);
1eb40 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1eb50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _Ne);.      Vdbe
1eb60 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1eb70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
1eb80 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
1eb90 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
1eba0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1ebb0 70 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70  p==OP_Ne && jump
1ebc0 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e  IfNull!=SQLITE_N
1ebd0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65  ULLEQ);.      te
1ebe0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1ebf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1ec00 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1ec10 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1ec20 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ec30 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1ec40 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1ec50 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1ec60 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1ec70 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
1ec80 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1ec90 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
1eca0 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1ecb0 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
1ecc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1ecd0 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1ece0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1ecf0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ed00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ed10 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ed20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ed30 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1ed40 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
1ed50 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1ed60 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
1ed70 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ed80 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
1ed90 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
1eda0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1edb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1edc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1edd0 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1ede0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1edf0 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1ee00 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1ee10 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1ee20 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a  Expr, dest, 1, j
1ee30 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1ee40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1ee50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ee60 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1ee70 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1ee80 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1ee90 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1eea0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1eeb0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1eec0 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
1eed0 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
1eee0 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
1eef0 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1ef00 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1ef10 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
1ef20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1ef30 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1ef40 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
1ef50 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ef60 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46  Label(v, destIfF
1ef70 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alse);.      bre
1ef80 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1ef90 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1efa0 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41 6c        if( exprAl
1efb0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
1efc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1efd0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64 65  e3VdbeGoto(v, de
1efe0 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st);.      }else
1eff0 20 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46   if( exprAlwaysF
1f000 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20  alse(pExpr) ){. 
1f010 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20         /* No-op 
1f020 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
1f030 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
1f040 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1f050 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1f060 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f070 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f080 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp3(v, OP_If, 
1f090 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  r1, dest, jumpIf
1f0a0 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20  Null!=0);.      
1f0b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1f0c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f0d0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
1f0e0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1f0f0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f100 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1f110 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f120 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
1f130 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1f140 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1f150 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1f160 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1f170 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a   regFree2);  .}.
1f180 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1f190 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65  code for a boole
1f1a0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75  an expression su
1f1b0 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69  ch that a jump i
1f1c0 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  s made.** to the
1f1d0 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66   label "dest" if
1f1e0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1f1f0 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65  is false but exe
1f200 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
1f210 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
1f220 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
1f230 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  ion is true..**.
1f240 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
1f250 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74  sion evaluates t
1f260 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20  o NULL (neither 
1f270 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20  true nor false) 
1f280 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20  then.** jump if 
1f290 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51  jumpIfNull is SQ
1f2a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1f2b0 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20  or fall through 
1f2c0 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a  if jumpIfNull.**
1f2d0 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73   is 0..*/.void s
1f2e0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1f2f0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1f300 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1f310 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1f320 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1f330 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1f340 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1f350 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1f360 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1f370 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1f380 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1f390 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1f3a0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1f3b0 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1f3c0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1f3d0 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
1f3e0 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66   /* Existence of
1f3f0 20 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79   VDBE checked by
1f400 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28   caller */.  if(
1f410 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72   pExpr==0 )    r
1f420 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65  eturn;..  /* The
1f430 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d   value of pExpr-
1f440 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72  >op and op are r
1f450 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  elated as follow
1f460 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1f470 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
1f480 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20          op.  ** 
1f490 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20        --------- 
1f4a0 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d           -------
1f4b0 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ---.  **       T
1f4c0 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20  K_ISNULL        
1f4d0 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a    OP_NotNull.  *
1f4e0 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55  *       TK_NOTNU
1f4f0 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73  LL         OP_Is
1f500 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20  Null.  **       
1f510 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20  TK_NE           
1f520 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20     OP_Eq.  **   
1f530 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20      TK_EQ       
1f540 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a         OP_Ne.  *
1f550 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20  *       TK_GT   
1f560 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65             OP_Le
1f570 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c  .  **       TK_L
1f580 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1f590 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Gt.  **       
1f5a0 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20  TK_GE           
1f5b0 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20     OP_Lt.  **   
1f5c0 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20      TK_LT       
1f5d0 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a         OP_Ge.  *
1f5e0 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72  *.  ** For other
1f5f0 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72   values of pExpr
1f600 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65  ->op, op is unde
1f610 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64  fined and unused
1f620 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65  ..  ** The value
1f630 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20   of TK_ and OP_ 
1f640 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72  constants are ar
1f650 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74  ranged such that
1f660 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d   we.  ** can com
1f670 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67  pute the mapping
1f680 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65   above using the
1f690 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65   following expre
1f6a0 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65  ssion..  ** Asse
1f6b0 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61  rt()s verify tha
1f6c0 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  t the computatio
1f6d0 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  n is correct..  
1f6e0 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70  */.  op = ((pExp
1f6f0 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c  r->op+(TK_ISNULL
1f700 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55  &1))^1)-(TK_ISNU
1f710 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  LL&1);..  /* Ver
1f720 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67  ify correct alig
1f730 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64  nment of TK_ and
1f740 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20   OP_ constants. 
1f750 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45   */.  assert( pE
1f760 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55  xpr->op!=TK_ISNU
1f770 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74  LL || op==OP_Not
1f780 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
1f790 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f7a0 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f  NOTNULL || op==O
1f7b0 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73  P_IsNull );.  as
1f7c0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1f7d0 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_NE || op==OP
1f7e0 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Eq );.  assert(
1f7f0 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45   pExpr->op!=TK_E
1f800 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29  Q || op==OP_Ne )
1f810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1f820 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20  r->op!=TK_LT || 
1f830 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61  op==OP_Ge );.  a
1f840 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1f850 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_LE || op==O
1f860 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Gt );.  assert
1f870 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1f880 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20  GT || op==OP_Le 
1f890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1f8a0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  pr->op!=TK_GE ||
1f8b0 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20   op==OP_Lt );.. 
1f8c0 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1f8d0 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
1f8e0 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74  K_AND: {.      t
1f8f0 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1f900 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1f910 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1f920 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
1f930 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
1f940 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f950 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1f960 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
1f970 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1f980 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1f990 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1f9a0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f9b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1f9c0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1f9d0 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1f9e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f9f0 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1fa00 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
1fa10 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1fa20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1fa30 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1fa40 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1fa50 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1fa60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1fa70 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  , d2, jumpIfNull
1fa80 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  ^SQLITE_JUMPIFNU
1fa90 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
1faa0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1fab0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1fac0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1fad0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1fae0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1faf0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1fb00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1fb10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
1fb20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fb30 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1fb40 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1fb50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fb60 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
1fb70 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1fb80 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1fb90 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1fba0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1fbb0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1fbc0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1fbd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fbe0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
1fbf0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
1fc00 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  T:.      testcas
1fc10 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
1fc20 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _IS );.      tes
1fc30 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
1fc40 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
1fc50 20 20 20 20 6f 70 20 3d 20 28 70 45 78 70 72 2d      op = (pExpr-
1fc60 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b  >op==TK_IS) ? TK
1fc70 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b 0a 20 20 20  _NE : TK_EQ;.   
1fc80 20 20 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20     jumpIfNull = 
1fc90 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20  SQLITE_NULLEQ;. 
1fca0 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
1fcb0 75 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b  u */.    case TK
1fcc0 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1fcd0 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1fce0 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1fcf0 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1fd00 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1fd10 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
1fd20 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1fd30 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1fd40 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1fd50 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1fd60 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1fd70 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1fd80 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1fd90 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1fda0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1fdb0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1fdc0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1fdd0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1fde0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1fdf0 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1fe00 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1fe10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1fe20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1fe30 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1fe40 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1fe50 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1fe60 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1fe70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1fe80 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1fe90 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1fea0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1feb0 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1fec0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1fed0 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1fee0 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1fef0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ff00 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1ff10 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1ff20 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1ff30 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1ff40 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1ff50 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1ff60 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
1ff70 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
1ff80 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1ff90 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ffa0 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26  (v, op==OP_Eq &&
1ffb0 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c   jumpIfNull!=SQL
1ffc0 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1ffd0 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1ffe0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26  f(v, op==OP_Eq &
1fff0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  & jumpIfNull==SQ
20000 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
20010 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
20020 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
20030 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20  se(op==OP_Ne);. 
20040 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
20050 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65  eIf(v, op==OP_Ne
20060 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d   && jumpIfNull!=
20070 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
20080 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
20090 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e  geIf(v, op==OP_N
200a0 65 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  e && jumpIfNull=
200b0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b  =SQLITE_NULLEQ);
200c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
200d0 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
200e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
200f0 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20110 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
20120 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
20130 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
20140 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20150 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20160 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
20170 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
20180 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20190 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c  ddOp2(v, op, r1,
201a0 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65   dest);.      te
201b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
201c0 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64 62 65 43  SNULL );   VdbeC
201d0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
201e0 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20  =TK_ISNULL);.   
201f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
20200 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 20 20  =TK_NOTNULL );  
20210 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
20220 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c  , op==TK_NOTNULL
20230 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20240 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
20250 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20260 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20270 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
20280 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
20290 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
202a0 20 20 20 65 78 70 72 43 6f 64 65 42 65 74 77 65     exprCodeBetwe
202b0 65 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  en(pParse, pExpr
202c0 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75 6d 70 49  , dest, 0, jumpI
202d0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
202e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
202f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
20300 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
20310 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
20320 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 29  if( jumpIfNull )
20330 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20340 33 45 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72  3ExprCodeIN(pPar
20350 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20360 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65   dest);.      }e
20370 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
20380 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d 20 73 71   destIfNull = sq
20390 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
203a0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  el(v);.        s
203b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e  qlite3ExprCodeIN
203c0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
203d0 64 65 73 74 2c 20 64 65 73 74 49 66 4e 75 6c 6c  dest, destIfNull
203e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
203f0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
20400 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
20410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
20430 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
20440 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
20450 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 70 45  prAlwaysFalse(pE
20460 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
20470 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
20480 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  v, dest);.      
20490 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41 6c  }else if( exprAl
204a0 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29 20  waysTrue(pExpr) 
204b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  ){.        /* no
204c0 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  -op */.      }el
204d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d  se{.        r1 =
204e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
204f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20500 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  pr, &regFree1);.
20510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20520 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
20530 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74 2c  IfNot, r1, dest,
20540 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b   jumpIfNull!=0);
20550 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
20560 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
20570 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
20580 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
20590 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
205a0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
205b0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
205c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
205d0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
205e0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
205f0 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65  Free1);.  sqlite
20600 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
20610 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32  pParse, regFree2
20620 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65  );.}../*.** Like
20630 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
20640 6c 73 65 28 29 20 65 78 63 65 70 74 20 74 68 61  lse() except tha
20650 74 20 61 20 63 6f 70 79 20 69 73 20 6d 61 64 65  t a copy is made
20660 20 6f 66 20 70 45 78 70 72 20 62 65 66 6f 72 65   of pExpr before
20670 0a 2a 2a 20 63 6f 64 65 20 67 65 6e 65 72 61 74  .** code generat
20680 69 6f 6e 2c 20 61 6e 64 20 74 68 61 74 20 63 6f  ion, and that co
20690 70 79 20 69 73 20 64 65 6c 65 74 65 64 20 61 66  py is deleted af
206a0 74 65 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ter code generat
206b0 69 6f 6e 2e 20 54 68 69 73 0a 2a 2a 20 65 6e 73  ion. This.** ens
206c0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6f 72  ures that the or
206d0 69 67 69 6e 61 6c 20 70 45 78 70 72 20 69 73 20  iginal pExpr is 
206e0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f  unchanged..*/.vo
206f0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
20700 46 61 6c 73 65 44 75 70 28 50 61 72 73 65 20 2a  FalseDup(Parse *
20710 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
20720 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 69 6e  xpr, int dest,in
20730 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
20740 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20750 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
20760 72 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  r *pCopy = sqlit
20770 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
20780 78 70 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  xpr, 0);.  if( d
20790 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
207a0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
207b0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
207c0 72 73 65 2c 20 70 43 6f 70 79 2c 20 64 65 73 74  rse, pCopy, dest
207d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
207e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
207f0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 70 79  Delete(db, pCopy
20800 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  );.}.../*.** Do 
20810 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
20820 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
20830 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
20840 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
20850 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
20860 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
20870 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
20880 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
20890 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
208a0 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
208b0 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
208c0 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
208d0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
208e0 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
208f0 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
20900 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
20910 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
20920 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
20930 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
20940 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
20950 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
20960 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
20970 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
20980 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
20990 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
209a0 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
209b0 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
209c0 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
209d0 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
209e0 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
209f0 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
20a00 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
20a10 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
20a20 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
20a30 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
20a40 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
20a50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
20a60 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
20a70 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
20a80 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
20a90 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
20aa0 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
20ab0 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
20ac0 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
20ad0 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
20ae0 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
20af0 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
20b00 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
20b10 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
20b20 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
20b30 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
20b40 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
20b50 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
20b60 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
20b70 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
20b80 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
20b90 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
20ba0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
20bb0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
20bc0 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
20bd0 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
20be0 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
20bf0 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
20c00 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
20c10 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
20c20 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
20c30 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
20c40 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
20c50 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
20c60 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
20c70 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
20c80 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
20c90 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
20ca0 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
20cb0 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
20cc0 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
20cd0 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
20ce0 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
20cf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
20d00 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
20d10 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
20d20 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
20d30 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
20d40 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
20d50 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
20d60 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
20d70 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
20d80 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
20d90 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
20da0 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
20db0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20dc0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
20dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
20de0 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
20df0 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
20e00 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
20e10 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
20e20 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54  A->pLeft, pB, iT
20e30 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
20e40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20e50 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
20e60 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
20e70 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
20e80 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  pA, pB->pLeft, i
20e90 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
20ea0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20eb0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
20ec0 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
20ed0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d  TK_COLUMN && pA-
20ee0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
20ef0 4d 4e 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b  MN && pA->u.zTok
20f00 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  en ){.    if( pA
20f10 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
20f20 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  N ){.      if( s
20f30 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 41  qlite3StrICmp(pA
20f40 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75  ->u.zToken,pB->u
20f50 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 20 72 65  .zToken)!=0 ) re
20f60 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 65 6c 73  turn 2;.    }els
20f70 65 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d  e if( strcmp(pA-
20f80 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
20f90 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
20fa0 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
20fb0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
20fc0 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
20fd0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
20fe0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
20ff0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
21000 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
21010 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
21020 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
21030 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
21040 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
21050 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
21060 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
21070 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21080 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21090 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
210a0 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
210b0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
210c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
210d0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
210e0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
210f0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
21100 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
21110 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
21120 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
21130 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
21140 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
21150 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63     if( ALWAYS((c
21160 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
21170 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 26  P_Reduced)==0) &
21180 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  & pA->op!=TK_STR
21190 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ING ){.      if(
211a0 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
211b0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
211c0 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 2;.      if( 
211d0 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e  pA->iTable!=pB->
211e0 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26  iTable .       &
211f0 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69  & (pA->iTable!=i
21200 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d  Tab || NEVER(pB-
21210 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72  >iTable>=0)) ) r
21220 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
21230 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21240 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
21250 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
21260 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20  ects.  Return 0 
21270 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e  if they are iden
21280 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f  tical and .** no
21290 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64  n-zero if they d
212a0 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79  iffer in any way
212b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73  ..**.** If any s
212c0 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20  ubelement of pB 
212d0 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d  has Expr.iTable=
212e0 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73  =(-1) then it is
212f0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63   allowed.** to c
21300 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20  ompare equal to 
21310 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c  an equivalent el
21320 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68  ement in pA with
21330 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54   Expr.iTable==iT
21340 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ab..**.** This r
21350 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74  outine might ret
21360 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72  urn non-zero for
21370 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72   equivalent Expr
21380 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f  Lists.  The.** o
21390 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20  nly consequence 
213a0 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64  will be disabled
213b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
213c0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
213d0 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20  e.** must never 
213e0 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
213f0 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a  two ExprList obj
21400 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72 65  ects are differe
21410 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66  nt, or.** a malf
21420 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  unction will res
21430 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  ult..**.** Two N
21440 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65  ULL pointers are
21450 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
21460 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74  e the same.  But
21470 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a   a NULL pointer.
21480 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65 72  ** always differ
21490 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c  s from a non-NUL
214a0 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  L pointer..*/.in
214b0 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  t sqlite3ExprLis
214c0 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73  tCompare(ExprLis
214d0 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20  t *pA, ExprList 
214e0 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a  *pB, int iTab){.
214f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
21500 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20  A==0 && pB==0 ) 
21510 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
21520 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29  pA==0 || pB==0 )
21530 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
21540 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e   pA->nExpr!=pB->
21550 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 31  nExpr ) return 1
21560 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
21570 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  A->nExpr; i++){.
21580 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 41      Expr *pExprA
21590 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70   = pA->a[i].pExp
215a0 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  r;.    Expr *pEx
215b0 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70  prB = pB->a[i].p
215c0 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41  Expr;.    if( pA
215d0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
215e0 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  !=pB->a[i].sortO
215f0 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b  rder ) return 1;
21600 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
21610 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70  ExprCompare(pExp
21620 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62  rA, pExprB, iTab
21630 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
21640 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
21650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
21660 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f  ue if we can pro
21670 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20  ve the pE2 will 
21680 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20 69  always be true i
21690 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65  f pE1 is.** true
216a0 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
216b0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d  if we cannot com
216c0 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20  plete the proof 
216d0 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a  or if pE2 might.
216e0 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78  ** be false.  Ex
216f0 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
21700 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20    pE1: x==5     
21710 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
21720 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
21730 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21740 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a   x>0        pE2:
21750 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20   x==5           
21760 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a    Result: false.
21770 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31  **     pE1: x=21
21780 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31         pE2: x=21
21790 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65 73   OR y=43     Res
217a0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
217b0 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20   pE1: x!=123    
217c0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
217d0 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
217e0 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
217f0 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20  x!=?1      pE2: 
21800 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
21810 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a   Result: true.**
21820 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e       pE1: x IS N
21830 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e  ULL  pE2: x IS N
21840 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c  OT NULL    Resul
21850 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20  t: false.**     
21860 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20  pE1: x IS ?2    
21870 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
21880 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61  LL    Reuslt: fa
21890 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63  lse.**.** When c
218a0 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55  omparing TK_COLU
218b0 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e  MN nodes between
218c0 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66   pE1 and pE2, if
218d0 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72   pE2 has.** Expr
218e0 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61  .iTable<0 then a
218f0 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75  ssume a table nu
21900 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69 54  mber given by iT
21910 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69  ab..**.** When i
21920 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20  n doubt, return 
21930 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e  false.  Returnin
21940 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69 76  g true might giv
21950 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  e a performance.
21960 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20  ** improvement. 
21970 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65   Returning false
21980 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 70   might cause a p
21990 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
219a0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20  tion, but.** it 
219b0 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65  will always give
219c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
219d0 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65  wer and is hence
219e0 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f   always safe..*/
219f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
21a00 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70 72  ImpliesExpr(Expr
21a10 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32   *pE1, Expr *pE2
21a20 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69  , int iTab){.  i
21a30 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
21a40 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20  mpare(pE1, pE2, 
21a50 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iTab)==0 ){.    
21a60 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21a70 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
21a80 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65  OR.   && (sqlite
21a90 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72  3ExprImpliesExpr
21aa0 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74  (pE1, pE2->pLeft
21ab0 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20 20  , iTab).        
21ac0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45       || sqlite3E
21ad0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
21ae0 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c  E1, pE2->pRight,
21af0 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20   iTab) ).  ){.  
21b00 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
21b10 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54    if( pE2->op==T
21b20 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20  K_NOTNULL.   && 
21b30 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21b40 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70  re(pE1->pLeft, p
21b50 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29  E2->pLeft, iTab)
21b60 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e  ==0.   && (pE1->
21b70 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26  op!=TK_ISNULL &&
21b80 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29   pE1->op!=TK_IS)
21b90 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
21ba0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
21bb0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20   0;.}../*.** An 
21bc0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
21bd0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
21be0 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20 74  ure is used by t
21bf0 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a  he tree walker.*
21c00 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72  * to count refer
21c10 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63  ences to table c
21c20 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72  olumns in the ar
21c30 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a  guments of an .*
21c40 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
21c50 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74  tion, in order t
21c60 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a  o implement the.
21c70 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  ** sqlite3Functi
21c80 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75 74  onThisSrc() rout
21c90 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53  ine..*/.struct S
21ca0 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c  rcCount {.  SrcL
21cb0 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20  ist *pSrc;   /* 
21cc0 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20 46  One particular F
21cd0 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ROM clause in a 
21ce0 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a  nested query */.
21cf0 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20    int nThis;    
21d00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21d10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
21d20 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73  lumns in pSrcLis
21d30 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65  t */.  int nOthe
21d40 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  r;      /* Numbe
21d50 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
21d60 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74  to columns in ot
21d70 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  her FROM clauses
21d80 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
21d90 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
21da0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
21db0 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74  columns..*/.stat
21dc0 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f  ic int exprSrcCo
21dd0 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  unt(Walker *pWal
21de0 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
21df0 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45  ){.  /* The NEVE
21e00 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e  R() on the secon
21e10 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75 73  d term is becaus
21e20 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  e sqlite3Functio
21e30 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a 20  nUsesThisSrc(). 
21e40 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61   ** is always ca
21e50 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69  lled before sqli
21e60 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
21e70 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20 73  gregates() and s
21e80 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f  o the.  ** TK_CO
21e90 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79  LUMNs have not y
21ea0 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  et been converte
21eb0 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  d into TK_AGG_CO
21ec0 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73  LUMN.  If.  ** s
21ed0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
21ee0 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20 75  esThisSrc() is u
21ef0 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  sed differently 
21f00 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  in the future, t
21f10 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20  he.  ** NEVER() 
21f20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
21f30 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
21f40 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
21f50 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28  COLUMN || NEVER(
21f60 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
21f70 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20  G_COLUMN) ){.   
21f80 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
21f90 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d  ct SrcCount *p =
21fa0 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63   pWalker->u.pSrc
21fb0 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69  Count;.    SrcLi
21fc0 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
21fd0 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 53 72 63  rc;.    int nSrc
21fe0 20 3d 20 70 53 72 63 20 3f 20 70 53 72 63 2d 3e   = pSrc ? pSrc->
21ff0 6e 53 72 63 20 3a 20 30 3b 0a 20 20 20 20 66 6f  nSrc : 0;.    fo
22000 72 28 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69  r(i=0; i<nSrc; i
22010 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
22020 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
22030 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
22040 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
22050 20 20 20 20 69 66 28 20 69 3c 6e 53 72 63 20 29      if( i<nSrc )
22060 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69 73  {.      p->nThis
22070 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
22080 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b 2b       p->nOther++
22090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
220a0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
220b0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  e;.}../*.** Dete
220c0 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66 20  rmine if any of 
220d0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  the arguments to
220e0 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63 74   the pExpr Funct
220f0 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  ion reference.**
22100 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74 75   pSrcList.  Retu
22110 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79 20  rn true if they 
22120 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72 6e  do.  Also return
22130 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75 6e   true if the fun
22140 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f 20  ction.** has no 
22150 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61 73  arguments or has
22160 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20 61   only constant a
22170 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75 72  rguments.  Retur
22180 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70 72  n false if pExpr
22190 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 63  .** references c
221a0 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20 63  olumns but not c
221b0 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65 73  olumns of tables
221c0 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c 69   found in pSrcLi
221d0 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
221e0 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
221f0 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78 70  isSrc(Expr *pExp
22200 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  r, SrcList *pSrc
22210 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  List){.  Walker 
22220 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 43  w;.  struct SrcC
22230 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73 65  ount cnt;.  asse
22240 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
22250 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
22260 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
22270 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
22280 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
22290 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b 0a  = exprSrcCount;.
222a0 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74 20    w.u.pSrcCount 
222b0 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70 53  = &cnt;.  cnt.pS
222c0 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20  rc = pSrcList;. 
222d0 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b 0a   cnt.nThis = 0;.
222e0 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20 30    cnt.nOther = 0
222f0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
22300 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78 70  xprList(&w, pExp
22310 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 72  r->x.pList);.  r
22320 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73 3e  eturn cnt.nThis>
22330 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72 3d  0 || cnt.nOther=
22340 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  =0;.}../*.** Add
22350 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
22360 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
22370 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20 52  aCol[] array.  R
22380 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
22390 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
223a0 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
223b0 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
223c0 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
223d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
223e0 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e  addAggInfoColumn
223f0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67  (sqlite3 *db, Ag
22400 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20  gInfo *pInfo){. 
22410 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d   int i;.  pInfo-
22420 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 41  >aCol = sqlite3A
22430 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
22440 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 20       db,.       
22450 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20 20  pInfo->aCol,.   
22460 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f      sizeof(pInfo
22470 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20 20  ->aCol[0]),.    
22480 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c 75     &pInfo->nColu
22490 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  mn,.       &i.  
224a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
224b0 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20      ../*.** Add 
224c0 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
224d0 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61   the pAggInfo->a
224e0 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20 52  Func[] array.  R
224f0 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
22500 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65 6c  of.** the new el
22510 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61  ement.  Return a
22520 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
22530 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
22540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22550 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 73  addAggInfoFunc(s
22560 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67 49  qlite3 *db, AggI
22570 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 69  nfo *pInfo){.  i
22580 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e 61  nt i;.  pInfo->a
22590 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41 72  Func = sqlite3Ar
225a0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
225b0 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20 20      db, .       
225c0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20 20  pInfo->aFunc,.  
225d0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
225e0 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20 20  o->aFunc[0]),.  
225f0 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46 75       &pInfo->nFu
22600 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20 20  nc,.       &i.  
22610 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  );.  return i;.}
22620 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73      ../*.** This
22630 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61 6c   is the xExprCal
22640 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65 65  lback for a tree
22650 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73 20   walker.  It is 
22660 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65  used to.** imple
22670 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  ment sqlite3Expr
22680 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
22690 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74 65  s().  See sqlite
226a0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
226b0 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61 64  egates.** for ad
226c0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
226d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
226e0 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
226f0 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57 61  gate(Walker *pWa
22700 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
22710 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  r){.  int i;.  N
22720 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
22730 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
22740 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
22750 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
22760 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
22770 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
22780 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f 20  List;.  AggInfo 
22790 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43 2d  *pAggInfo = pNC-
227a0 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73 77  >pAggInfo;..  sw
227b0 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
227c0 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
227d0 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  GG_COLUMN:.    c
227e0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
227f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22800 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
22810 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
22820 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
22830 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
22840 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43 68  N );.      /* Ch
22850 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
22860 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20 6f  e column is in o
22870 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ne of the tables
22880 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 20   in the FROM.   
22890 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20     ** clause of 
228a0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
228b0 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ery */.      if(
228c0 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73 74   ALWAYS(pSrcList
228d0 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
228e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
228f0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53 72  tem *pItem = pSr
22900 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  cList->a;.      
22910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
22920 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
22930 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
22940 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
22950 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b 0a  Info_col *pCol;.
22960 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22970 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
22980 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
22990 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
229a0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
229b0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
229c0 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e==pItem->iCurso
229d0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
229e0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
229f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
22a00 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72 20  eans that pExpr 
22a10 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
22a20 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22a30 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
22a40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
22a50 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  he aggregate que
22a60 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  ry.  .          
22a70 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 20    **.           
22a80 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74 72   ** Make an entr
22a90 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
22aa0 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   in pAggInfo->aC
22ab0 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20 20  ol[] if there.  
22ac0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
22ad0 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68 65  not an entry the
22ae0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
22af0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
22b00 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
22b10 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d            pCol =
22b20 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b   pAggInfo->aCol;
22b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
22b40 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66 6f  (k=0; k<pAggInfo
22b50 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c 20  ->nColumn; k++, 
22b60 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
22b70 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
22b80 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
22b90 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22bb0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
22bc0 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
22be0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
22bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22c00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
22c10 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  ( (k>=pAggInfo->
22c20 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20 20  nColumn).       
22c30 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61 64        && (k = ad
22c40 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28 70  dAggInfoColumn(p
22c50 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49  Parse->db, pAggI
22c60 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20 20  nfo))>=0 .      
22c70 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
22c80 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70         pCol = &p
22c90 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b 5d  AggInfo->aCol[k]
22ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22cb0 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45 78  pCol->pTab = pEx
22cc0 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
22cd0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 54          pCol->iT
22ce0 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54  able = pExpr->iT
22cf0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
22d00 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d      pCol->iColum
22d10 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
22d20 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn;.            
22d30 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20 2b    pCol->iMem = +
22d40 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22d60 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e  l->iSorterColumn
22d70 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
22d80 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70 72       pCol->pExpr
22d90 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
22da0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 67          if( pAgg
22db0 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20 29  Info->pGroupBy )
22dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22dd0 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20 20    int j, n;.    
22de0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
22df0 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67 67  List *pGB = pAgg
22e00 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b 0a  Info->pGroupBy;.
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
22e30 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70 47  item *pTerm = pG
22e40 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20 20  B->a;.          
22e50 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e 6e        n = pGB->n
22e60 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
22e70 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
22e80 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  <n; j++, pTerm++
22e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22ea0 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
22eb0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 43  if( pE->op==TK_C
22ee0 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54 61  OLUMN && pE->iTa
22ef0 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  ble==pExpr->iTab
22f00 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  le &&.          
22f10 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d 3e              pE->
22f20 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e  iColumn==pExpr->
22f30 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22f50 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
22f60 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
22f70 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
22f80 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
22f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22fc0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
22fd0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c 30  >iSorterColumn<0
22fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22ff0 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
23000 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49 6e  rColumn = pAggIn
23010 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75  fo->nSortingColu
23020 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  mn++;.          
23030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23040 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23050 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77 20  /* There is now 
23060 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45 78  an entry for pEx
23070 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e  pr in pAggInfo->
23080 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a 20  aCol[] (either. 
23090 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65             ** be
230a0 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68 65  cause it was the
230b0 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65 63  re before or bec
230c0 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72 65  ause we just cre
230d0 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20 20  ated it)..      
230e0 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72 74        ** Convert
230f0 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62 65   the pExpr to be
23100 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   a TK_AGG_COLUMN
23110 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74 68   referring to th
23120 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  at.            *
23130 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  * pAggInfo->aCol
23140 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20 20  [] entry..      
23150 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23160 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
23170 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23180 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
23190 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
231a0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
231b0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nfo;.           
231c0 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
231d0 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20  AGG_COLUMN;.    
231e0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
231f0 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20 20  Agg = (i16)k;.  
23200 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23210 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
23220 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54 61  endif pExpr->iTa
23230 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72  ble==pItem->iCur
23240 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  sor */.        }
23250 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76 65   /* end loop ove
23260 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  r pSrcList */.  
23270 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
23280 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
23290 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
232a0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
232b0 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
232c0 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e 41  ncFlags & NC_InA
232d0 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20 20  ggFunc)==0.     
232e0 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77 61    && pWalker->wa
232f0 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70 72  lkerDepth==pExpr
23300 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a 20  ->op2.      ){. 
23310 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
23320 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72 20  to see if pExpr 
23330 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
23340 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65 67  f another aggreg
23350 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ate .        ** 
23360 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
23370 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
23380 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75  pAggInfo structu
23390 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  re.        */.  
233a0 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
233b0 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65 6d  Info_func *pItem
233c0 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
233d0 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  nc;.        for(
233e0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
233f0 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49 74  >nFunc; i++, pIt
23400 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  em++){.         
23410 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
23420 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e 70  Compare(pItem->p
23430 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31 29  Expr, pExpr, -1)
23440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23470 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70          if( i>=p
23480 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 29  AggInfo->nFunc )
23490 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  {.          /* p
234a0 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61 6c  Expr is original
234b0 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65 6e  .  Make a new en
234c0 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  try in pAggInfo-
234d0 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20 20  >aFunc[].       
234e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
234f0 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
23500 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  rse->db);.      
23510 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49 6e      i = addAggIn
23520 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e 64  foFunc(pParse->d
23530 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20 20  b, pAggInfo);.  
23540 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 30          if( i>=0
23550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23560 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
23570 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23580 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
235a0 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  em = &pAggInfo->
235b0 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20  aFunc[i];.      
235c0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
235d0 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
235e0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
235f0 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
23600 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
23610 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23620 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
23630 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
23640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
23650 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71 6c  tem->pFunc = sql
23660 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
23670 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23690 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
236a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
236b0 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e 70 4c       pExpr->x.pL
236c0 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78 2e 70  ist ? pExpr->x.p
236d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
236e0 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
236f0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
23700 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74  >flags & EP_Dist
23710 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  inct ){.        
23720 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 44 69        pItem->iDi
23730 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
23740 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
23750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23760 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
23770 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
23780 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
237a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
237b0 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69 6e 74  Make pExpr point
237c0 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69   to the appropri
237d0 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  ate pAggInfo->aF
237e0 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20 20 20  unc[] entry.    
237f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
23800 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23810 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23820 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
23830 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
23840 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
23850 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
23860 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 20  NoReduce);.     
23870 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
23880 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20 20 20   (i16)i;.       
23890 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f   pExpr->pAggInfo
238a0 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20   = pAggInfo;.   
238b0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
238c0 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Prune;.      }el
238d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
238e0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
238f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23900 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
23910 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74  Continue;.}.stat
23920 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67  ic int analyzeAg
23930 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
23940 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
23950 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
23960 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
23970 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72 29 3b  AMETER(pWalker);
23980 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23990 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  TER(pSelect);.  
239a0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
239b0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  nue;.}../*.** An
239c0 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70 72 20  alyze the pExpr 
239d0 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69  expression looki
239e0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
239f0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a   functions and.*
23a00 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20  * for variables 
23a10 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
23a20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e 66 6f  added to AggInfo
23a30 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70 4e 43   object that pNC
23a40 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20 70 6f  ->pAggInfo.** po
23a50 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69 74 69  ints to.  Additi
23a60 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61 72 65  onal entries are
23a70 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41 67 67   made on the Agg
23a80 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73 0a 2a  Info object as.*
23a90 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  * necessary..**.
23aa0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23ab0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
23ac0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
23ad0 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
23ae0 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
23af0 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  by sqlite3Resolv
23b00 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2f  eExprNames()..*/
23b10 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
23b20 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
23b30 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  es(NameContext *
23b40 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pNC, Expr *pExpr
23b50 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
23b60 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73   memset(&w, 0, s
23b70 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78  izeof(w));.  w.x
23b80 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 61  ExprCallback = a
23b90 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 3b  nalyzeAggregate;
23ba0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
23bb0 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
23bc0 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65 63 74  gregatesInSelect
23bd0 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
23be0 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
23bf0 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
23c00 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
23c10 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 7d  pr(&w, pExpr);.}
23c20 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73 71 6c  ../*.** Call sql
23c30 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
23c40 67 67 72 65 67 61 74 65 73 28 29 20 66 6f 72 20  ggregates() for 
23c50 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
23c60 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72 65 73   in an.** expres
23c70 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65 74 75  sion list.  Retu
23c80 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
23c90 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   errors..**.** I
23ca0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 66 6f  f an error is fo
23cb0 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79 73 69  und, the analysi
23cc0 73 20 69 73 20 63 75 74 20 73 68 6f 72 74 2e 0a  s is cut short..
23cd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23ce0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
23cf0 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70  t(NameContext *p
23d00 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  NC, ExprList *pL
23d10 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74 20 45  ist){.  struct E
23d20 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
23d30 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
23d40 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
23d50 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
23d60 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
23d70 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
23d80 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
23d90 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
23da0 65 41 67 67 72 65 67 61 74 65 73 28 70 4e 43 2c  eAggregates(pNC,
23db0 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
23dc0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
23dd0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 73 69  ** Allocate a si
23de0 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73 74 65  ngle new registe
23df0 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68 6f 6c  r for use to hol
23e00 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65 64 69  d some intermedi
23e10 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 69  ate result..*/.i
23e20 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d  nt sqlite3GetTem
23e30 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
23e40 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  se){.  if( pPars
23e50 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30 20 29  e->nTempReg==0 )
23e60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 2b 70  {.    return ++p
23e70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 7d  Parse->nMem;.  }
23e80 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
23e90 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70 50 61  ->aTempReg[--pPa
23ea0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d 3b 0a  rse->nTempReg];.
23eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
23ec0 61 74 65 20 61 20 72 65 67 69 73 74 65 72 2c 20  ate a register, 
23ed0 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62 6c 65  making available
23ee0 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72 20 73   for reuse for s
23ef0 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 75 72  ome other.** pur
23f00 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  pose..**.** If a
23f10 20 72 65 67 69 73 74 65 72 20 69 73 20 63 75 72   register is cur
23f20 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75 73 65  rently being use
23f30 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d by the column 
23f40 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  cache, then.** t
23f50 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20  he deallocation 
23f60 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
23f70 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  l the column cac
23f80 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65  he line that use
23f90 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73 74 65  s.** the registe
23fa0 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c 65 2e  r becomes stale.
23fb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23fc0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 50  ReleaseTempReg(P
23fd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
23fe0 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28 20 69  t iReg){.  if( i
23ff0 52 65 67 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Reg && pParse->n
24000 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a  TempReg<ArraySiz
24010 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  e(pParse->aTempR
24020 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eg) ){.    int i
24030 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79 43 6f  ;.    struct yCo
24040 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20 20 66  lCache *p;.    f
24050 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
24060 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
24070 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
24080 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
24090 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d     if( p->iReg==
240a0 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20  iReg ){.        
240b0 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31 3b 0a  p->tempReg = 1;.
240c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
240d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
240e0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
240f0 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
24100 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b 0a 20  Reg++] = iReg;. 
24110 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
24120 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f 63 61  cate or dealloca
24130 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20 6e 52  te a block of nR
24140 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  eg consecutive r
24150 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e 74 20  egisters.*/.int 
24160 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
24170 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  nge(Parse *pPars
24180 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20  e, int nReg){.  
24190 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20 3d 20  int i, n;.  i = 
241a0 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65  pParse->iRangeRe
241b0 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  g;.  n = pParse-
241c0 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20 69 66  >nRangeReg;.  if
241d0 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20 20 20  ( nReg<=n ){.   
241e0 20 61 73 73 65 72 74 28 20 21 75 73 65 64 41 73   assert( !usedAs
241f0 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50 61 72  ColumnCache(pPar
24200 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20 29 3b  se, i, i+n-1) );
24210 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61  .    pParse->iRa
24220 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67 3b 0a  ngeReg += nReg;.
24230 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
24240 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b 0a 20  geReg -= nReg;. 
24250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20 3d 20   }else{.    i = 
24260 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
24270 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
24280 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a 20 20   += nReg;.  }.  
24290 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f 69 64  return i;.}.void
242a0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
242b0 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
242c0 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
242d0 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 73  , int nReg){.  s
242e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 52  qlite3ExprCacheR
242f0 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 52  emove(pParse, iR
24300 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69 66 28  eg, nReg);.  if(
24310 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e 6e 52   nReg>pParse->nR
24320 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20 20 70  angeReg ){.    p
24330 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
24340 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61   = nReg;.    pPa
24350 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 3d  rse->iRangeReg =
24360 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   iReg;.  }.}../*
24370 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74 65 6d  .** Mark all tem
24380 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
24390 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76 61 69   as being unavai
243a0 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 2e  lable for reuse.
243b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
243c0 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
243d0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
243e0 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d  {.  pParse->nTem
243f0 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50 61 72  pReg = 0;.  pPar
24400 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
24410 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69  0;.}../*.** Vali
24420 64 61 74 65 20 74 68 61 74 20 6e 6f 20 74 65 6d  date that no tem
24430 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
24440 66 61 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65  falls within the
24450 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 69 46 69   range of.** iFi
24460 72 73 74 2e 2e 69 4c 61 73 74 2c 20 69 6e 63 6c  rst..iLast, incl
24470 75 73 69 76 65 2e 20 20 54 68 69 73 20 72 6f 75  usive.  This rou
24480 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24490 6c 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 73  l from within as
244a0 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d  sert().** statem
244b0 65 6e 74 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ents..*/.#ifdef 
244c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74  SQLITE_DEBUG.int
244d0 20 73 71 6c 69 74 65 33 4e 6f 54 65 6d 70 73 49   sqlite3NoTempsI
244e0 6e 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50  nRange(Parse *pP
244f0 61 72 73 65 2c 20 69 6e 74 20 69 46 69 72 73 74  arse, int iFirst
24500 2c 20 69 6e 74 20 69 4c 61 73 74 29 7b 0a 20 20  , int iLast){.  
24510 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 50 61  int i;.  if( pPa
24520 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3e 30  rse->nRangeReg>0
24530 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
24540 52 61 6e 67 65 52 65 67 2b 70 50 61 72 73 65 2d  RangeReg+pParse-
24550 3e 6e 52 61 6e 67 65 52 65 67 3c 69 4c 61 73 74  >nRangeReg<iLast
24560 0a 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 69  .   && pParse->i
24570 52 61 6e 67 65 52 65 67 3e 3d 69 46 69 72 73 74  RangeReg>=iFirst
24580 0a 20 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  .  ){.     retur
24590 6e 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 0;.  }.  for(i
245a0 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54  =0; i<pParse->nT
245b0 65 6d 70 52 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  empReg; i++){.  
245c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 54    if( pParse->aT
245d0 65 6d 70 52 65 67 5b 69 5d 3e 3d 69 46 69 72 73  empReg[i]>=iFirs
245e0 74 20 26 26 20 70 50 61 72 73 65 2d 3e 61 54 65  t && pParse->aTe
245f0 6d 70 52 65 67 5b 69 5d 3c 3d 69 4c 61 73 74 20  mpReg[i]<=iLast 
24600 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
24610 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
24620 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
24630 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
24640 47 20 2a 2f 0a                                   G */.