/ Hex Artifact Content
Login

Artifact 21b153e1046c624e9387a17d3261f69b461e700c:


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 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
3b70: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
3b80: 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
3b90: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30  rt( pToken->z!=0
3ba0: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 30   || pToken->n==0
3bb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
3bc0: 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 6d 65 6d 63  pToken->n ) memc
3bd0: 70 79 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65  py(pNew->u.zToke
3be0: 6e 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 54  n, pToken->z, pT
3bf0: 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  oken->n);.      
3c00: 20 20 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e    pNew->u.zToken
3c10: 5b 70 54 6f 6b 65 6e 2d 3e 6e 5d 20 3d 20 30 3b  [pToken->n] = 0;
3c20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65 71  .        if( deq
3c30: 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 49  uote && sqlite3I
3c40: 73 71 75 6f 74 65 28 70 4e 65 77 2d 3e 75 2e 7a  squote(pNew->u.z
3c50: 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20  Token[0]) ){.   
3c60: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
3c70: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22  >u.zToken[0]=='"
3c80: 27 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  ' ) pNew->flags 
3c90: 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b  |= EP_DblQuoted;
3ca0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3cb0: 65 33 44 65 71 75 6f 74 65 28 70 4e 65 77 2d 3e  e3Dequote(pNew->
3cc0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
3cd0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3ce0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
3cf0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
3d00: 20 20 20 70 4e 65 77 2d 3e 6e 48 65 69 67 68 74     pNew->nHeight
3d10: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20   = 1;.#endif  . 
3d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3d30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
3d40: 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73  ate a new expres
3d50: 73 69 6f 6e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  sion node from a
3d60: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64   zero-terminated
3d70: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 0a   token that has.
3d80: 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
3d90: 64 65 71 75 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70  dequoted..*/.Exp
3da0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 0a  r *sqlite3Expr(.
3db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
3dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
3dd0: 64 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 44  dle for sqlite3D
3de0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29 20 28 6d  bMallocZero() (m
3df0: 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20  ay be null) */. 
3e00: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
3e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
3e20: 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f  ession opcode */
3e30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3e40: 54 6f 6b 65 6e 20 20 20 20 20 20 2f 2a 20 54 6f  Token      /* To
3e50: 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 4d  ken argument.  M
3e60: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
3e70: 29 7b 0a 20 20 54 6f 6b 65 6e 20 78 3b 0a 20 20  ){.  Token x;.  
3e80: 78 2e 7a 20 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20  x.z = zToken;.  
3e90: 78 2e 6e 20 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73  x.n = zToken ? s
3ea0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3eb0: 54 6f 6b 65 6e 29 20 3a 20 30 3b 0a 20 20 72 65  Token) : 0;.  re
3ec0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
3ed0: 41 6c 6c 6f 63 28 64 62 2c 20 6f 70 2c 20 26 78  Alloc(db, op, &x
3ee0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , 0);.}../*.** A
3ef0: 74 74 61 63 68 20 73 75 62 74 72 65 65 73 20 70  ttach subtrees p
3f00: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
3f10: 74 6f 20 74 68 65 20 45 78 70 72 20 6e 6f 64 65  to the Expr node
3f20: 20 70 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66   pRoot..**.** If
3f30: 20 70 52 6f 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61   pRoot==NULL tha
3f40: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 20 6d  t means that a m
3f50: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3f60: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
3f70: 72 65 64 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20  red..** In that 
3f80: 63 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  case, delete the
3f90: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
3fa0: 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2f 0a 76  and pRight..*/.v
3fb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41  oid sqlite3ExprA
3fc0: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 0a 20  ttachSubtrees(. 
3fd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
3fe0: 45 78 70 72 20 2a 70 52 6f 6f 74 2c 0a 20 20 45  Expr *pRoot,.  E
3ff0: 78 70 72 20 2a 70 4c 65 66 74 2c 0a 20 20 45 78  xpr *pLeft,.  Ex
4000: 70 72 20 2a 70 52 69 67 68 74 0a 29 7b 0a 20 20  pr *pRight.){.  
4010: 69 66 28 20 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( pRoot==0 ){.
4020: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4030: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4040: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
4050: 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74 29  elete(db, pLeft)
4060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4070: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69 67  rDelete(db, pRig
4080: 68 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ht);.  }else{.  
4090: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
40a0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70 52 69        pRoot->pRi
40b0: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
40c0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
40d0: 20 7c 3d 20 45 50 5f 50 72 6f 70 61 67 61 74 65   |= EP_Propagate
40e0: 20 26 20 70 52 69 67 68 74 2d 3e 66 6c 61 67 73   & pRight->flags
40f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4100: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 70  pLeft ){.      p
4110: 52 6f 6f 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  Root->pLeft = pL
4120: 65 66 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74  eft;.      pRoot
4130: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 50 72  ->flags |= EP_Pr
4140: 6f 70 61 67 61 74 65 20 26 20 70 4c 65 66 74 2d  opagate & pLeft-
4150: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20  >flags;.    }.  
4160: 20 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28    exprSetHeight(
4170: 70 52 6f 6f 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pRoot);.  }.}../
4180: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
4190: 20 45 78 70 72 20 6e 6f 64 65 20 77 68 69 63 68   Expr node which
41a0: 20 6a 6f 69 6e 73 20 61 73 20 6d 61 6e 79 20 61   joins as many a
41b0: 73 20 74 77 6f 20 73 75 62 74 72 65 65 73 2e 0a  s two subtrees..
41c0: 2a 2a 0a 2a 2a 20 4f 6e 65 20 6f 72 20 62 6f 74  **.** One or bot
41d0: 68 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  h of the subtree
41e0: 73 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 20  s can be NULL.  
41f0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
4200: 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 45   to the new.** E
4210: 78 70 72 20 6e 6f 64 65 2e 20 20 4f 72 2c 20 69  xpr node.  Or, i
4220: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
4230: 63 63 75 72 73 2c 20 73 65 74 20 70 50 61 72 73  ccurs, set pPars
4240: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4250: 6c 65 64 2c 0a 2a 2a 20 66 72 65 65 20 74 68 65  led,.** free the
4260: 20 73 75 62 74 72 65 65 73 20 61 6e 64 20 72 65   subtrees and re
4270: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 45 78  turn NULL..*/.Ex
4280: 70 72 20 2a 73 71 6c 69 74 65 33 50 45 78 70 72  pr *sqlite3PExpr
4290: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42a0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
42b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
42c0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
42e0: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
42f0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66   */.  Expr *pLef
4300: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
4310: 20 4c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f   Left operand */
4320: 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c  .  Expr *pRight,
4330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
4340: 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  ght operand */. 
4350: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 54   const Token *pT
4360: 6f 6b 65 6e 20 20 20 20 20 2f 2a 20 41 72 67 75  oken     /* Argu
4370: 6d 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b  ment token */.){
4380: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 69 66  .  Expr *p;.  if
4390: 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 26 26 20  ( op==TK_AND && 
43a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
43b0: 29 7b 0a 20 20 20 20 2f 2a 20 54 61 6b 65 20 61  ){.    /* Take a
43c0: 64 76 61 6e 74 61 67 65 20 6f 66 20 73 68 6f 72  dvantage of shor
43d0: 74 2d 63 69 72 63 75 69 74 20 66 61 6c 73 65 20  t-circuit false 
43e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
43f0: 20 41 4e 44 20 2a 2f 0a 20 20 20 20 70 20 3d 20   AND */.    p = 
4400: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
4410: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65 66 74  Parse->db, pLeft
4420: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c  , pRight);.  }el
4430: 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  se{.    p = sqli
4440: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
4450: 72 73 65 2d 3e 64 62 2c 20 6f 70 20 26 20 54 4b  rse->db, op & TK
4460: 46 4c 47 5f 4d 41 53 4b 2c 20 70 54 6f 6b 65 6e  FLG_MASK, pToken
4470: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
4480: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
4490: 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ees(pParse->db, 
44a0: 70 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  p, pLeft, pRight
44b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  );.  }.  if( p )
44c0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
44d0: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50  prCheckHeight(pP
44e0: 61 72 73 65 2c 20 70 2d 3e 6e 48 65 69 67 68 74  arse, p->nHeight
44f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4500: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
4510: 70 53 65 6c 65 63 74 20 74 6f 20 74 68 65 20 45  pSelect to the E
4520: 78 70 72 2e 78 2e 70 53 65 6c 65 63 74 20 66 69  xpr.x.pSelect fi
4530: 65 6c 64 2e 20 20 4f 72 2c 20 69 66 20 70 45 78  eld.  Or, if pEx
4540: 70 72 20 69 73 20 4e 55 4c 4c 20 28 64 75 65 0a  pr is NULL (due.
4550: 2a 2a 20 64 6f 20 61 20 6d 65 6d 6f 72 79 20 61  ** do a memory a
4560: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
4570: 65 29 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  e) then delete t
4580: 68 65 20 70 53 65 6c 65 63 74 20 6f 62 6a 65 63  he pSelect objec
4590: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
45a0: 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
45b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
45c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 53 65 6c  Expr *pExpr, Sel
45d0: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
45e0: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
45f0: 20 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65    pExpr->x.pSele
4600: 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  ct = pSelect;.  
4610: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
4620: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
4630: 65 6c 65 63 74 7c 45 50 5f 53 75 62 71 75 65 72  elect|EP_Subquer
4640: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
4650: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
4660: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 70 45 78  lags(pParse, pEx
4670: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
4680: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
4690: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
46a0: 65 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ed );.    sqlite
46b0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
46c0: 61 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 65 63  arse->db, pSelec
46d0: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
46e0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
46f0: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 65 69  ion is always ei
4700: 74 68 65 72 20 54 52 55 45 20 6f 72 20 46 41 4c  ther TRUE or FAL
4710: 53 45 20 28 72 65 73 70 65 63 74 69 76 65 6c 79  SE (respectively
4720: 29 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ),.** then retur
4730: 6e 20 31 2e 20 20 49 66 20 6f 6e 65 20 63 61 6e  n 1.  If one can
4740: 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 74 68  not determine th
4750: 65 20 74 72 75 74 68 20 76 61 6c 75 65 20 6f 66  e truth value of
4760: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
4770: 6f 6e 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  on at compile-ti
4780: 6d 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  me return 0..**.
4790: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
47a0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 66 20  timization.  If 
47b0: 69 73 20 4f 4b 20 74 6f 20 72 65 74 75 72 6e 20  is OK to return 
47c0: 30 20 68 65 72 65 20 65 76 65 6e 20 69 66 0a 2a  0 here even if.*
47d0: 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * the expression
47e0: 20 72 65 61 6c 6c 79 20 69 73 20 61 6c 77 61 79   really is alway
47f0: 73 20 66 61 6c 73 65 20 6f 72 20 66 61 6c 73 65  s false or false
4800: 20 28 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69   (a false negati
4810: 76 65 29 2e 0a 2a 2a 20 42 75 74 20 69 74 20 69  ve)..** But it i
4820: 73 20 61 20 62 75 67 20 74 6f 20 72 65 74 75 72  s a bug to retur
4830: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
4840: 73 73 69 6f 6e 20 6d 69 67 68 74 20 68 61 76 65  ssion might have
4850: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 62 6f   different.** bo
4860: 6f 6c 65 61 6e 20 76 61 6c 75 65 73 20 69 6e 20  olean values in 
4870: 64 69 66 66 65 72 65 6e 74 20 63 69 72 63 75 6d  different circum
4880: 73 74 61 6e 63 65 73 20 28 61 20 66 61 6c 73 65  stances (a false
4890: 20 70 6f 73 69 74 69 76 65 2e 29 0a 2a 2a 0a 2a   positive.).**.*
48a0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  * Note that if t
48b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
48c0: 20 70 61 72 74 20 6f 66 20 63 6f 6e 64 69 74 69   part of conditi
48d0: 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a 2a 20 4c 45  onal for a.** LE
48e0: 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 77 65  FT JOIN, then we
48f0: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4900: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
4910: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
4920: 0a 2a 2a 20 69 73 20 69 74 20 74 72 75 65 20 6f  .** is it true o
4930: 72 20 66 61 6c 73 65 2c 20 73 6f 20 61 6c 77 61  r false, so alwa
4940: 79 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  ys return 0..*/.
4950: 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 41  static int exprA
4960: 6c 77 61 79 73 54 72 75 65 28 45 78 70 72 20 2a  lwaysTrue(Expr *
4970: 70 29 7b 0a 20 20 69 6e 74 20 76 20 3d 20 30 3b  p){.  int v = 0;
4980: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4990: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
49a0: 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20  mJoin) ) return 
49b0: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
49c0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
49d0: 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 30  , &v) ) return 0
49e0: 3b 0a 20 20 72 65 74 75 72 6e 20 76 21 3d 30 3b  ;.  return v!=0;
49f0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  .}.static int ex
4a00: 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28 45 78  prAlwaysFalse(Ex
4a10: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4a20: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4a30: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4a40: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
4a50: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
4a60: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
4a70: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
4a80: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
4a90: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ==0;.}../*.** Jo
4aa0: 69 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f  in two expressio
4ab0: 6e 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20  ns using an AND 
4ac0: 6f 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69  operator.  If ei
4ad0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
4ae0: 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e  is.** NULL, then
4af0: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
4b00: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
4b10: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20  n..**.** If one 
4b20: 73 69 64 65 20 6f 72 20 74 68 65 20 6f 74 68 65  side or the othe
4b30: 72 20 6f 66 20 74 68 65 20 41 4e 44 20 69 73 20  r of the AND is 
4b40: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 61 6c 73  known to be fals
4b50: 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 0a  e, then instead.
4b60: 2a 2a 20 6f 66 20 72 65 74 75 72 6e 69 6e 67 20  ** of returning 
4b70: 61 6e 20 41 4e 44 20 65 78 70 72 65 73 73 69 6f  an AND expressio
4b80: 6e 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  n, just return a
4b90: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
4ba0: 73 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 61 20 76  sion with.** a v
4bb0: 61 6c 75 65 20 6f 66 20 66 61 6c 73 65 2e 0a 2a  alue of false..*
4bc0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
4bd0: 78 70 72 41 6e 64 28 73 71 6c 69 74 65 33 20 2a  xprAnd(sqlite3 *
4be0: 64 62 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c  db, Expr *pLeft,
4bf0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
4c00: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
4c10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
4c20: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
4c30: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
4c40: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
4c50: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72    }else if( expr
4c60: 41 6c 77 61 79 73 46 61 6c 73 65 28 70 4c 65 66  AlwaysFalse(pLef
4c70: 74 29 20 7c 7c 20 65 78 70 72 41 6c 77 61 79 73  t) || exprAlways
4c80: 46 61 6c 73 65 28 70 52 69 67 68 74 29 20 29 7b  False(pRight) ){
4c90: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4ca0: 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 65 66 74  Delete(db, pLeft
4cb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
4cc0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 52 69  prDelete(db, pRi
4cd0: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4ce0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4cf0: 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  c(db, TK_INTEGER
4d00: 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b  , &sqlite3IntTok
4d10: 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a 20 20 7d 65  ens[0], 0);.  }e
4d20: 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  lse{.    Expr *p
4d30: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
4d40: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 41 4e  rAlloc(db, TK_AN
4d50: 44 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  D, 0, 0);.    sq
4d60: 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53  lite3ExprAttachS
4d70: 75 62 74 72 65 65 73 28 64 62 2c 20 70 4e 65 77  ubtrees(db, pNew
4d80: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4d90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4e 65  ;.    return pNe
4da0: 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w;.  }.}../*.** 
4db0: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
4dc0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
4dd0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
4de0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
4df0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
4e00: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
4e10: 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
4e20: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
4e30: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
4e40: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
4e50: 70 4e 65 77 3b 0a 20 20 73 71 6c 69 74 65 33 20  pNew;.  sqlite3 
4e60: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b  ;.  assert( pTok
4e80: 65 6e 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  en );.  pNew = s
4e90: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
4ea0: 64 62 2c 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 2c  db, TK_FUNCTION,
4eb0: 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 69   pToken, 1);.  i
4ec0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
4ed0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ee0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
4ef0: 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6d 65 6d  t); /* Avoid mem
4f00: 6f 72 79 20 6c 65 61 6b 20 77 68 65 6e 20 6d 61  ory leak when ma
4f10: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4f20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4f30: 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20    pNew->x.pList 
4f40: 3d 20 70 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  = pList;.  asser
4f50: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
4f60: 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49 73  rty(pNew, EP_xIs
4f70: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 73 71 6c  Select) );.  sql
4f80: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
4f90: 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65  tAndFlags(pParse
4fa0: 2c 20 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72  , pNew);.  retur
4fb0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
4fc0: 20 41 73 73 69 67 6e 20 61 20 76 61 72 69 61 62   Assign a variab
4fd0: 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61 6e 20  le number to an 
4fe0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4ff0: 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64 63 61  encodes a wildca
5000: 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 72 69  rd.** in the ori
5010: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
5020: 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c  ent.  .**.** Wil
5030: 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74 69 6e  dcards consistin
5040: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 22 3f  g of a single "?
5050: 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  " are assigned t
5060: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 74 69  he next sequenti
5070: 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 6e  al.** variable n
5080: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  umber..**.** Wil
5090: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
50a0: 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20 61 73  rm "?nnn" are as
50b0: 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d 62 65  signed the numbe
50c0: 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d 61 6b  r "nnn".  We mak
50d0: 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e 22 20  e.** sure "nnn" 
50e0: 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20 74 6f  is not too be to
50f0: 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61 6c 20   avoid a denial 
5100: 6f 66 20 73 65 72 76 69 63 65 20 61 74 74 61 63  of service attac
5110: 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 53 51  k when.** the SQ
5120: 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65  L statement come
5130: 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65 72 6e  s from an extern
5140: 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a  al source..**.**
5150: 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68   Wildcards of th
5160: 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 2c 20 22  e form ":aaa", "
5170: 40 61 61 61 22 2c 20 6f 72 20 22 24 61 61 61 22  @aaa", or "$aaa"
5180: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
5190: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
51a0: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
51b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
51c0: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
51d0: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
51e0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
51f0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
5200: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
5210: 65 71 75 65 6e 74 69 61 6c 20 76 61 72 69 61 62  equential variab
5220: 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  le number is.** 
5230: 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  assigned..*/.voi
5240: 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73  d sqlite3ExprAss
5250: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72  ignVarNumber(Par
5260: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
5270: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 71 6c 69   *pExpr){.  sqli
5280: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5290: 2d 3e 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ->db;.  const ch
52a0: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 45  ar *z;..  if( pE
52b0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
52c0: 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
52d0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
52e0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45  r, EP_IntValue|E
52f0: 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b  P_Reduced|EP_Tok
5300: 65 6e 4f 6e 6c 79 29 20 29 3b 0a 20 20 7a 20 3d  enOnly) );.  z =
5310: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5320: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30  ;.  assert( z!=0
5330: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 5b   );.  assert( z[
5340: 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 7a  0]!=0 );.  if( z
5350: 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [1]==0 ){.    /*
5360: 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65   Wildcard of the
5370: 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41 73 73 69   form "?".  Assi
5380: 67 6e 20 74 68 65 20 6e 65 78 74 20 76 61 72 69  gn the next vari
5390: 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
53a0: 20 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 3d     assert( z[0]=
53b0: 3d 27 3f 27 20 29 3b 0a 20 20 20 20 70 45 78 70  ='?' );.    pExp
53c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  r->iColumn = (yn
53d0: 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e  Var)(++pParse->n
53e0: 56 61 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Var);.  }else{. 
53f0: 20 20 20 79 6e 56 61 72 20 78 20 3d 20 30 3b 0a     ynVar x = 0;.
5400: 20 20 20 20 75 33 32 20 6e 20 3d 20 73 71 6c 69      u32 n = sqli
5410: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a  te3Strlen30(z);.
5420: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f      if( z[0]=='?
5430: 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  ' ){.      /* Wi
5440: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
5450: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
5460: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
5470: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
5480: 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74    ** use it as t
5490: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  he variable numb
54a0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  er */.      i64 
54b0: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4f 6b  i;.      int bOk
54c0: 20 3d 20 30 3d 3d 73 71 6c 69 74 65 33 41 74 6f   = 0==sqlite3Ato
54d0: 69 36 34 28 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e  i64(&z[1], &i, n
54e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  -1, SQLITE_UTF8)
54f0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5500: 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e  Column = x = (yn
5510: 56 61 72 29 69 3b 0a 20 20 20 20 20 20 74 65 73  Var)i;.      tes
5520: 74 63 61 73 65 28 20 69 3d 3d 30 20 29 3b 0a 20  tcase( i==0 );. 
5530: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
5540: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==1 );.      tes
5550: 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c  tcase( i==db->aL
5560: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5570: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
5580: 52 5d 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  R]-1 );.      te
5590: 73 74 63 61 73 65 28 20 69 3d 3d 64 62 2d 3e 61  stcase( i==db->a
55a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
55b0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
55c0: 45 52 5d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ER] );.      if(
55d0: 20 62 4f 6b 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c   bOk==0 || i<1 |
55e0: 7c 20 69 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  | i>db->aLimit[S
55f0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
5600: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a  ABLE_NUMBER] ){.
5610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5620: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5630: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
5640: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
5650: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
5660: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 4c            db->aL
5670: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
5680: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
5690: 52 5d 29 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  R]);.        x =
56a0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
56b0: 20 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e    if( i>pParse->
56c0: 6e 56 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nVar ){.        
56d0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 28  pParse->nVar = (
56e0: 69 6e 74 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20  int)i;.      }. 
56f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5700: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6c 69 6b  /* Wildcards lik
5710: 65 20 22 3a 61 61 61 22 2c 20 22 24 61 61 61 22  e ":aaa", "$aaa"
5720: 20 6f 72 20 22 40 61 61 61 22 2e 20 20 52 65 75   or "@aaa".  Reu
5730: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5740: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75  able.      ** nu
5750: 6d 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f  mber as the prio
5760: 72 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20  r appearance of 
5770: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f  the same name, o
5780: 72 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20  r if the name.  
5790: 20 20 20 20 2a 2a 20 68 61 73 20 6e 65 76 65 72      ** has never
57a0: 20 61 70 70 65 61 72 65 64 20 62 65 66 6f 72 65   appeared before
57b0: 2c 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  , reuse the same
57c0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
57d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
57e0: 79 6e 56 61 72 20 69 3b 0a 20 20 20 20 20 20 66  ynVar i;.      f
57f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
5800: 2d 3e 6e 7a 56 61 72 3b 20 69 2b 2b 29 7b 0a 20  ->nzVar; i++){. 
5810: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
5820: 65 2d 3e 61 7a 56 61 72 5b 69 5d 20 26 26 20 73  e->azVar[i] && s
5830: 74 72 63 6d 70 28 70 50 61 72 73 65 2d 3e 61 7a  trcmp(pParse->az
5840: 56 61 72 5b 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a  Var[i],z)==0 ){.
5850: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
5860: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 78 20 3d 20 28  >iColumn = x = (
5870: 79 6e 56 61 72 29 69 2b 31 3b 0a 20 20 20 20 20  ynVar)i+1;.     
5880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5890: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
58a0: 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78      if( x==0 ) x
58b0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
58c0: 6e 20 3d 20 28 79 6e 56 61 72 29 28 2b 2b 70 50  n = (ynVar)(++pP
58d0: 61 72 73 65 2d 3e 6e 56 61 72 29 3b 0a 20 20 20  arse->nVar);.   
58e0: 20 7d 0a 20 20 20 20 69 66 28 20 78 3e 30 20 29   }.    if( x>0 )
58f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 78 3e 70 50  {.      if( x>pP
5900: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20  arse->nzVar ){. 
5910: 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 3b         char **a;
5920: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 73 71 6c  .        a = sql
5930: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
5940: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
5950: 20 78 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29 29   x*sizeof(a[0]))
5960: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 3d  ;.        if( a=
5970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5980: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
5990: 6f 63 46 61 69 6c 65 64 20 29 3b 20 2f 2a 20 45  ocFailed ); /* E
59a0: 72 72 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68  rror reported th
59b0: 72 6f 75 67 68 20 6d 61 6c 6c 6f 63 46 61 69 6c  rough mallocFail
59c0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
59d0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
59e0: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
59f0: 2d 3e 61 7a 56 61 72 20 3d 20 61 3b 0a 20 20 20  ->azVar = a;.   
5a00: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 5b 70       memset(&a[p
5a10: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 5d 2c 20 30  Parse->nzVar], 0
5a20: 2c 20 28 78 2d 70 50 61 72 73 65 2d 3e 6e 7a 56  , (x-pParse->nzV
5a30: 61 72 29 2a 73 69 7a 65 6f 66 28 61 5b 30 5d 29  ar)*sizeof(a[0])
5a40: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
5a50: 65 2d 3e 6e 7a 56 61 72 20 3d 20 78 3b 0a 20 20  e->nzVar = x;.  
5a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5a70: 7a 5b 30 5d 21 3d 27 3f 27 20 7c 7c 20 70 50 61  z[0]!='?' || pPa
5a80: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 3d  rse->azVar[x-1]=
5a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
5aa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5ab0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d  pParse->azVar[x-
5ac0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  1]);.        pPa
5ad0: 72 73 65 2d 3e 61 7a 56 61 72 5b 78 2d 31 5d 20  rse->azVar[x-1] 
5ae0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
5af0: 75 70 28 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20  up(db, z, n);.  
5b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
5b10: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
5b20: 6e 45 72 72 20 26 26 20 70 50 61 72 73 65 2d 3e  nErr && pParse->
5b30: 6e 56 61 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  nVar>db->aLimit[
5b40: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
5b50: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29 7b  IABLE_NUMBER] ){
5b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5b70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
5b80: 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69 61  o many SQL varia
5b90: 62 6c 65 73 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bles");.  }.}../
5ba0: 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79  *.** Recursively
5bb0: 20 64 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65   delete an expre
5bc0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
5bd0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
5be0: 4e 4c 49 4e 45 20 76 6f 69 64 20 73 71 6c 69 74  NLINE void sqlit
5bf0: 65 33 45 78 70 72 44 65 6c 65 74 65 4e 4e 28 73  e3ExprDeleteNN(s
5c00: 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
5c10: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
5c20: 70 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 53 61 6e  p!=0 );.  /* San
5c30: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
5c40: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
5c50: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
5c60: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
5c70: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
5c80: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c90: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
5ca0: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
5cb0: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
5cc0: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5cd0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
5ce0: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
5cf0: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
5d00: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
5d10: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
5d20: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
5d30: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
5d40: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
5d50: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
5d60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
5d70: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
5d80: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5d90: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
5da0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
5db0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
5dc0: 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65  mToken) ) sqlite
5dd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
5de0: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66  .zToken);.    if
5df0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5e00: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5e10: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
5e20: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
5e30: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
5e40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5e50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
5e60: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
5e70: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
5e80: 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72  .  }.  if( !Expr
5e90: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5ea0: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
5eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5ec0: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  b, p);.  }.}.voi
5ed0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
5ee0: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
5ef0: 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28   Expr *p){.  if(
5f00: 20 70 20 29 20 73 71 6c 69 74 65 33 45 78 70 72   p ) sqlite3Expr
5f10: 44 65 6c 65 74 65 4e 4e 28 64 62 2c 20 70 29 3b  DeleteNN(db, p);
5f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5f30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5f40: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  ytes allocated f
5f50: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
5f60: 6e 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  n structure .** 
5f70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5f80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  rst argument. Th
5f90: 69 73 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65  is is always one
5fa0: 20 6f 66 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a   of EXPR_FULLSIZ
5fb0: 45 2c 0a 2a 2a 20 45 58 50 52 5f 52 45 44 55 43  E,.** EXPR_REDUC
5fc0: 45 44 53 49 5a 45 20 6f 72 20 45 58 50 52 5f 54  EDSIZE or EXPR_T
5fd0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 0a 2a 2f  OKENONLYSIZE..*/
5fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
5ff0: 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72 20  StructSize(Expr 
6000: 2a 70 29 7b 0a 20 20 69 66 28 20 45 78 70 72 48  *p){.  if( ExprH
6010: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6020: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 72 65  _TokenOnly) ) re
6030: 74 75 72 6e 20 45 58 50 52 5f 54 4f 4b 45 4e 4f  turn EXPR_TOKENO
6040: 4e 4c 59 53 49 5a 45 3b 0a 20 20 69 66 28 20 45  NLYSIZE;.  if( E
6050: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6060: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 20  , EP_Reduced) ) 
6070: 72 65 74 75 72 6e 20 45 58 50 52 5f 52 45 44 55  return EXPR_REDU
6080: 43 45 44 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  CEDSIZE;.  retur
6090: 6e 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3b  n EXPR_FULLSIZE;
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 75  .}../*.** The du
60b0: 70 65 64 45 78 70 72 2a 53 69 7a 65 28 29 20 72  pedExpr*Size() r
60c0: 6f 75 74 69 6e 65 73 20 65 61 63 68 20 72 65 74  outines each ret
60d0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
60e0: 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
60f0: 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20 61 20 63  .** to store a c
6100: 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73  opy of an expres
6110: 73 69 6f 6e 20 6f 72 20 65 78 70 72 65 73 73 69  sion or expressi
6120: 6f 6e 20 74 72 65 65 2e 20 20 54 68 65 79 20 64  on tree.  They d
6130: 69 66 66 65 72 20 69 6e 0a 2a 2a 20 68 6f 77 20  iffer in.** how 
6140: 6d 75 63 68 20 6f 66 20 74 68 65 20 74 72 65 65  much of the tree
6150: 20 69 73 20 6d 65 61 73 75 72 65 64 2e 0a 2a 2a   is measured..**
6160: 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45 78 70  .**     dupedExp
6170: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 20 20  rStructSize()   
6180: 20 20 53 69 7a 65 20 6f 66 20 6f 6e 6c 79 20 74    Size of only t
6190: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72  he Expr structur
61a0: 65 20 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  e .**     dupedE
61b0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 29 20 20 20  xprNodeSize()   
61c0: 20 20 20 20 53 69 7a 65 20 6f 66 20 45 78 70 72      Size of Expr
61d0: 20 2b 20 73 70 61 63 65 20 66 6f 72 20 74 6f 6b   + space for tok
61e0: 65 6e 0a 2a 2a 20 20 20 20 20 64 75 70 65 64 45  en.**     dupedE
61f0: 78 70 72 53 69 7a 65 28 29 20 20 20 20 20 20 20  xprSize()       
6200: 20 20 20 20 45 78 70 72 20 2b 20 74 6f 6b 65 6e      Expr + token
6210: 20 2b 20 73 75 62 74 72 65 65 20 63 6f 6d 70 6f   + subtree compo
6220: 6e 65 6e 74 73 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  nents.**.*******
6230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6270: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
6280: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6290: 7a 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65  ze() function re
62a0: 74 75 72 6e 73 20 74 77 6f 20 76 61 6c 75 65 73  turns two values
62b0: 20 4f 52 2d 65 64 20 74 6f 67 65 74 68 65 72 3a   OR-ed together:
62c0: 20 20 0a 2a 2a 20 28 31 29 20 74 68 65 20 73 70    .** (1) the sp
62d0: 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
62e0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45   a copy of the E
62f0: 78 70 72 20 73 74 72 75 63 74 75 72 65 20 6f 6e  xpr structure on
6300: 6c 79 20 61 6e 64 20 0a 2a 2a 20 28 32 29 20 74  ly and .** (2) t
6310: 68 65 20 45 50 5f 78 78 78 20 66 6c 61 67 73 20  he EP_xxx flags 
6320: 74 68 61 74 20 69 6e 64 69 63 61 74 65 20 77 68  that indicate wh
6330: 61 74 20 74 68 65 20 73 74 72 75 63 74 75 72 65  at the structure
6340: 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 2e   size should be.
6350: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
6360: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
6370: 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
6380: 20 20 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45     EXPR_FULLSIZE
6390: 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 52 45  .**      EXPR_RE
63a0: 44 55 43 45 44 53 49 5a 45 20 20 20 7c 20 45 50  DUCEDSIZE   | EP
63b0: 5f 52 65 64 75 63 65 64 0a 2a 2a 20 20 20 20 20  _Reduced.**     
63c0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
63d0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
63e0: 6c 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ly.**.** The siz
63f0: 65 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  e of the structu
6400: 72 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  re can be found 
6410: 62 79 20 6d 61 73 6b 69 6e 67 20 74 68 65 20 72  by masking the r
6420: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 6f  eturn value.** o
6430: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  f this routine w
6440: 69 74 68 20 30 78 66 66 66 2e 20 20 54 68 65 20  ith 0xfff.  The 
6450: 66 6c 61 67 73 20 63 61 6e 20 62 65 20 66 6f 75  flags can be fou
6460: 6e 64 20 62 79 20 6d 61 73 6b 69 6e 67 20 74 68  nd by masking th
6470: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
6480: 65 20 77 69 74 68 20 45 50 5f 52 65 64 75 63 65  e with EP_Reduce
6490: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2e 0a  d|EP_TokenOnly..
64a0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
64b0: 77 69 74 68 20 66 6c 61 67 73 3d 3d 45 58 50 52  with flags==EXPR
64c0: 44 55 50 5f 52 45 44 55 43 45 2c 20 74 68 69 73  DUP_REDUCE, this
64d0: 20 72 6f 75 74 69 6e 65 73 20 77 6f 72 6b 73 20   routines works 
64e0: 6f 6e 20 66 75 6c 6c 2d 73 69 7a 65 0a 2a 2a 20  on full-size.** 
64f0: 28 75 6e 72 65 64 75 63 65 64 29 20 45 78 70 72  (unreduced) Expr
6500: 20 6f 62 6a 65 63 74 73 20 61 73 20 74 68 65 79   objects as they
6510: 20 6f 72 20 6f 72 69 67 69 6e 61 6c 6c 79 20 63   or originally c
6520: 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 74 68  onstructed by th
6530: 65 20 70 61 72 73 65 72 2e 0a 2a 2a 20 44 75 72  e parser..** Dur
6540: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ing expression a
6550: 6e 61 6c 79 73 69 73 2c 20 65 78 74 72 61 20 69  nalysis, extra i
6560: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 63 6f  nformation is co
6570: 6d 70 75 74 65 64 20 61 6e 64 20 6d 6f 76 65 64  mputed and moved
6580: 20 69 6e 74 6f 0a 2a 2a 20 6c 61 74 65 72 20 70   into.** later p
6590: 61 72 74 73 20 6f 66 20 74 65 68 20 45 78 70 72  arts of teh Expr
65a0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 61 74   object and that
65b0: 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
65c0: 6f 6e 20 6d 69 67 68 74 20 67 65 74 20 63 68 6f  on might get cho
65d0: 70 70 65 64 0a 2a 2a 20 6f 66 66 20 69 66 20 74  pped.** off if t
65e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
65f0: 20 72 65 64 75 63 65 64 2e 20 20 4e 6f 74 65 20   reduced.  Note 
6600: 61 6c 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  also that it doe
6610: 73 20 6e 6f 74 20 77 6f 72 6b 20 74 6f 0a 2a 2a  s not work to.**
6620: 20 6d 61 6b 65 20 61 6e 20 45 58 50 52 44 55 50   make an EXPRDUP
6630: 5f 52 45 44 55 43 45 20 63 6f 70 79 20 6f 66 20  _REDUCE copy of 
6640: 61 20 72 65 64 75 63 65 64 20 65 78 70 72 65 73  a reduced expres
6650: 73 69 6f 6e 2e 20 20 49 74 20 69 73 20 6f 6e 6c  sion.  It is onl
6660: 79 20 6c 65 67 61 6c 0a 2a 2a 20 74 6f 20 72 65  y legal.** to re
6670: 64 75 63 65 20 61 20 70 72 69 73 74 69 6e 65 20  duce a pristine 
6680: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
6690: 66 72 6f 6d 20 74 68 65 20 70 61 72 73 65 72 2e  from the parser.
66a0: 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    The implementa
66b0: 74 69 6f 6e 0a 2a 2a 20 6f 66 20 64 75 70 65 64  tion.** of duped
66c0: 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 29  ExprStructSize()
66d0: 20 63 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c   contain multipl
66e0: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
66f0: 6d 65 6e 74 73 20 74 68 61 74 20 61 74 74 65 6d  ments that attem
6700: 70 74 0a 2a 2a 20 74 6f 20 65 6e 66 6f 72 63 65  pt.** to enforce
6710: 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
6720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6730: 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53  dupedExprStructS
6740: 69 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ize(Expr *p, int
6750: 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e   flags){.  int n
6760: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
6770: 66 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  flags==EXPRDUP_R
6780: 45 44 55 43 45 20 7c 7c 20 66 6c 61 67 73 3d 3d  EDUCE || flags==
6790: 30 20 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  0 ); /* Only one
67a0: 20 66 6c 61 67 20 76 61 6c 75 65 20 61 6c 6c 6f   flag value allo
67b0: 77 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  wed */.  assert(
67c0: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 3c 3d   EXPR_FULLSIZE<=
67d0: 30 78 66 66 66 20 29 3b 0a 20 20 61 73 73 65 72  0xfff );.  asser
67e0: 74 28 20 28 30 78 66 66 66 20 26 20 28 45 50 5f  t( (0xfff & (EP_
67f0: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
6800: 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Only))==0 );.  i
6810: 66 28 20 30 3d 3d 66 6c 61 67 73 20 29 7b 0a 20  f( 0==flags ){. 
6820: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
6830: 46 55 4c 4c 53 49 5a 45 3b 0a 20 20 7d 65 6c 73  FULLSIZE;.  }els
6840: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  e{.    assert( !
6850: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6860: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
6870: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
6880: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
6890: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
68a0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 3b 20 0a  P_FromJoin) ); .
68b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
68c0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
68d0: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 20 29 3b 0a  EP_MemToken) );.
68e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
68f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6900: 45 50 5f 4e 6f 52 65 64 75 63 65 29 20 29 3b 0a  EP_NoReduce) );.
6910: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
6920: 20 7c 7c 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29   || p->x.pList )
6930: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
6940: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6950: 20 7c 20 45 50 5f 52 65 64 75 63 65 64 3b 0a 20   | EP_Reduced;. 
6960: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6970: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
6980: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 53  t==0 );.      nS
6990: 69 7a 65 20 3d 20 45 58 50 52 5f 54 4f 4b 45 4e  ize = EXPR_TOKEN
69a0: 4f 4e 4c 59 53 49 5a 45 20 7c 20 45 50 5f 54 6f  ONLYSIZE | EP_To
69b0: 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20 20 7d 0a 20  kenOnly;.    }. 
69c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 53 69 7a   }.  return nSiz
69d0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
69e0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
69f0: 73 20 74 68 65 20 73 70 61 63 65 20 69 6e 20 62  s the space in b
6a00: 79 74 65 73 20 72 65 71 75 69 72 65 64 20 74 6f  ytes required to
6a10: 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70 79 20   store the copy 
6a20: 0a 2a 2a 20 6f 66 20 74 68 65 20 45 78 70 72 20  .** of the Expr 
6a30: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
6a40: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
6a50: 2e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67  .u.zToken string
6a60: 20 28 69 66 20 74 68 61 74 0a 2a 2a 20 73 74 72   (if that.** str
6a70: 69 6e 67 20 69 73 20 64 65 66 69 6e 65 64 2e 29  ing is defined.)
6a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6a90: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
6aa0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c  (Expr *p, int fl
6ab0: 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ags){.  int nByt
6ac0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6ad0: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6ae0: 29 20 26 20 30 78 66 66 66 3b 0a 20 20 69 66 28  ) & 0xfff;.  if(
6af0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
6b00: 79 28 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  y(p, EP_IntValue
6b10: 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  ) && p->u.zToken
6b20: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   ){.    nByte +=
6b30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6b40: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2b 31 3b  (p->u.zToken)+1;
6b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 52 4f  .  }.  return RO
6b60: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 7d 0a 0a  UND8(nByte);.}..
6b70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6b80: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
6b90: 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 72 65   required to cre
6ba0: 61 74 65 20 61 20 64 75 70 6c 69 63 61 74 65 20  ate a duplicate 
6bb0: 6f 66 20 74 68 65 20 0a 2a 2a 20 65 78 70 72 65  of the .** expre
6bc0: 73 73 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ssion passed as 
6bd0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
6be0: 6e 74 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  nt. The second a
6bf0: 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20  rgument is a.** 
6c00: 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mask containing 
6c10: 45 58 50 52 44 55 50 5f 58 58 58 20 66 6c 61 67  EXPRDUP_XXX flag
6c20: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  s..**.** The val
6c30: 75 65 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  ue returned incl
6c40: 75 64 65 73 20 73 70 61 63 65 20 74 6f 20 63 72  udes space to cr
6c50: 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66 20 74  eate a copy of t
6c60: 68 65 20 45 78 70 72 20 73 74 72 75 63 74 0a 2a  he Expr struct.*
6c70: 2a 20 69 74 73 65 6c 66 20 61 6e 64 20 74 68 65  * itself and the
6c80: 20 62 75 66 66 65 72 20 72 65 66 65 72 72 65 64   buffer referred
6c90: 20 74 6f 20 62 79 20 45 78 70 72 2e 75 2e 7a 54   to by Expr.u.zT
6ca0: 6f 6b 65 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2a  oken, if any..**
6cb0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 58 50 52 44  .** If the EXPRD
6cc0: 55 50 5f 52 45 44 55 43 45 20 66 6c 61 67 20 69  UP_REDUCE flag i
6cd0: 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20  s set, then the 
6ce0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 63  return value inc
6cf0: 6c 75 64 65 73 20 0a 2a 2a 20 73 70 61 63 65 20  ludes .** space 
6d00: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 61 6c 6c  to duplicate all
6d10: 20 45 78 70 72 20 6e 6f 64 65 73 20 69 6e 20 74   Expr nodes in t
6d20: 68 65 20 74 72 65 65 20 66 6f 72 6d 65 64 20 62  he tree formed b
6d30: 79 20 45 78 70 72 2e 70 4c 65 66 74 20 0a 2a 2a  y Expr.pLeft .**
6d40: 20 61 6e 64 20 45 78 70 72 2e 70 52 69 67 68 74   and Expr.pRight
6d50: 20 76 61 72 69 61 62 6c 65 73 20 28 62 75 74 20   variables (but 
6d60: 6e 6f 74 20 66 6f 72 20 61 6e 79 20 73 74 72 75  not for any stru
6d70: 63 74 75 72 65 73 20 70 6f 69 6e 74 65 64 20 74  ctures pointed t
6d80: 6f 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64  o or .** descend
6d90: 65 64 20 66 72 6f 6d 20 74 68 65 20 45 78 70 72  ed from the Expr
6da0: 2e 78 2e 70 4c 69 73 74 20 6f 72 20 45 78 70 72  .x.pList or Expr
6db0: 2e 78 2e 70 53 65 6c 65 63 74 20 76 61 72 69 61  .x.pSelect varia
6dc0: 62 6c 65 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  bles)..*/.static
6dd0: 20 69 6e 74 20 64 75 70 65 64 45 78 70 72 53 69   int dupedExprSi
6de0: 7a 65 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  ze(Expr *p, int 
6df0: 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 6e 42  flags){.  int nB
6e00: 79 74 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  yte = 0;.  if( p
6e10: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
6e20: 64 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a  dupedExprNodeSiz
6e30: 65 28 70 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  e(p, flags);.   
6e40: 20 69 66 28 20 66 6c 61 67 73 26 45 58 50 52 44   if( flags&EXPRD
6e50: 55 50 5f 52 45 44 55 43 45 20 29 7b 0a 20 20 20  UP_REDUCE ){.   
6e60: 20 20 20 6e 42 79 74 65 20 2b 3d 20 64 75 70 65     nByte += dupe
6e70: 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 4c 65  dExprSize(p->pLe
6e80: 66 74 2c 20 66 6c 61 67 73 29 20 2b 20 64 75 70  ft, flags) + dup
6e90: 65 64 45 78 70 72 53 69 7a 65 28 70 2d 3e 70 52  edExprSize(p->pR
6ea0: 69 67 68 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ight, flags);.  
6eb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6ec0: 20 6e 42 79 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nByte;.}../*.**
6ed0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
6ef0: 69 74 65 33 45 78 70 72 44 75 70 28 29 2c 20 65  ite3ExprDup(), e
6f00: 78 63 65 70 74 20 74 68 61 74 20 69 66 20 70 7a  xcept that if pz
6f10: 42 75 66 66 65 72 20 0a 2a 2a 20 69 73 20 6e 6f  Buffer .** is no
6f20: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 2a 70 7a 42  t NULL then *pzB
6f30: 75 66 66 65 72 20 69 73 20 61 73 73 75 6d 65 64  uffer is assumed
6f40: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
6f50: 75 66 66 65 72 20 6c 61 72 67 65 20 65 6e 6f 75  uffer large enou
6f60: 67 68 20 0a 2a 2a 20 74 6f 20 73 74 6f 72 65 20  gh .** to store 
6f70: 74 68 65 20 63 6f 70 79 20 6f 66 20 65 78 70 72  the copy of expr
6f80: 65 73 73 69 6f 6e 20 70 2c 20 74 68 65 20 63 6f  ession p, the co
6f90: 70 69 65 73 20 6f 66 20 70 2d 3e 75 2e 7a 54 6f  pies of p->u.zTo
6fa0: 6b 65 6e 0a 2a 2a 20 28 69 66 20 61 70 70 6c 69  ken.** (if appli
6fb0: 63 61 62 6c 65 29 2c 20 61 6e 64 20 74 68 65 20  cable), and the 
6fc0: 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 2d  copies of the p-
6fd0: 3e 70 4c 65 66 74 20 61 6e 64 20 70 2d 3e 70 52  >pLeft and p->pR
6fe0: 69 67 68 74 20 65 78 70 72 65 73 73 69 6f 6e 73  ight expressions
6ff0: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 20 42 65 66  ,.** if any. Bef
7000: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
7010: 70 7a 42 75 66 66 65 72 20 69 73 20 73 65 74 20  pzBuffer is set 
7020: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
7030: 65 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 70 6f  e past the.** po
7040: 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 66  rtion of the buf
7050: 66 65 72 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  fer copied into 
7060: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
7070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
7080: 20 2a 65 78 70 72 44 75 70 28 73 71 6c 69 74 65   *exprDup(sqlite
7090: 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 2c 20  3 *db, Expr *p, 
70a0: 69 6e 74 20 64 75 70 46 6c 61 67 73 2c 20 75 38  int dupFlags, u8
70b0: 20 2a 2a 70 7a 42 75 66 66 65 72 29 7b 0a 20 20   **pzBuffer){.  
70c0: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
70d0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
70e0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 75 38  o return */.  u8
70f0: 20 2a 7a 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20   *zAlloc;       
7100: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 73 70      /* Memory sp
7110: 61 63 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ace from which t
7120: 6f 20 62 75 69 6c 64 20 45 78 70 72 20 6f 62 6a  o build Expr obj
7130: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 73 74 61  ect */.  u32 sta
7140: 74 69 63 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  ticFlag;       /
7150: 2a 20 45 50 5f 53 74 61 74 69 63 20 69 66 20 73  * EP_Static if s
7160: 70 61 63 65 20 6e 6f 74 20 6f 62 74 61 69 6e 65  pace not obtaine
7170: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 2a 2f  d from malloc */
7180: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
7190: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
71a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 75   );.  assert( du
71b0: 70 46 6c 61 67 73 3d 3d 30 20 7c 7c 20 64 75 70  pFlags==0 || dup
71c0: 46 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52  Flags==EXPRDUP_R
71d0: 45 44 55 43 45 20 29 3b 0a 20 20 61 73 73 65 72  EDUCE );.  asser
71e0: 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30 20 7c  t( pzBuffer==0 |
71f0: 7c 20 64 75 70 46 6c 61 67 73 3d 3d 45 58 50 52  | dupFlags==EXPR
7200: 44 55 50 5f 52 45 44 55 43 45 20 29 3b 0a 0a 20  DUP_REDUCE );.. 
7210: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
7220: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
7230: 65 20 6e 65 77 20 45 78 70 72 20 73 74 72 75 63  e new Expr struc
7240: 74 75 72 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ture. */.  if( p
7250: 7a 42 75 66 66 65 72 20 29 7b 0a 20 20 20 20 7a  zBuffer ){.    z
7260: 41 6c 6c 6f 63 20 3d 20 2a 70 7a 42 75 66 66 65  Alloc = *pzBuffe
7270: 72 3b 0a 20 20 20 20 73 74 61 74 69 63 46 6c 61  r;.    staticFla
7280: 67 20 3d 20 45 50 5f 53 74 61 74 69 63 3b 0a 20  g = EP_Static;. 
7290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 6c 6c   }else{.    zAll
72a0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
72b0: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 64 75  llocRawNN(db, du
72c0: 70 65 64 45 78 70 72 53 69 7a 65 28 70 2c 20 64  pedExprSize(p, d
72d0: 75 70 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 73  upFlags));.    s
72e0: 74 61 74 69 63 46 6c 61 67 20 3d 20 30 3b 0a 20  taticFlag = 0;. 
72f0: 20 7d 0a 20 20 70 4e 65 77 20 3d 20 28 45 78 70   }.  pNew = (Exp
7300: 72 20 2a 29 7a 41 6c 6c 6f 63 3b 0a 0a 20 20 69  r *)zAlloc;..  i
7310: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2f  f( pNew ){.    /
7320: 2a 20 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74  * Set nNewSize t
7330: 6f 20 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63  o the size alloc
7340: 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 74 72  ated for the str
7350: 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
7360: 6f 0a 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77  o.    ** by pNew
7370: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
7380: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
7390: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
73a0: 20 6f 72 0a 20 20 20 20 2a 2a 20 45 58 50 52 5f   or.    ** EXPR_
73b0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e 20 6e  TOKENONLYSIZE. n
73c0: 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74 6f 20  Token is set to 
73d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
73e0: 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20 20 20  tes consumed.   
73f0: 20 2a 2a 20 62 79 20 74 68 65 20 63 6f 70 79 20   ** by the copy 
7400: 6f 66 20 74 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b  of the p->u.zTok
7410: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 61 6e  en string (if an
7420: 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  y)..    */.    c
7430: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 6e 53  onst unsigned nS
7440: 74 72 75 63 74 53 69 7a 65 20 3d 20 64 75 70 65  tructSize = dupe
7450: 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65 28  dExprStructSize(
7460: 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20 20  p, dupFlags);.  
7470: 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4e 65 77    const int nNew
7480: 53 69 7a 65 20 3d 20 6e 53 74 72 75 63 74 53 69  Size = nStructSi
7490: 7a 65 20 26 20 30 78 66 66 66 3b 0a 20 20 20 20  ze & 0xfff;.    
74a0: 69 6e 74 20 6e 54 6f 6b 65 6e 3b 0a 20 20 20 20  int nToken;.    
74b0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
74c0: 65 72 74 79 28 70 2c 20 45 50 5f 49 6e 74 56 61  erty(p, EP_IntVa
74d0: 6c 75 65 29 20 26 26 20 70 2d 3e 75 2e 7a 54 6f  lue) && p->u.zTo
74e0: 6b 65 6e 20 29 7b 0a 20 20 20 20 20 20 6e 54 6f  ken ){.      nTo
74f0: 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ken = sqlite3Str
7500: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
7510: 6e 29 20 2b 20 31 3b 0a 20 20 20 20 7d 65 6c 73  n) + 1;.    }els
7520: 65 7b 0a 20 20 20 20 20 20 6e 54 6f 6b 65 6e 20  e{.      nToken 
7530: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
7540: 66 28 20 64 75 70 46 6c 61 67 73 20 29 7b 0a 20  f( dupFlags ){. 
7550: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
7560: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
7570: 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 20 29  EP_Reduced)==0 )
7580: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
7590: 41 6c 6c 6f 63 2c 20 70 2c 20 6e 4e 65 77 53 69  Alloc, p, nNewSi
75a0: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
75b0: 20 20 20 20 20 20 75 33 32 20 6e 53 69 7a 65 20        u32 nSize 
75c0: 3d 20 28 75 33 32 29 65 78 70 72 53 74 72 75 63  = (u32)exprStruc
75d0: 74 53 69 7a 65 28 70 29 3b 0a 20 20 20 20 20 20  tSize(p);.      
75e0: 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c 20 70  memcpy(zAlloc, p
75f0: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , nSize);.      
7600: 69 66 28 20 6e 53 69 7a 65 3c 45 58 50 52 5f 46  if( nSize<EXPR_F
7610: 55 4c 4c 53 49 5a 45 20 29 7b 20 0a 20 20 20 20  ULLSIZE ){ .    
7620: 20 20 20 20 6d 65 6d 73 65 74 28 26 7a 41 6c 6c      memset(&zAll
7630: 6f 63 5b 6e 53 69 7a 65 5d 2c 20 30 2c 20 45 58  oc[nSize], 0, EX
7640: 50 52 5f 46 55 4c 4c 53 49 5a 45 2d 6e 53 69 7a  PR_FULLSIZE-nSiz
7650: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
7660: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
7670: 65 20 45 50 5f 52 65 64 75 63 65 64 2c 20 45 50  e EP_Reduced, EP
7680: 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c 20 61 6e 64 20  _TokenOnly, and 
7690: 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67 73 20  EP_Static flags 
76a0: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 20 2a  appropriately. *
76b0: 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67  /.    pNew->flag
76c0: 73 20 26 3d 20 7e 28 45 50 5f 52 65 64 75 63 65  s &= ~(EP_Reduce
76d0: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  d|EP_TokenOnly|E
76e0: 50 5f 53 74 61 74 69 63 7c 45 50 5f 4d 65 6d 54  P_Static|EP_MemT
76f0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 4e 65 77 2d  oken);.    pNew-
7700: 3e 66 6c 61 67 73 20 7c 3d 20 6e 53 74 72 75 63  >flags |= nStruc
7710: 74 53 69 7a 65 20 26 20 28 45 50 5f 52 65 64 75  tSize & (EP_Redu
7720: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
7730: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  );.    pNew->fla
7740: 67 73 20 7c 3d 20 73 74 61 74 69 63 46 6c 61 67  gs |= staticFlag
7750: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  ;..    /* Copy t
7760: 68 65 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73  he p->u.zToken s
7770: 74 72 69 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a  tring, if any. *
7780: 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e  /.    if( nToken
7790: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
77a0: 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e 75  zToken = pNew->u
77b0: 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a  .zToken = (char*
77c0: 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69 7a  )&zAlloc[nNewSiz
77d0: 65 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  e];.      memcpy
77e0: 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75 2e 7a 54  (zToken, p->u.zT
77f0: 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
7800: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d     }..    if( 0=
7810: 3d 28 28 70 2d 3e 66 6c 61 67 73 7c 70 4e 65 77  =((p->flags|pNew
7820: 2d 3e 66 6c 61 67 73 29 20 26 20 45 50 5f 54 6f  ->flags) & EP_To
7830: 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  kenOnly) ){.    
7840: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
7850: 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74   pNew->x.pSelect
7860: 20 6f 72 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73   or pNew->x.pLis
7870: 74 20 6d 65 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  t member. */.   
7880: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
7890: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73  operty(p, EP_xIs
78a0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
78b0: 20 20 20 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65     pNew->x.pSele
78c0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
78d0: 63 74 44 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70  ctDup(db, p->x.p
78e0: 53 65 6c 65 63 74 2c 20 64 75 70 46 6c 61 67 73  Select, dupFlags
78f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7900: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e          pNew->x.
7910: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
7920: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
7930: 2d 3e 78 2e 70 4c 69 73 74 2c 20 64 75 70 46 6c  ->x.pList, dupFl
7940: 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
7950: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c    }..    /* Fill
7960: 20 69 6e 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20   in pNew->pLeft 
7970: 61 6e 64 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  and pNew->pRight
7980: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 45 78 70  . */.    if( Exp
7990: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4e 65  rHasProperty(pNe
79a0: 77 2c 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50  w, EP_Reduced|EP
79b0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
79c0: 20 20 20 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64       zAlloc += d
79d0: 75 70 65 64 45 78 70 72 4e 6f 64 65 53 69 7a 65  upedExprNodeSize
79e0: 28 70 2c 20 64 75 70 46 6c 61 67 73 29 3b 0a 20  (p, dupFlags);. 
79f0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
7a00: 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
7a10: 50 5f 52 65 64 75 63 65 64 29 20 29 7b 0a 20 20  P_Reduced) ){.  
7a20: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66        pNew->pLef
7a30: 74 20 3d 20 70 2d 3e 70 4c 65 66 74 20 3f 0a 20  t = p->pLeft ?. 
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 65 78 70 72 44 75 70 28 64 62 2c       exprDup(db,
7a60: 20 70 2d 3e 70 4c 65 66 74 2c 20 45 58 50 52 44   p->pLeft, EXPRD
7a70: 55 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c  UP_REDUCE, &zAll
7a80: 6f 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  oc) : 0;.       
7a90: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
7aa0: 70 2d 3e 70 52 69 67 68 74 20 3f 0a 20 20 20 20  p->pRight ?.    
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ac0: 20 20 20 65 78 70 72 44 75 70 28 64 62 2c 20 70     exprDup(db, p
7ad0: 2d 3e 70 52 69 67 68 74 2c 20 45 58 50 52 44 55  ->pRight, EXPRDU
7ae0: 50 5f 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f  P_REDUCE, &zAllo
7af0: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 0a  c) : 0;.      }.
7b00: 20 20 20 20 20 20 69 66 28 20 70 7a 42 75 66 66        if( pzBuff
7b10: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  er ){.        *p
7b20: 7a 42 75 66 66 65 72 20 3d 20 7a 41 6c 6c 6f 63  zBuffer = zAlloc
7b30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7b40: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
7b50: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
7b60: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
7b70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
7b80: 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  ->pLeft = sqlite
7b90: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
7ba0: 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLeft, 0);.     
7bb0: 20 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20     pNew->pRight 
7bc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
7bd0: 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 2c 20  (db, p->pRight, 
7be0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7bf0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7c00: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  New;.}../*.** Cr
7c10: 65 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  eate and return 
7c20: 61 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74  a deep copy of t
7c30: 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  he object passed
7c40: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
7c50: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ** argument. If 
7c60: 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  an OOM condition
7c70: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
7c80: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
7c90: 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d  d.** and the db-
7ca0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
7cb0: 61 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64  ag set..*/.#ifnd
7cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7cd0: 54 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a  TE.static With *
7ce0: 77 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20  withDup(sqlite3 
7cf0: 2a 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20  *db, With *p){. 
7d00: 20 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b   With *pRet = 0;
7d10: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
7d20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
7d30: 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28  of(*p) + sizeof(
7d40: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
7d50: 43 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74  Cte-1);.    pRet
7d60: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7d70: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
7d80: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20  );.    if( pRet 
7d90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
7da0: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65        pRet->nCte
7db0: 20 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20   = p->nCte;.    
7dc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7dd0: 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
7de0: 20 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70      pRet->a[i].p
7df0: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
7e00: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d  SelectDup(db, p-
7e10: 3e 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30  >a[i].pSelect, 0
7e20: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  );.        pRet-
7e30: 3e 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71  >a[i].pCols = sq
7e40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
7e50: 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  (db, p->a[i].pCo
7e60: 6c 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ls, 0);.        
7e70: 70 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  pRet->a[i].zName
7e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
7e90: 75 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  up(db, p->a[i].z
7ea0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
7eb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7ec0: 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a  n pRet;.}.#else.
7ed0: 23 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70  # define withDup
7ee0: 28 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a  (x,y) 0.#endif..
7ef0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
7f00: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
7f10: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
7f20: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
7f30: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
7f40: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
7f50: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
7f60: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
7f70: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
7f80: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
7f90: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
7fa0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
7fb0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
7fc0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
7fd0: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
7fe0: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
7ff0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
8000: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
8010: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
8020: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
8030: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
8040: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
8050: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
8060: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
8070: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
8080: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
8090: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
80a0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
80b0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
80c0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
80d0: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
80e0: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
80f0: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
8100: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
8110: 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
8120: 74 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74  tains a combinat
8130: 69 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44  ion of the EXPRD
8140: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
8150: 20 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f   If the EXPRDUP_
8160: 52 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73  REDUCE flag is s
8170: 65 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  et, then the str
8180: 75 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20  ucture returned 
8190: 69 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65  is a.** truncate
81a0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
81b0: 20 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75   usual Expr stru
81c0: 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
81d0: 62 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20  be stored as.** 
81e0: 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d  part of the in-m
81f0: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
8200: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
8210: 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  base schema..*/.
8220: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
8230: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
8240: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
8250: 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
8260: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
8270: 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44 55  gs==EXPRDUP_REDU
8280: 43 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  CE );.  return p
8290: 20 3f 20 65 78 70 72 44 75 70 28 64 62 2c 20 70   ? exprDup(db, p
82a0: 2c 20 66 6c 61 67 73 2c 20 30 29 20 3a 20 30 3b  , flags, 0) : 0;
82b0: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
82c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
82d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70  sqlite3 *db, Exp
82e0: 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 66 6c  rList *p, int fl
82f0: 61 67 73 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  ags){.  ExprList
8300: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
8310: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8320: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
8330: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
8340: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
8350: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
8360: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
8370: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8380: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  NN(db, sizeof(*p
8390: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
83a0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
83b0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
83c0: 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a  = i = p->nExpr;.
83d0: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 45    if( (flags & E
83e0: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3d 3d  XPRDUP_REDUCE)==
83f0: 30 20 29 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  0 ) for(i=1; i<p
8400: 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69 29 7b 7d  ->nExpr; i+=i){}
8410: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
8420: 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  em = sqlite3DbMa
8430: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 20 69  llocRawNN(db,  i
8440: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29  *sizeof(p->a[0])
8450: 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 3d   );.  if( pItem=
8460: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8470: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77  3DbFree(db, pNew
8480: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
8490: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
84a0: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
84b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
84c0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
84d0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
84e0: 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d 20  xpr *pOldExpr = 
84f0: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 3b  pOldItem->pExpr;
8500: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
8510: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
8520: 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72 2c  up(db, pOldExpr,
8530: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49 74   flags);.    pIt
8540: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
8550: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
8560: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
8570: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70  ;.    pItem->zSp
8580: 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  an = sqlite3DbSt
8590: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
85a0: 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70  m->zSpan);.    p
85b0: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
85c0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
85d0: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
85e0: 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ->done = 0;.    
85f0: 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54 61  pItem->bSpanIsTa
8600: 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62 53  b = pOldItem->bS
8610: 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70 49  panIsTab;.    pI
8620: 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74 65  tem->u = pOldIte
8630: 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74 75  m->u;.  }.  retu
8640: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
8650: 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74 72  * If cursors, tr
8660: 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61 6e  iggers, views an
8670: 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72 65  d subqueries are
8680: 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72 6f   all omitted fro
8690: 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c 20  m.** the build, 
86a0: 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68 65  then none of the
86b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
86c0: 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 20  nes, except for 
86d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
86e0: 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20 63  tDup(), can be c
86f0: 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53 65  alled. sqlite3Se
8700: 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f 6d  lectDup() is som
8710: 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65 64  etimes.** called
8720: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72 67   with a NULL arg
8730: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  ument..*/.#if !d
8740: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8750: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
8760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8770: 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c 20  _TRIGGER) \. || 
8780: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8790: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 53  OMIT_SUBQUERY).S
87a0: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
87b0: 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65  rcListDup(sqlite
87c0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
87d0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
87e0: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
87f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
8800: 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Byte;.  assert( 
8810: 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  db!=0 );.  if( p
8820: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8830: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
8840: 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e  (*p) + (p->nSrc>
8850: 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  0 ? sizeof(p->a[
8860: 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31  0]) * (p->nSrc-1
8870: 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d  ) : 0);.  pNew =
8880: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8890: 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79 74 65 20  RawNN(db, nByte 
88a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
88b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
88c0: 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77  New->nSrc = pNew
88d0: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53  ->nAlloc = p->nS
88e0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
88f0: 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  <p->nSrc; i++){.
8900: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
8910: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
8920: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
8930: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
8940: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
8950: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
8960: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
8970: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
8980: 63 68 65 6d 61 20 3d 20 70 4f 6c 64 49 74 65 6d  chema = pOldItem
8990: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
89a0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
89b0: 73 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  se = sqlite3DbSt
89c0: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
89d0: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
89e0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
89f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
8a00: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8a10: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
8a20: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
8a30: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
8a40: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8a50: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e 65  zAlias);.    pNe
8a60: 77 49 74 65 6d 2d 3e 66 67 20 3d 20 70 4f 6c 64  wItem->fg = pOld
8a70: 49 74 65 6d 2d 3e 66 67 3b 0a 20 20 20 20 70 4e  Item->fg;.    pN
8a80: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
8a90: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
8aa0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
8ab0: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
8ac0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 61 64 64 72 46   pOldItem->addrF
8ad0: 69 6c 6c 53 75 62 3b 0a 20 20 20 20 70 4e 65 77  illSub;.    pNew
8ae0: 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
8af0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 72 65 67 52  = pOldItem->regR
8b00: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
8b10: 4e 65 77 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e  NewItem->fg.isIn
8b20: 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 20  dexedBy ){.     
8b30: 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31 2e 7a 49   pNewItem->u1.zI
8b40: 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
8b50: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
8b60: 4f 6c 64 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64  OldItem->u1.zInd
8b70: 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20  exedBy);.    }. 
8b80: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 49 42     pNewItem->pIB
8b90: 49 6e 64 65 78 20 3d 20 70 4f 6c 64 49 74 65 6d  Index = pOldItem
8ba0: 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 20 20  ->pIBIndex;.    
8bb0: 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e 66 67  if( pNewItem->fg
8bc0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
8bd0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 75 31      pNewItem->u1
8be0: 2e 70 46 75 6e 63 41 72 67 20 3d 20 0a 20 20 20  .pFuncArg = .   
8bf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8c00: 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f  prListDup(db, pO
8c10: 6c 64 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63  ldItem->u1.pFunc
8c20: 41 72 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  Arg, flags);.   
8c30: 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 70 4e   }.    pTab = pN
8c40: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70  ewItem->pTab = p
8c50: 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  OldItem->pTab;. 
8c60: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20     if( pTab ){. 
8c70: 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b       pTab->nRef+
8c80: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  +;.    }.    pNe
8c90: 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  wItem->pSelect =
8ca0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
8cb0: 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e  p(db, pOldItem->
8cc0: 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29 3b  pSelect, flags);
8cd0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
8ce0: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
8cf0: 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d  Dup(db, pOldItem
8d00: 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a 20  ->pOn, flags);. 
8d10: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73     pNewItem->pUs
8d20: 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c  ing = sqlite3IdL
8d30: 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64 49  istDup(db, pOldI
8d40: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
8d50: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55    pNewItem->colU
8d60: 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sed = pOldItem->
8d70: 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72  colUsed;.  }.  r
8d80: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64  eturn pNew;.}.Id
8d90: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
8da0: 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
8db0: 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b 0a  db, IdList *p){.
8dc0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
8dd0: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
8de0: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  t( db!=0 );.  if
8df0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
8e00: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
8e10: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
8e20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
8e30: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
8e40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8e50: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 2d    pNew->nId = p-
8e60: 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20  >nId;.  pNew->a 
8e70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
8e80: 63 52 61 77 4e 4e 28 64 62 2c 20 70 2d 3e 6e 49  cRawNN(db, p->nI
8e90: 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  d*sizeof(p->a[0]
8ea0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  ) );.  if( pNew-
8eb0: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  >a==0 ){.    sql
8ec0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8ed0: 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  New);.    return
8ee0: 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 4e 6f 74   0;.  }.  /* Not
8ef0: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 74  e that because t
8f00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
8f10: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 2d  llocation for p-
8f20: 3e 61 5b 5d 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  >a[] is not.  **
8f30: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 61 20 70   necessarily a p
8f40: 6f 77 65 72 20 6f 66 20 74 77 6f 2c 20 73 71 6c  ower of two, sql
8f50: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
8f60: 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 61  () may not be ca
8f70: 6c 6c 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lled.  ** on the
8f80: 20 64 75 70 6c 69 63 61 74 65 20 63 72 65 61 74   duplicate creat
8f90: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
8fa0: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
8fb0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
8fc0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
8fd0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
8fe0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
8ff0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
9000: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
9010: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
9020: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
9030: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
9040: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
9050: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
9060: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
9070: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
9080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
9090: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
90a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 73 71 6c  te3SelectDup(sql
90b0: 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74  ite3 *db, Select
90c0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
90d0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 2c  .  Select *pNew,
90e0: 20 2a 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65   *pPrior;.  asse
90f0: 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69  rt( db!=0 );.  i
9100: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
9110: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
9120: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
9130: 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 29  N(db, sizeof(*p)
9140: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
9150: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9160: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
9170: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
9180: 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
9190: 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d   flags);.  pNew-
91a0: 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  >pSrc = sqlite3S
91b0: 72 63 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  rcListDup(db, p-
91c0: 3e 70 53 72 63 2c 20 66 6c 61 67 73 29 3b 0a 20  >pSrc, flags);. 
91d0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
91e0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
91f0: 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 66 6c  b, p->pWhere, fl
9200: 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ags);.  pNew->pG
9210: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
9220: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
9230: 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 66 6c 61  p->pGroupBy, fla
9240: 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  gs);.  pNew->pHa
9250: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
9260: 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 48 61  prDup(db, p->pHa
9270: 76 69 6e 67 2c 20 66 6c 61 67 73 29 3b 0a 20 20  ving, flags);.  
9280: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
9290: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
92a0: 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
92b0: 72 42 79 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  rBy, flags);.  p
92c0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
92d0: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
92e0: 3d 20 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74  = pPrior = sqlit
92f0: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
9300: 70 2d 3e 70 50 72 69 6f 72 2c 20 66 6c 61 67 73  p->pPrior, flags
9310: 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 20  );.  if( pPrior 
9320: 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
9330: 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e  = pNew;.  pNew->
9340: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
9350: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  w->pLimit = sqli
9360: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
9370: 2d 3e 70 4c 69 6d 69 74 2c 20 66 6c 61 67 73 29  ->pLimit, flags)
9380: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
9390: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
93a0: 75 70 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  up(db, p->pOffse
93b0: 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  t, flags);.  pNe
93c0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->iLimit = 0;. 
93d0: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
93e0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46   0;.  pNew->selF
93f0: 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
9400: 67 73 20 26 20 7e 53 46 5f 55 73 65 73 45 70 68  gs & ~SF_UsesEph
9410: 65 6d 65 72 61 6c 3b 0a 20 20 70 4e 65 77 2d 3e  emeral;.  pNew->
9420: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
9430: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64  = -1;.  pNew->ad
9440: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
9450: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c  -1;.  pNew->nSel
9460: 65 63 74 52 6f 77 20 3d 20 70 2d 3e 6e 53 65 6c  ectRow = p->nSel
9470: 65 63 74 52 6f 77 3b 0a 20 20 70 4e 65 77 2d 3e  ectRow;.  pNew->
9480: 70 57 69 74 68 20 3d 20 77 69 74 68 44 75 70 28  pWith = withDup(
9490: 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20  db, p->pWith);. 
94a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
94b0: 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 2d 3e 7a  tName(pNew, p->z
94c0: 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  SelName);.  retu
94d0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65  rn pNew;.}.#else
94e0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
94f0: 53 65 6c 65 63 74 44 75 70 28 73 71 6c 69 74 65  SelectDup(sqlite
9500: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
9510: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
9520: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a  assert( p==0 );.
9530: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
9540: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ndif.../*.** Add
9550: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
9560: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
9570: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
9580: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
9590: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
95a0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
95b0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
95c0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  st..**.** If a m
95d0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
95e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
95f0: 68 65 20 65 6e 74 69 72 65 20 6c 69 73 74 20 69  he entire list i
9600: 73 20 66 72 65 65 64 20 61 6e 64 0a 2a 2a 20 4e  s freed and.** N
9610: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
9620: 20 20 49 66 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 73    If non-NULL is
9630: 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
9640: 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
9650: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
9660: 20 65 6e 74 72 79 20 77 61 73 20 73 75 63 63 65   entry was succe
9670: 73 73 66 75 6c 6c 79 20 61 70 70 65 6e 64 65 64  ssfully appended
9680: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
9690: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
96a0: 70 65 6e 64 28 0a 20 20 50 61 72 73 65 20 2a 70  pend(.  Parse *p
96b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
96c0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
96d0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
96e0: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
96f0: 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68  /* List to which
9700: 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
9710: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  t be NULL */.  E
9720: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
9730: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
9740: 73 69 6f 6e 20 74 6f 20 62 65 20 61 70 70 65 6e  sion to be appen
9750: 64 65 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  ded. Might be NU
9760: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  LL */.){.  sqlit
9770: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9780: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
9790: 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c  b!=0 );.  if( pL
97a0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
97b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
97c0: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
97d0: 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20  izeof(ExprList) 
97e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
97f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
9800: 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a  o no_mem;.    }.
9810: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
9820: 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d   = 0;.    pList-
9830: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
9840: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
9850: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
9860: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
9870: 74 2d 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  t->a==0 ) goto n
9880: 6f 5f 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69  o_mem;.  }else i
9890: 66 28 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  f( (pList->nExpr
98a0: 20 26 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72   & (pList->nExpr
98b0: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  -1))==0 ){.    s
98c0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
98d0: 74 65 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65  tem *a;.    asse
98e0: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
98f0: 3e 30 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71  >0 );.    a = sq
9900: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
9910: 62 2c 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69  b, pList->a, pLi
9920: 73 74 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65  st->nExpr*2*size
9930: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
9940: 3b 0a 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29  ;.    if( a==0 )
9950: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f  {.      goto no_
9960: 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  mem;.    }.    p
9970: 4c 69 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d  List->a = a;.  }
9980: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
9990: 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ->a!=0 );.  if( 
99a0: 31 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  1 ){.    struct 
99b0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
99c0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
99d0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
99e0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
99f0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
9a00: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
9a10: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
9a20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9a30: 4c 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20  List;..no_mem:  
9a40: 20 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c     .  /* Avoid l
9a50: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66  eaking memory if
9a60: 20 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c   malloc has fail
9a70: 65 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ed. */.  sqlite3
9a80: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
9a90: 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Expr);.  sqlite3
9aa0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
9ab0: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
9ac0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
9ad0: 53 65 74 20 74 68 65 20 73 6f 72 74 20 6f 72 64  Set the sort ord
9ae0: 65 72 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  er for the last 
9af0: 65 6c 65 6d 65 6e 74 20 6f 6e 20 74 68 65 20 67  element on the g
9b00: 69 76 65 6e 20 45 78 70 72 4c 69 73 74 2e 0a 2a  iven ExprList..*
9b10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
9b20: 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72 64  prListSetSortOrd
9b30: 65 72 28 45 78 70 72 4c 69 73 74 20 2a 70 2c 20  er(ExprList *p, 
9b40: 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 29 7b  int iSortOrder){
9b50: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
9b60: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
9b70: 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49  SQLITE_SO_UNDEFI
9b80: 4e 45 44 3c 30 20 26 26 20 53 51 4c 49 54 45 5f  NED<0 && SQLITE_
9b90: 53 4f 5f 41 53 43 3e 3d 30 20 26 26 20 53 51 4c  SO_ASC>=0 && SQL
9ba0: 49 54 45 5f 53 4f 5f 44 45 53 43 3e 30 20 29 3b  ITE_SO_DESC>0 );
9bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 45  .  assert( p->nE
9bc0: 78 70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  xpr>0 );.  if( i
9bd0: 53 6f 72 74 4f 72 64 65 72 3c 30 20 29 7b 0a 20  SortOrder<0 ){. 
9be0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 5b     assert( p->a[
9bf0: 70 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  p->nExpr-1].sort
9c00: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
9c10: 5f 41 53 43 20 29 3b 0a 20 20 20 20 72 65 74 75  _ASC );.    retu
9c20: 72 6e 3b 0a 20 20 7d 0a 20 20 70 2d 3e 61 5b 70  rn;.  }.  p->a[p
9c30: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
9c40: 72 64 65 72 20 3d 20 28 75 38 29 69 53 6f 72 74  rder = (u8)iSort
9c50: 4f 72 64 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Order;.}../*.** 
9c60: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
9c70: 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65  .a[].zName eleme
9c80: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
9c90: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
9ca0: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
9cb0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
9cc0: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
9cd0: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
9ce0: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
9cf0: 20 42 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c   But pName shoul
9d00: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
9d10: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
9d20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
9d30: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
9d40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9d50: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
9d60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9d70: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a  xprListSetName(.
9d80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9da0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9db0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9dc0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
9dd0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
9de0: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
9df0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9e10: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
9e20: 20 20 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20    int dequote   
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9e40: 65 20 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e  e to cause the n
9e50: 61 6d 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74  ame to be dequot
9e60: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
9e70: 74 28 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70  t( pList!=0 || p
9e80: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9e90: 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20  cFailed!=0 );.  
9ea0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
9eb0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9ec0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9ed0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9ee0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
9ef0: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
9f00: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31  a[pList->nExpr-1
9f10: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
9f20: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
9f30: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
9f40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
9f50: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
9f60: 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  , pName->z, pNam
9f70: 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64  e->n);.    if( d
9f80: 65 71 75 6f 74 65 20 29 20 73 71 6c 69 74 65 33  equote ) sqlite3
9f90: 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a  Dequote(pItem->z
9fa0: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Name);.  }.}../*
9fb0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
9fc0: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65  List.a[].zSpan e
9fd0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f  lement of the mo
9fe0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9ff0: 64 20 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65  d item.** on the
a000: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a010: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69  ..**.** pList mi
a020: 67 68 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c  ght be NULL foll
a030: 6f 77 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72  owing an OOM err
a040: 6f 72 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73  or.  But pSpan s
a050: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a  hould never be.*
a060: 2a 20 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65  * NULL.  If a me
a070: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
a080: 66 61 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73  fails, the pPars
a090: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
a0a0: 6c 65 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73  led flag.** is s
a0b0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
a0c0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 70  te3ExprListSetSp
a0d0: 61 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  an(.  Parse *pPa
a0e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
a0f0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a100: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a110: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  pList,        /*
a120: 20 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74   List to which t
a130: 6f 20 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20  o add the span. 
a140: 2a 2f 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70  */.  ExprSpan *p
a150: 53 70 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20  Span         /* 
a160: 54 68 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61  The span to be a
a170: 64 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  dded */.){.  sql
a180: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a190: 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
a1a0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d   pList!=0 || db-
a1b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
a1c0: 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
a1d0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
a1e0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
a1f0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
a200: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  List->nExpr-1];.
a210: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
a220: 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20  t->nExpr>0 );.  
a230: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
a240: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49  llocFailed || pI
a250: 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61  tem->pExpr==pSpa
a260: 6e 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  n->pExpr );.    
a270: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a280: 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b  , pItem->zSpan);
a290: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61  .    pItem->zSpa
a2a0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
a2b0: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
a2c0: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2f0: 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e     (int)(pSpan->
a300: 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53  zEnd - pSpan->zS
a310: 74 61 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart));.  }.}../
a320: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
a330: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69  ession list pELi
a340: 73 74 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  st contains more
a350: 20 74 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65   than iLimit ele
a360: 6d 65 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20  ments,.** leave 
a370: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
a380: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
a390: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
a3a0: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a  istCheckLength(.
a3b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a3c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
a3d0: 69 73 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ist,.  const cha
a3e0: 72 20 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20  r *zObject.){.  
a3f0: 69 6e 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d  int mx = pParse-
a400: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
a410: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
a420: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  ;.  testcase( pE
a430: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
a440: 6e 45 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74  nExpr==mx );.  t
a450: 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74 20  estcase( pEList 
a460: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
a470: 3d 3d 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20  ==mx+1 );.  if( 
a480: 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
a490: 2d 3e 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20  ->nExpr>mx ){.  
a4a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a4b0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
a4c0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25  any columns in %
a4d0: 73 22 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20  s", zObject);.  
a4e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
a4f0: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
a500: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
a510: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
a520: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 65 78 70 72  INLINE void expr
a530: 4c 69 73 74 44 65 6c 65 74 65 4e 4e 28 73 71 6c  ListDeleteNN(sql
a540: 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 4c 69  ite3 *db, ExprLi
a550: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
a560: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
a570: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
a580: 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  em;.  assert( pL
a590: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69  ist->a!=0 || pLi
a5a0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a  st->nExpr==0 );.
a5b0: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
a5c0: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
a5d0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
a5e0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
a5f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a600: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
a610: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
a620: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
a630: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
a640: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
a650: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d  tem->zSpan);.  }
a660: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
a670: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
a680: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a690: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 76 6f  db, pList);.}.vo
a6a0: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
a6b0: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
a6c0: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
a6d0: 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70 4c  pList){.  if( pL
a6e0: 69 73 74 20 29 20 65 78 70 72 4c 69 73 74 44 65  ist ) exprListDe
a6f0: 6c 65 74 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74  leteNN(db, pList
a700: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
a710: 72 6e 20 74 68 65 20 62 69 74 77 69 73 65 2d 4f  rn the bitwise-O
a720: 52 20 6f 66 20 61 6c 6c 20 45 78 70 72 2e 66 6c  R of all Expr.fl
a730: 61 67 73 20 66 69 65 6c 64 73 20 69 6e 20 74 68  ags fields in th
a740: 65 20 67 69 76 65 6e 0a 2a 2a 20 45 78 70 72 4c  e given.** ExprL
a750: 69 73 74 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ist..*/.u32 sqli
a760: 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
a770: 28 63 6f 6e 73 74 20 45 78 70 72 4c 69 73 74 20  (const ExprList 
a780: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
a790: 3b 0a 20 20 75 33 32 20 6d 20 3d 20 30 3b 0a 20  ;.  u32 m = 0;. 
a7a0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
a7b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
a7c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
a7d0: 0a 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  .       Expr *pE
a7e0: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
a7f0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
a800: 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d 30  assert( pExpr!=0
a810: 20 29 3b 0a 20 20 20 20 20 20 20 6d 20 7c 3d 20   );.       m |= 
a820: 70 45 78 70 72 2d 3e 66 6c 61 67 73 3b 0a 20 20  pExpr->flags;.  
a830: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a840: 20 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   m;.}../*.** The
a850: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
a860: 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73  Walker callbacks
a870: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 65   used to check e
a880: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 0a 2a 2a  xpressions to.**
a890: 20 73 65 65 20 69 66 20 74 68 65 79 20 61 72 65   see if they are
a8a0: 20 22 63 6f 6e 73 74 61 6e 74 22 20 66 6f 72 20   "constant" for 
a8b0: 73 6f 6d 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  some definition 
a8c0: 6f 66 20 63 6f 6e 73 74 61 6e 74 2e 20 20 54 68  of constant.  Th
a8d0: 65 0a 2a 2a 20 57 61 6c 6b 65 72 2e 65 43 6f 64  e.** Walker.eCod
a8e0: 65 20 76 61 6c 75 65 20 64 65 74 65 72 6d 69 6e  e value determin
a8f0: 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 22  es the type of "
a900: 63 6f 6e 73 74 61 6e 74 22 20 77 65 20 61 72 65  constant" we are
a910: 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 66 6f 72 2e   looking.** for.
a920: 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
a930: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61  lback routines a
a940: 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  re used to imple
a950: 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ment the followi
a960: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71  ng:.**.**     sq
a970: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
a980: 61 6e 74 28 29 20 20 20 20 20 20 20 20 20 20 20  ant()           
a990: 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e         pWalker->
a9a0: 65 43 6f 64 65 3d 3d 31 0a 2a 2a 20 20 20 20 20  eCode==1.**     
a9b0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
a9c0: 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 20 20  stantNotJoin()  
a9d0: 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b 65 72           pWalker
a9e0: 2d 3e 65 43 6f 64 65 3d 3d 32 0a 2a 2a 20 20 20  ->eCode==2.**   
a9f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54    sqlite3ExprIsT
aa00: 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 29 20 20  ableConstant()  
aa10: 20 20 20 20 20 20 20 20 20 20 20 70 57 61 6c 6b             pWalk
aa20: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 0a 2a 2a 20  er->eCode==3.** 
aa30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
aa40: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
aa50: 69 6f 6e 28 29 20 20 20 20 20 20 20 20 70 57 61  ion()        pWa
aa60: 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 6f  lker->eCode==4 o
aa70: 72 20 35 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c  r 5.**.** In all
aa80: 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
aa90: 62 61 63 6b 73 20 73 65 74 20 57 61 6c 6b 65 72  backs set Walker
aaa0: 2e 65 43 6f 64 65 3d 30 20 61 6e 64 20 61 62 6f  .eCode=0 and abo
aab0: 72 74 20 69 66 20 74 68 65 20 65 78 70 72 65 73  rt if the expres
aac0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 66 6f 75 6e 64  sion.** is found
aad0: 20 74 6f 20 6e 6f 74 20 62 65 20 61 20 63 6f 6e   to not be a con
aae0: 73 74 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  stant..**.** The
aaf0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
ab00: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
ab10: 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  () is used for e
ab20: 76 61 6c 75 61 74 69 6e 67 20 65 78 70 72 65 73  valuating expres
ab30: 73 69 6f 6e 73 0a 2a 2a 20 69 6e 20 61 20 43 52  sions.** in a CR
ab40: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
ab50: 6d 65 6e 74 2e 20 20 54 68 65 20 57 61 6c 6b 65  ment.  The Walke
ab60: 72 2e 65 43 6f 64 65 20 76 61 6c 75 65 20 69 73  r.eCode value is
ab70: 20 35 20 77 68 65 6e 20 70 61 72 73 69 6e 67 0a   5 when parsing.
ab80: 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  ** an existing s
ab90: 63 68 65 6d 61 20 61 6e 64 20 34 20 77 68 65 6e  chema and 4 when
aba0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 6e 65   processing a ne
abb0: 77 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  w statement.  A 
abc0: 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
abd0: 65 72 20 72 61 69 73 65 73 20 61 6e 20 65 72 72  er raises an err
abe0: 6f 72 20 66 6f 72 20 6e 65 77 20 73 74 61 74 65  or for new state
abf0: 6d 65 6e 74 73 2c 20 62 75 74 20 69 73 20 73 69  ments, but is si
ac00: 6c 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64  lently converted
ac10: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 20 66 6f 72 20  .** to NULL for 
ac20: 65 78 69 73 74 69 6e 67 20 73 63 68 65 6d 61 73  existing schemas
ac30: 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 73  .  This allows s
ac40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
ac50: 6c 65 73 20 74 68 61 74 20 0a 2a 2a 20 63 6f 6e  les that .** con
ac60: 74 61 69 6e 20 61 20 62 6f 75 6e 64 20 70 61 72  tain a bound par
ac70: 61 6d 65 74 65 72 20 62 65 63 61 75 73 65 20 74  ameter because t
ac80: 68 65 79 20 77 65 72 65 20 67 65 6e 65 72 61 74  hey were generat
ac90: 65 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73  ed by older vers
aca0: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
acb0: 65 20 74 6f 20 62 65 20 70 61 72 73 65 64 20 62  e to be parsed b
acc0: 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
acd0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 74 68 6f   of SQLite witho
ace0: 75 74 20 72 61 69 73 69 6e 67 20 61 0a 2a 2a 20  ut raising a.** 
acf0: 6d 61 6c 66 6f 72 6d 65 64 20 73 63 68 65 6d 61  malformed schema
ad00: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
ad10: 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
ad20: 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20  Constant(Walker 
ad30: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
ad40: 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66  pExpr){..  /* If
ad50: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
ad60: 69 73 20 32 20 74 68 65 6e 20 61 6e 79 20 74 65  is 2 then any te
ad70: 72 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  rm of the expres
ad80: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20  sion that comes 
ad90: 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e  from.  ** the ON
ada0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
adb0: 73 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e  s of a left join
adc0: 20 64 69 73 71 75 61 6c 69 66 69 65 73 20 74 68   disqualifies th
add0: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  e expression.  *
ade0: 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 6f 6e  * from being con
adf0: 73 69 64 65 72 65 64 20 63 6f 6e 73 74 61 6e 74  sidered constant
ae00: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 57 61 6c 6b  . */.  if( pWalk
ae10: 65 72 2d 3e 65 43 6f 64 65 3d 3d 32 20 26 26 20  er->eCode==2 && 
ae20: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
ae30: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
ae40: 69 6e 29 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b  in) ){.    pWalk
ae50: 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20  er->eCode = 0;. 
ae60: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
ae70: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74  ort;.  }..  swit
ae80: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
ae90: 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72  .    /* Consider
aea0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62 65   functions to be
aeb0: 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c 6c   constant if all
aec0: 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74 73   their arguments
aed0: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20 20   are constant.  
aee0: 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72 20    ** and either 
aef0: 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d  pWalker->eCode==
af00: 34 20 6f 72 20 35 20 6f 72 20 74 68 65 20 66 75  4 or 5 or the fu
af10: 6e 63 74 69 6f 6e 20 68 61 73 20 74 68 65 0a 20  nction has the. 
af20: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4e     ** SQLITE_FUN
af30: 43 5f 43 4f 4e 53 54 20 66 6c 61 67 2e 20 2a 2f  C_CONST flag. */
af40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
af50: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
af60: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 3e   pWalker->eCode>
af70: 3d 34 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =4 || ExprHasPro
af80: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43  perty(pExpr,EP_C
af90: 6f 6e 73 74 46 75 6e 63 29 20 29 7b 0a 20 20 20  onstFunc) ){.   
afa0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
afb0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
afc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
afd0: 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20  Walker->eCode = 
afe0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
aff0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b000: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b010: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
b020: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
b030: 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  e TK_AGG_FUNCTIO
b040: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  N:.    case TK_A
b050: 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20  GG_COLUMN:.     
b060: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
b070: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20  ->op==TK_ID );. 
b080: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b090: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
b0a0: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
b0b0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
b0c0: 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
b0d0: 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
b0e0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
b0f0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
b100: 0a 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b  .      if( pWalk
b110: 65 72 2d 3e 65 43 6f 64 65 3d 3d 33 20 26 26 20  er->eCode==3 && 
b120: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
b130: 57 61 6c 6b 65 72 2d 3e 75 2e 69 43 75 72 20 29  Walker->u.iCur )
b140: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b150: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
b160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b170: 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f      pWalker->eCo
b180: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
b190: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
b1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 63 61  ;.      }.    ca
b1b0: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a  se TK_VARIABLE:.
b1c0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
b1d0: 72 2d 3e 65 43 6f 64 65 3d 3d 35 20 29 7b 0a 20  r->eCode==5 ){. 
b1e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74         /* Silent
b1f0: 6c 79 20 63 6f 6e 76 65 72 74 20 62 6f 75 6e 64  ly convert bound
b200: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
b210: 20 61 70 70 65 61 72 20 69 6e 73 69 64 65 20 6f   appear inside o
b220: 66 20 43 52 45 41 54 45 0a 20 20 20 20 20 20 20  f CREATE.       
b230: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 69   ** statements i
b240: 6e 74 6f 20 61 20 4e 55 4c 4c 20 77 68 65 6e 20  nto a NULL when 
b250: 70 61 72 73 69 6e 67 20 74 68 65 20 43 52 45 41  parsing the CREA
b260: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74 65 78  TE statement tex
b270: 74 20 6f 75 74 0a 20 20 20 20 20 20 20 20 2a 2a  t out.        **
b280: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
b290: 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  aster table */. 
b2a0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
b2b0: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
b2c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 61 6c    }else if( pWal
b2d0: 6b 65 72 2d 3e 65 43 6f 64 65 3d 3d 34 20 29 7b  ker->eCode==4 ){
b2e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f  .        /* A bo
b2f0: 75 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  und parameter in
b300: 20 61 20 43 52 45 41 54 45 20 73 74 61 74 65 6d   a CREATE statem
b310: 65 6e 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ent that origina
b320: 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 20  tes from.       
b330: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 72 65 70   ** sqlite3_prep
b340: 61 72 65 28 29 20 63 61 75 73 65 73 20 61 6e 20  are() causes an 
b350: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  error */.       
b360: 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
b370: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
b380: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
b390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
b3a0: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a  Fall through */.
b3b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
b3c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
b3d0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
b3e0: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
b3f0: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
b400: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
b410: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
b420: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
b430: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
b440: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
b450: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
b460: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
b470: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
b480: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
b490: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
b4a0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
b4b0: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
b4c0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
b4d0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
b4e0: 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
b4f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
b500: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74  RC_Abort;.}.stat
b510: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
b520: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
b530: 69 6e 69 74 46 6c 61 67 2c 20 69 6e 74 20 69 43  initFlag, int iC
b540: 75 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  ur){.  Walker w;
b550: 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
b560: 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
b570: 2e 65 43 6f 64 65 20 3d 20 69 6e 69 74 46 6c 61  .eCode = initFla
b580: 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  g;.  w.xExprCall
b590: 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49  back = exprNodeI
b5a0: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78  sConstant;.  w.x
b5b0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
b5c0: 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e   selectNodeIsCon
b5d0: 73 74 61 6e 74 3b 0a 20 20 77 2e 75 2e 69 43 75  stant;.  w.u.iCu
b5e0: 72 20 3d 20 69 43 75 72 3b 0a 20 20 73 71 6c 69  r = iCur;.  sqli
b5f0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
b600: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65  p);.  return w.e
b610: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Code;.}../*.** W
b620: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
b630: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
b640: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
b650: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
b660: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
b670: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
b680: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
b690: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  tion calls..**.*
b6a0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
b6b0: 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  es of this funct
b6c0: 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75  ion, a double-qu
b6d0: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
b6e0: 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f   "abc").** is co
b6f0: 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61  nsidered a varia
b700: 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65  ble but a single
b710: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
b720: 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a  ex: 'abc') is.**
b730: 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a   a constant..*/.
b740: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
b750: 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a  sConstant(Expr *
b760: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  p){.  return exp
b770: 72 49 73 43 6f 6e 73 74 28 70 2c 20 31 2c 20 30  rIsConst(p, 1, 0
b780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
b790: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
b7a0: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  ree.  Return non
b7b0: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70  -zero if the exp
b7c0: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
b7d0: 61 6e 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73  ant.** that does
b7e0: 20 6e 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72   no originate fr
b7f0: 6f 6d 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  om the ON or USI
b800: 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20  NG clauses of a 
b810: 6a 6f 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  join..** Return 
b820: 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73  0 if it involves
b830: 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75   variables or fu
b840: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20  nction calls or 
b850: 74 65 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e  terms from.** an
b860: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
b870: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
b880: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
b890: 74 4e 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70  tNotJoin(Expr *p
b8a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
b8b0: 49 73 43 6f 6e 73 74 28 70 2c 20 32 2c 20 30 29  IsConst(p, 2, 0)
b8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
b8d0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
b8e0: 65 65 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  ee.  Return non-
b8f0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 78 70 72  zero if the expr
b900: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
b910: 6e 74 0a 2a 2a 20 66 6f 72 20 61 6e 79 20 73 69  nt.** for any si
b920: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
b930: 74 61 62 6c 65 20 77 69 74 68 20 63 75 72 73 6f  table with curso
b940: 72 20 69 43 75 72 2e 20 20 49 6e 20 6f 74 68 65  r iCur.  In othe
b950: 72 20 77 6f 72 64 73 2c 20 74 68 65 0a 2a 2a 20  r words, the.** 
b960: 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20  expression must 
b970: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
b980: 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74   non-determinist
b990: 69 63 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 20  ic function nor 
b9a0: 61 6e 79 0a 2a 2a 20 74 61 62 6c 65 20 6f 74 68  any.** table oth
b9b0: 65 72 20 74 68 61 6e 20 69 43 75 72 2e 0a 2a 2f  er than iCur..*/
b9c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
b9d0: 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28  IsTableConstant(
b9e0: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 43 75  Expr *p, int iCu
b9f0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70  r){.  return exp
ba00: 72 49 73 43 6f 6e 73 74 28 70 2c 20 33 2c 20 69  rIsConst(p, 3, i
ba10: 43 75 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  Cur);.}../*.** W
ba20: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
ba30: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
ba40: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
ba50: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
ba60: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
ba70: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
ba80: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
ba90: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
baa0: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
bab0: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
bac0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
bad0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
bae0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
baf0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
bb00: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
bb10: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
bb20: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
bb30: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
bb40: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
bb50: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
bb60: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
bb70: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
bb80: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
bb90: 2a 70 2c 20 75 38 20 69 73 49 6e 69 74 29 7b 0a  *p, u8 isInit){.
bba0: 20 20 61 73 73 65 72 74 28 20 69 73 49 6e 69 74    assert( isInit
bbb0: 3d 3d 30 20 7c 7c 20 69 73 49 6e 69 74 3d 3d 31  ==0 || isInit==1
bbc0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 78 70   );.  return exp
bbd0: 72 49 73 43 6f 6e 73 74 28 70 2c 20 34 2b 69 73  rIsConst(p, 4+is
bbe0: 49 6e 69 74 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Init, 0);.}..#if
bbf0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
bc00: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
bc10: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
bc20: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
bc30: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
bc40: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
bc50: 6e 73 20 61 0a 2a 2a 20 73 75 62 71 75 65 72 79  ns a.** subquery
bc60: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
bc70: 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
bc80: 65 20 61 72 65 20 6e 6f 20 73 75 62 71 75 65 72  e are no subquer
bc90: 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ies..*/.int sqli
bca0: 74 65 33 45 78 70 72 43 6f 6e 74 61 69 6e 73 53  te3ExprContainsS
bcb0: 75 62 71 75 65 72 79 28 45 78 70 72 20 2a 70 29  ubquery(Expr *p)
bcc0: 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
bcd0: 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
bce0: 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43  zeof(w));.  w.eC
bcf0: 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78  ode = 1;.  w.xEx
bd00: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
bd10: 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
bd20: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
bd30: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f  lback = selectNo
bd40: 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20  deIsConstant;.  
bd50: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
bd60: 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  &w, p);.  return
bd70: 20 77 2e 65 43 6f 64 65 3d 3d 30 3b 0a 7d 0a 23   w.eCode==0;.}.#
bd80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
bd90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
bda0: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
bdb0: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
bdc0: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
bdd0: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
bde0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
bdf0: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
be00: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
be10: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
be20: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
be30: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
be40: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
be50: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
be60: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
be70: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
be80: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
be90: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
bea0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
beb0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
bec0: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
bed0: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
bee0: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20   int rc = 0;..  
bef0: 2f 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  /* If an express
bf00: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ion is an intege
bf10: 72 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 66  r literal that f
bf20: 69 74 73 20 69 6e 20 61 20 73 69 67 6e 65 64 20  its in a signed 
bf30: 33 32 2d 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65  32-bit.  ** inte
bf40: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 45 50  ger, then the EP
bf50: 5f 49 6e 74 56 61 6c 75 65 20 66 6c 61 67 20 77  _IntValue flag w
bf60: 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
bf70: 20 62 65 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61   been set */.  a
bf80: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
bf90: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e  _INTEGER || (p->
bfa0: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
bfb0: 6c 75 65 29 21 3d 30 0a 20 20 20 20 20 20 20 20  lue)!=0.        
bfc0: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 65 74     || sqlite3Get
bfd0: 49 6e 74 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65  Int32(p->u.zToke
bfe0: 6e 2c 20 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20  n, &rc)==0 );.. 
bff0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
c000: 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20  EP_IntValue ){. 
c010: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e     *pValue = p->
c020: 75 2e 69 56 61 6c 75 65 3b 0a 20 20 20 20 72 65  u.iValue;.    re
c030: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77  turn 1;.  }.  sw
c040: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
c050: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
c060: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  : {.      rc = s
c070: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
c080: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
c090: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65  alue);.      bre
c0a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c0b0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
c0c0: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
c0d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
c0e0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
c0f0: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
c100: 20 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d       assert( v!=
c110: 28 2d 32 31 34 37 34 38 33 36 34 37 2d 31 29 20  (-2147483647-1) 
c120: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c  );.        *pVal
c130: 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20  ue = -v;.       
c140: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
c150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c160: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
c170: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
c180: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c190: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
c1a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
c1b0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 65 78  ance that the ex
c1c0: 70 72 65 73 73 69 6f 6e 20 63 61 6e 20 62 65 20  pression can be 
c1d0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  NULL..**.** If t
c1e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 69  he expression mi
c1f0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69  ght be NULL or i
c200: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
c210: 20 69 73 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a   is too complex.
c220: 2a 2a 20 74 6f 20 74 65 6c 6c 20 72 65 74 75 72  ** to tell retur
c230: 6e 20 54 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20  n TRUE.  .**.** 
c240: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c250: 75 73 65 64 20 61 73 20 61 6e 20 6f 70 74 69 6d  used as an optim
c260: 69 7a 61 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70  ization, to skip
c270: 20 4f 50 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64   OP_IsNull opcod
c280: 65 73 0a 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e  es.** when we kn
c290: 6f 77 20 74 68 61 74 20 61 20 76 61 6c 75 65 20  ow that a value 
c2a0: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20  cannot be NULL. 
c2b0: 20 48 65 6e 63 65 2c 20 61 20 66 61 6c 73 65 20   Hence, a false 
c2c0: 70 6f 73 69 74 69 76 65 0a 2a 2a 20 28 72 65 74  positive.** (ret
c2d0: 75 72 6e 69 6e 67 20 54 52 55 45 20 77 68 65 6e  urning TRUE when
c2e0: 20 69 6e 20 66 61 63 74 20 74 68 65 20 65 78 70   in fact the exp
c2f0: 72 65 73 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65  ression can neve
c300: 72 20 62 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74  r be NULL) might
c310: 0a 2a 2a 20 62 65 20 61 20 73 6d 61 6c 6c 20 70  .** be a small p
c320: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 20 62  erformance hit b
c330: 75 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  ut is otherwise 
c340: 68 61 72 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68  harmless.  On th
c350: 65 20 6f 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c  e other.** hand,
c360: 20 61 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76   a false negativ
c370: 65 20 28 72 65 74 75 72 6e 69 6e 67 20 46 41 4c  e (returning FAL
c380: 53 45 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  SE when the resu
c390: 6c 74 20 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c  lt could be NULL
c3a0: 29 0a 2a 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ).** will likely
c3b0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
c3c0: 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 2e 20  correct answer. 
c3d0: 20 53 6f 20 77 68 65 6e 20 69 6e 20 64 6f 75 62   So when in doub
c3e0: 74 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55  t, return.** TRU
c3f0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
c400: 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63  3ExprCanBeNull(c
c410: 6f 6e 73 74 20 45 78 70 72 20 2a 70 29 7b 0a 20  onst Expr *p){. 
c420: 20 75 38 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28   u8 op;.  while(
c430: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53   p->op==TK_UPLUS
c440: 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d   || p->op==TK_UM
c450: 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70  INUS ){ p = p->p
c460: 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70  Left; }.  op = p
c470: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
c480: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70  TK_REGISTER ) op
c490: 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69   = p->op2;.  swi
c4a0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
c4b0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a  ase TK_INTEGER:.
c4c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
c4d0: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
c4e0: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
c4f0: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72  TK_BLOB:.      r
c500: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73  eturn 0;.    cas
c510: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
c520: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54     assert( p->pT
c530: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  ab!=0 );.      r
c540: 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f  eturn ExprHasPro
c550: 70 65 72 74 79 28 70 2c 20 45 50 5f 43 61 6e 42  perty(p, EP_CanB
c560: 65 4e 75 6c 6c 29 20 7c 7c 0a 20 20 20 20 20 20  eNull) ||.      
c570: 20 20 20 20 20 20 20 28 70 2d 3e 69 43 6f 6c 75         (p->iColu
c580: 6d 6e 3e 3d 30 20 26 26 20 70 2d 3e 70 54 61 62  mn>=0 && p->pTab
c590: 2d 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d  ->aCol[p->iColum
c5a0: 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 29 3b 0a  n].notNull==0);.
c5b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
c5c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c5d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c5e0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
c5f0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  en expression is
c600: 20 61 20 63 6f 6e 73 74 61 6e 74 20 77 68 69 63   a constant whic
c610: 68 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 75 6e  h would be.** un
c620: 63 68 61 6e 67 65 64 20 62 79 20 4f 50 5f 41 66  changed by OP_Af
c630: 66 69 6e 69 74 79 20 77 69 74 68 20 74 68 65 20  finity with the 
c640: 61 66 66 69 6e 69 74 79 20 67 69 76 65 6e 20 69  affinity given i
c650: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  n the second.** 
c660: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
c670: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c680: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
c690: 65 20 69 66 20 74 68 65 20 4f 50 5f 41 66 66 69  e if the OP_Affi
c6a0: 6e 69 74 79 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  nity operation.*
c6b0: 2a 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  * can be omitted
c6c0: 2e 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74  .  When in doubt
c6d0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 20 20   return FALSE.  
c6e0: 41 20 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65  A false negative
c6f0: 0a 2a 2a 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  .** is harmless.
c700: 20 20 41 20 66 61 6c 73 65 20 70 6f 73 69 74 69    A false positi
c710: 76 65 2c 20 68 6f 77 65 76 65 72 2c 20 63 61 6e  ve, however, can
c720: 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 77   result in the w
c730: 72 6f 6e 67 0a 2a 2a 20 61 6e 73 77 65 72 2e 0a  rong.** answer..
c740: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
c750: 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e 69 74  prNeedsNoAffinit
c760: 79 43 68 61 6e 67 65 28 63 6f 6e 73 74 20 45 78  yChange(const Ex
c770: 70 72 20 2a 70 2c 20 63 68 61 72 20 61 66 66 29  pr *p, char aff)
c780: 7b 0a 20 20 75 38 20 6f 70 3b 0a 20 20 69 66 28  {.  u8 op;.  if(
c790: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
c7a0: 5f 42 4c 4f 42 20 29 20 72 65 74 75 72 6e 20 31  _BLOB ) return 1
c7b0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70  ;.  while( p->op
c7c0: 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d  ==TK_UPLUS || p-
c7d0: 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29  >op==TK_UMINUS )
c7e0: 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20  { p = p->pLeft; 
c7f0: 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  }.  op = p->op;.
c800: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
c810: 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e  ISTER ) op = p->
c820: 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op2;.  switch( o
c830: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
c840: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
c850: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
c860: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
c870: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
c880: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
c890: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46   }.    case TK_F
c8a0: 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 72 65  LOAT: {.      re
c8b0: 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45  turn aff==SQLITE
c8c0: 5f 41 46 46 5f 52 45 41 4c 20 7c 7c 20 61 66 66  _AFF_REAL || aff
c8d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
c8e0: 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ERIC;.    }.    
c8f0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
c900: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
c910: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ff==SQLITE_AFF_T
c920: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  EXT;.    }.    c
c930: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
c940: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
c950: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c960: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
c970: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 54 61 62   assert( p->iTab
c980: 6c 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 70 20 63  le>=0 );  /* p c
c990: 61 6e 6e 6f 74 20 62 65 20 70 61 72 74 20 6f 66  annot be part of
c9a0: 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61   a CHECK constra
c9b0: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  int */.      ret
c9c0: 75 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  urn p->iColumn<0
c9d0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 61  .          && (a
c9e0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
c9f0: 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53  NTEGER || aff==S
ca00: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
ca10: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  C);.    }.    de
ca20: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
ca30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
ca40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
ca50: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
ca60: 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61  iven string is a
ca70: 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e   row-id column n
ca80: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ame..*/.int sqli
ca90: 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74  te3IsRowid(const
caa0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28   char *z){.  if(
cab0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
cac0: 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30  z, "_ROWID_")==0
cad0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
cae0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
caf0: 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30  p(z, "ROWID")==0
cb00: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
cb10: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
cb20: 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29  p(z, "OID")==0 )
cb30: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
cb40: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
cb50: 70 58 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  pX is the RHS of
cb60: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
cb70: 20 20 49 66 20 70 58 20 69 73 20 61 20 53 45 4c    If pX is a SEL
cb80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a  ECT statement .*
cb90: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 69  * that can be si
cba0: 6d 70 6c 69 66 69 65 64 20 74 6f 20 61 20 64 69  mplified to a di
cbb0: 72 65 63 74 20 74 61 62 6c 65 20 61 63 63 65 73  rect table acces
cbc0: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a 2a  s, then return.*
cbd0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
cbe0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
cbf0: 65 6e 74 2e 20 20 49 66 20 70 58 20 69 73 20 6e  ent.  If pX is n
cc00: 6f 74 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ot a SELECT stat
cc10: 65 6d 65 6e 74 2c 0a 2a 2a 20 6f 72 20 69 66 20  ement,.** or if 
cc20: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
cc30: 6d 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 62 65  ment needs to be
cc40: 20 6d 61 6e 69 66 65 73 74 65 64 20 69 6e 74 6f   manifested into
cc50: 20 61 20 74 72 61 6e 73 69 65 6e 74 0a 2a 2a 20   a transient.** 
cc60: 74 61 62 6c 65 2c 20 74 68 65 6e 20 72 65 74 75  table, then retu
cc70: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 6e  rn NULL..*/.#ifn
cc80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cc90: 53 55 42 51 55 45 52 59 0a 73 74 61 74 69 63 20  SUBQUERY.static 
cca0: 53 65 6c 65 63 74 20 2a 69 73 43 61 6e 64 69 64  Select *isCandid
ccb0: 61 74 65 46 6f 72 49 6e 4f 70 74 28 45 78 70 72  ateForInOpt(Expr
ccc0: 20 2a 70 58 29 7b 0a 20 20 53 65 6c 65 63 74 20   *pX){.  Select 
ccd0: 2a 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  *p;.  SrcList *p
cce0: 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  Src;.  ExprList 
ccf0: 2a 70 45 4c 69 73 74 3b 0a 20 20 45 78 70 72 20  *pEList;.  Expr 
cd00: 2a 70 52 65 73 3b 0a 20 20 54 61 62 6c 65 20 2a  *pRes;.  Table *
cd10: 70 54 61 62 3b 0a 20 20 69 66 28 20 21 45 78 70  pTab;.  if( !Exp
cd20: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
cd30: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
cd40: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4e   return 0;  /* N
cd50: 6f 74 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  ot a subquery */
cd60: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
cd70: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 56 61  operty(pX, EP_Va
cd80: 72 53 65 6c 65 63 74 29 20 20 29 20 72 65 74 75  rSelect)  ) retu
cd90: 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 65 6c  rn 0;  /* Correl
cda0: 61 74 65 64 20 73 75 62 71 20 2a 2f 0a 20 20 70  ated subq */.  p
cdb0: 20 3d 20 70 58 2d 3e 78 2e 70 53 65 6c 65 63 74   = pX->x.pSelect
cdc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ;.  if( p->pPrio
cdd0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  r ) return 0;   
cde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
cdf0: 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  t a compound SEL
ce00: 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ECT */.  if( p->
ce10: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
ce20: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
ce30: 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73  gate) ){.    tes
ce40: 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c  tcase( (p->selFl
ce50: 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
ce60: 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
ce70: 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
ce80: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ce90: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
cea0: 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
ceb0: 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
cec0: 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
ced0: 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20  return 0; /* No 
cee0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
cef0: 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74   and no aggregat
cf00: 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  e functions */. 
cf10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
cf20: 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20  pGroupBy==0 );  
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
cf40: 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
cf50: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
cf60: 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
cf70: 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
cf80: 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49    /* Has no LIMI
cf90: 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73  T clause */.  as
cfa0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
cfb0: 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
cfc0: 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54       /* No LIMIT
cfd0: 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54   means no OFFSET
cfe0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68   */.  if( p->pWh
cff0: 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d010: 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  Has no WHERE cla
d020: 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20  use */.  pSrc = 
d030: 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
d040: 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
d050: 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d  if( pSrc->nSrc!=
d060: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
d070: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
d080: 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c   term in FROM cl
d090: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53  ause */.  if( pS
d0a0: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
d0b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
d0c0: 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20   /* FROM is not 
d0d0: 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69  a subquery or vi
d0e0: 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70  ew */.  pTab = p
d0f0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
d100: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
d110: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d120: 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
d130: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
d140: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
d150: 6e 6f 74 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  not a view */.  
d160: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
d170: 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ab) ) return 0; 
d180: 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63         /* FROM c
d190: 6c 61 75 73 65 20 6e 6f 74 20 61 20 76 69 72 74  lause not a virt
d1a0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70  ual table */.  p
d1b0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
d1c0: 74 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  t;.  if( pEList-
d1d0: 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75  >nExpr!=1 ) retu
d1e0: 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f  rn 0;       /* O
d1f0: 6e 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ne column in the
d200: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
d210: 20 70 52 65 73 20 3d 20 70 45 4c 69 73 74 2d 3e   pRes = pEList->
d220: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[0].pExpr;.  if
d230: 28 20 70 52 65 73 2d 3e 6f 70 21 3d 54 4b 5f 43  ( pRes->op!=TK_C
d240: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
d250: 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69  ;    /* Result i
d260: 73 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  s a column */.  
d270: 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 54  assert( pRes->iT
d280: 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 30 5d  able==pSrc->a[0]
d290: 2e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a 20  .iCursor );  /* 
d2a0: 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
d2b0: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 72   subquery */.  r
d2c0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 23 65 6e 64 69  eturn p;.}.#endi
d2d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d2e0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
d2f0: 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 4f  .** Code an OP_O
d300: 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nce instruction 
d310: 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  and allocate spa
d320: 63 65 20 66 6f 72 20 69 74 73 20 66 6c 61 67 2e  ce for its flag.
d330: 20 52 65 74 75 72 6e 20 74 68 65 20 0a 2a 2a 20   Return the .** 
d340: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
d350: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
d360: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
d370: 64 65 4f 6e 63 65 28 50 61 72 73 65 20 2a 70 50  deOnce(Parse *pP
d380: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
d390: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
d3a0: 65 28 70 50 61 72 73 65 29 3b 20 20 20 20 20 20  e(pParse);      
d3b0: 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63 68 69  /* Virtual machi
d3c0: 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ne being coded *
d3d0: 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
d3e0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d3f0: 4f 50 5f 4f 6e 63 65 2c 20 70 50 61 72 73 65 2d  OP_Once, pParse-
d400: 3e 6e 4f 6e 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a  >nOnce++);.}../*
d410: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
d420: 65 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68  e that checks th
d430: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75  e left-most colu
d440: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 61 62 6c  mn of index tabl
d450: 65 20 69 43 75 72 20 74 6f 20 73 65 65 20 69 66  e iCur to see if
d460: 0a 2a 2a 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  .** it contains 
d470: 61 6e 79 20 4e 55 4c 4c 20 65 6e 74 72 69 65 73  any NULL entries
d480: 2e 20 20 43 61 75 73 65 20 74 68 65 20 72 65 67  .  Cause the reg
d490: 69 73 74 65 72 20 61 74 20 72 65 67 48 61 73 4e  ister at regHasN
d4a0: 75 6c 6c 20 74 6f 20 62 65 20 73 65 74 0a 2a 2a  ull to be set.**
d4b0: 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   to a non-NULL v
d4c0: 61 6c 75 65 20 69 66 20 69 43 75 72 20 63 6f 6e  alue if iCur con
d4d0: 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20  tains no NULLs. 
d4e0: 20 43 61 75 73 65 20 72 65 67 69 73 74 65 72 20   Cause register 
d4f0: 72 65 67 48 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f  regHasNull.** to
d500: 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
d510: 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73  if iCur contains
d520: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c   one or more NUL
d530: 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61  L values..*/.sta
d540: 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
d550: 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 56  SetHasNullFlag(V
d560: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 43 75 72  dbe *v, int iCur
d570: 2c 20 69 6e 74 20 72 65 67 48 61 73 4e 75 6c 6c  , int regHasNull
d580: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 0a  ){.  int addr1;.
d590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d5b0: 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
d5c0: 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
d5d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d5e0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  , OP_Rewind, iCu
d5f0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
d600: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
d610: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
d620: 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c 20  olumn, iCur, 0, 
d630: 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 73  regHasNull);.  s
d640: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d650: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59 50  P5(v, OPFLAG_TYP
d660: 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65 43  EOFARG);.  VdbeC
d670: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72 73  omment((v, "firs
d680: 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22 2c  t_entry_in(%d)",
d690: 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69 74   iCur));.  sqlit
d6a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d6b0: 2c 20 61 64 64 72 31 29 3b 0a 7d 0a 0a 0a 23 69  , addr1);.}...#i
d6c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d6d0: 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
d6e0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
d6f0: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   an IN operator 
d700: 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74  with a list (not
d710: 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20   a subquery) on 
d720: 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61  the .** right-ha
d730: 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e  nd side.  Return
d740: 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c 69   TRUE if that li
d750: 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a  st is constant..
d760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
d770: 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73  lite3InRhsIsCons
d780: 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b  tant(Expr *pIn){
d790: 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20  .  Expr *pLHS;. 
d7a0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
d7b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
d7c0: 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73  erty(pIn, EP_xIs
d7d0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48  Select) );.  pLH
d7e0: 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a  S = pIn->pLeft;.
d7f0: 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30    pIn->pLeft = 0
d800: 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
d810: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
d820: 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65  pIn);.  pIn->pLe
d830: 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74  ft = pLHS;.  ret
d840: 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69  urn res;.}.#endi
d850: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
d860: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62  nction is used b
d870: 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  y the implementa
d880: 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28  tion of the IN (
d890: 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ...) operator..*
d8a0: 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65 74  * The pX paramet
d8b0: 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65 73  er is the expres
d8c0: 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20  sion on the RHS 
d8d0: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
d8e0: 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  or, which.** mig
d8f0: 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20 6c  ht be either a l
d900: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
d910: 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72 79  ns or a subquery
d920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
d930: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
d940: 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72  is to find or cr
d950: 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62  eate a b-tree ob
d960: 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a  ject that can.**
d970: 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72 20   be used either 
d980: 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62  to test for memb
d990: 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52 48  ership in the RH
d9a0: 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72  S set or to iter
d9b0: 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61  ate through.** a
d9c0: 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68  ll members of th
d9d0: 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70  e RHS set, skipp
d9e0: 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ing duplicates..
d9f0: 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69  **.** A cursor i
da00: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
da10: 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68  b-tree object th
da20: 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f 66  at is the RHS of
da30: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
da40: 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62  .** and pX->iTab
da50: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
da60: 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
da70: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
da80: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
da90: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
daa0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 62   indicates the b
dab0: 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20 66  -tree type, as f
dac0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
dad0: 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20  IN_INDEX_ROWID  
dae0: 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72      - The cursor
daf0: 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
db00: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
db10: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49  .**   IN_INDEX_I
db20: 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20  NDEX_ASC  - The 
db30: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
db40: 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e  d on an ascendin
db50: 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e  g index..**   IN
db60: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53  _INDEX_INDEX_DES
db70: 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77  C - The cursor w
db80: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
db90: 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e  escending index.
dba0: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45  .**   IN_INDEX_E
dbb0: 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65 20  PH        - The 
dbc0: 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65  cursor was opene
dbd0: 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79  d on a specially
dbe0: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65          populate
dc10: 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c  d epheremal tabl
dc20: 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58  e..**   IN_INDEX
dc30: 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f  _NOOP       - No
dc40: 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f   cursor was allo
dc50: 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f  cated.  The IN o
dc60: 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a  perator must be.
dc70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dc80: 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65             imple
dc90: 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71 75  mented as a sequ
dca0: 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
dcb0: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  ons..**.** An ex
dcc0: 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69  isting b-tree mi
dcd0: 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20 74  ght be used if t
dce0: 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69 6f  he RHS expressio
dcf0: 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65  n pX is a simple
dd00: 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75 63  .** subquery suc
dd10: 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  h as:.**.**     
dd20: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
dd30: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a  FROM <table>.**.
dd40: 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f 66  ** If the RHS of
dd50: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
dd60: 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20   is a list or a 
dd70: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62  more complex sub
dd80: 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61  query, then.** a
dd90: 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
dda0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
ddb0: 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  be generated fro
ddc0: 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74 68  m the RHS and th
ddd0: 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65  en.** pX->iTable
dde0: 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74   made to point t
ddf0: 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  o the ephemeral 
de00: 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66  table instead of
de10: 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20   an.** existing 
de20: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
de30: 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74   inFlags paramet
de40: 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  er must contain 
de50: 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  exactly one of t
de60: 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e  he bits.** IN_IN
de70: 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f  DEX_MEMBERSHIP o
de80: 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e  r IN_INDEX_LOOP.
de90: 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e    If inFlags con
dea0: 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45  tains.** IN_INDE
deb0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68  X_MEMBERSHIP, th
dec0: 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  en the generated
ded0: 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75   table will be u
dee0: 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73  sed for a.** fas
def0: 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
df00: 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f  t.  When the IN_
df10: 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69  INDEX_LOOP bit i
df20: 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e  s set, the.** IN
df30: 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75   index will be u
df40: 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72  sed to loop over
df50: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74   all values of t
df60: 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a  he RHS of the.**
df70: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a   IN operator..**
df80: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
df90: 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28  X_LOOP is used (
dfa0: 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 77  and the b-tree w
dfb0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
dfc0: 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
dfd0: 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  h the set member
dfe0: 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72  s) then the b-tr
dff0: 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74  ee must not cont
e000: 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a  ain duplicates..
e010: 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20  ** An epheremal 
e020: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73  table must be us
e030: 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65  ed unless the se
e040: 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20  lected <column> 
e050: 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a  is guaranteed.**
e060: 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20   to be unique - 
e070: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 69  either because i
e080: 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  t is an INTEGER 
e090: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69  PRIMARY KEY or i
e0a0: 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55  t.** has a UNIQU
e0b0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20  E constraint or 
e0c0: 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a  UNIQUE index..**
e0d0: 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45  .** When IN_INDE
e0e0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20  X_MEMBERSHIP is 
e0f0: 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d  used (and the b-
e100: 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65  tree will be use
e110: 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73  d .** for fast s
e120: 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  et membership te
e130: 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68  sts) then an eph
e140: 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73  eremal table mus
e150: 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e  t .** be used un
e160: 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  less <column> is
e170: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
e180: 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e  ARY KEY or an in
e190: 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66  dex can .** be f
e1a0: 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d  ound with <colum
e1b0: 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d  n> as its left-m
e1c0: 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  ost column..**.*
e1d0: 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45  * If the IN_INDE
e1e0: 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e  X_NOOP_OK and IN
e1f0: 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49  _INDEX_MEMBERSHI
e200: 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20 61  P are both set a
e210: 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53  nd.** if the RHS
e220: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
e230: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e  tor is a list (n
e240: 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20 74  ot a subquery) t
e250: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
e260: 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64 65  ine might decide
e270: 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20 61   that creating a
e280: 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72  n ephemeral b-tr
e290: 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69  ee for membershi
e2a0: 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20  p.** testing is 
e2b0: 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e  too expensive an
e2c0: 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45  d return IN_INDE
e2d0: 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74  X_NOOP.  In that
e2e0: 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61   case, the.** ca
e2f0: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68  lling routine sh
e300: 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ould implement t
e310: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75  he IN operator u
e320: 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a  sing a sequence.
e330: 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63  ** of Eq or Ne c
e340: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
e350: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ions..**.** When
e360: 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 62   the b-tree is b
e370: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65  eing used for me
e380: 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c 20  mbership tests, 
e390: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
e3a0: 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65  tion.** might ne
e3b0: 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68  ed to know wheth
e3c0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48  er or not the RH
e3d0: 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  S side of the IN
e3e0: 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e   operator.** con
e3f0: 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49  tains a NULL.  I
e400: 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69  f prRhsHasNull i
e410: 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69  s not a NULL poi
e420: 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20  nter and .** if 
e430: 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68 61  there is any cha
e440: 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e  nce that the (..
e450: 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  .) might contain
e460: 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74   a NULL value at
e470: 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65  .** runtime, the
e480: 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20  n a register is 
e490: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
e4a0: 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  e register numbe
e4b0: 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  r written.** to 
e4c0: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49  *prRhsHasNull. I
e4d0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  f there is no ch
e4e0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
e4f0: 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a  ..) contains a.*
e500: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68  * NULL value, th
e510: 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  en *prRhsHasNull
e520: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
e530: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72  ed..**.** If a r
e540: 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63  egister is alloc
e550: 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63  ated and its loc
e560: 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20  ation stored in 
e570: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74  *prRhsHasNull, t
e580: 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
e590: 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74 65   in that registe
e5a0: 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  r will be NULL i
e5b0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e  f the b-tree con
e5c0: 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
e5d0: 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e.** NULL values
e5e0: 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65  , and it will be
e5f0: 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   some non-NULL v
e600: 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74 72  alue if the b-tr
e610: 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  ee contains no.*
e620: 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a  * NULL values..*
e630: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e640: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
e650: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  nt sqlite3FindIn
e660: 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
e670: 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75  rse, Expr *pX, u
e680: 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20  32 inFlags, int 
e690: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a  *prRhsHasNull){.
e6a0: 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20    Select *p;    
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
e6d0: 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  T to the right o
e6e0: 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f  f IN operator */
e6f0: 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30  .  int eType = 0
e700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e710: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
e720: 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49   of RHS table. I
e730: 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69  N_INDEX_* */.  i
e740: 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65  nt iTab = pParse
e750: 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20  ->nTab++;       
e760: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
e770: 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65 20  f the RHS table 
e780: 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55  */.  int mustBeU
e790: 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20 20  nique;          
e7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
e7b0: 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20 62  ue if RHS must b
e7c0: 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64  e unique */.  Vd
e7d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e7e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 20  etVdbe(pParse); 
e7f0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d      /* Virtual m
e800: 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64  achine being cod
e810: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
e820: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29   pX->op==TK_IN )
e830: 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65  ;.  mustBeUnique
e840: 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e   = (inFlags & IN
e850: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b  _INDEX_LOOP)!=0;
e860: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
e870: 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74 69  see if an existi
e880: 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  ng table or inde
e890: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
e8a0: 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68  .  ** satisfy th
e8b0: 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 69  e query.  This i
e8c0: 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20  s preferable to 
e8d0: 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77  generating a new
e8e0: 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c   .  ** ephemeral
e8f0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
e900: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
e910: 3d 30 20 26 26 20 28 70 20 3d 20 69 73 43 61 6e  =0 && (p = isCan
e920: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
e930: 58 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  X))!=0 ){.    sq
e940: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e950: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
e960: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
e970: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
e980: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20     Table *pTab; 
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
e9b0: 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20  le <table>. */. 
e9c0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
e9f0: 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e  ression <column>
ea00: 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c   */.    i16 iCol
ea10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea30: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
ea40: 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20  n <column> */.  
ea50: 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20 20    i16 iDb;      
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
ea80: 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54 61  base idx for pTa
ea90: 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  b */..    assert
eaa0: 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
eab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
eac0: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
ead0: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
eae0: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
eaf0: 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ( p->pEList->a[0
eb00: 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a  ].pExpr!=0 ); /*
eb10: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
eb20: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
eb30: 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  p) */.    assert
eb40: 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20  ( p->pSrc!=0 ); 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eb60: 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43 61   Because of isCa
eb70: 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28  ndidateForInOpt(
eb80: 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d  p) */.    pTab =
eb90: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
eba0: 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  Tab;.    pExpr =
ebb0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
ebc0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c  .pExpr;.    iCol
ebd0: 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69   = (i16)pExpr->i
ebe0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20  Column;.   .    
ebf0: 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72  /* Code an OP_Tr
ec00: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50  ansaction and OP
ec10: 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c  _TableLock for <
ec20: 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69  table>. */.    i
ec30: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
ec40: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
ec50: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
ec60: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
ec70: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
ec80: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
ec90: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
eca0: 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
ecb0: 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
ecc0: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  Name);..    /* T
ecd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ece0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
ecf0: 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20   two places. In 
ed00: 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20 76  both cases the v
ed10: 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61  dbe.    ** has a
ed20: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
ed30: 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65  cated. So assume
ed40: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ed50: 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20  ) is always.    
ed60: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68 65  ** successful he
ed70: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
ed80: 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66  ssert(v);.    if
ed90: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
eda0: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71    int iAddr = sq
edb0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
edc0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62  arse);.      Vdb
edd0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
ede0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
edf0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54  Table(pParse, iT
ee00: 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  ab, iDb, pTab, O
ee10: 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
ee20: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
ee30: 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20  DEX_ROWID;..    
ee40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
ee50: 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b  pHere(v, iAddr);
ee60: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee70: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
eea0: 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
eeb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c        /* The col
eec0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
eed0: 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  used by the comp
eee0: 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e  arison. If an in
eef0: 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20  dex is to.      
ef00: 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c  ** be used in pl
ef10: 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61  ace of a temp-ta
ef20: 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ble, it must be 
ef30: 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e  ordered accordin
ef40: 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  g.      ** to th
ef50: 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  is collation seq
ef60: 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20  uence.  */.     
ef70: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d   CollSeq *pReq =
ef80: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
ef90: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
efa0: 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20  rse, pX->pLeft, 
efb0: 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f  pExpr);..      /
efc0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
efd0: 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 77   affinity that w
efe0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70  ill be used to p
eff0: 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20  erform the .    
f000: 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
f010: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
f020: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
f030: 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20  he column. If.  
f040: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74      ** it is not
f050: 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  , it is not poss
f060: 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20  ible to use any 
f070: 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a  index..      */.
f080: 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69        int affini
f090: 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49  ty_ok = sqlite3I
f0a0: 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70  ndexAffinityOk(p
f0b0: 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  X, pTab->aCol[iC
f0c0: 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a  ol].affinity);..
f0d0: 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70        for(pIdx=p
f0e0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f0f0: 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26  x && eType==0 &&
f100: 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49   affinity_ok; pI
f110: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
f120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 49  .        if( (pI
f130: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
f140: 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20  =iCol).         
f150: 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  && sqlite3FindCo
f160: 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
f170: 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b  ), pIdx->azColl[
f180: 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20  0], 0)==pReq.   
f190: 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74 42        && (!mustB
f1a0: 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78  eUnique || (pIdx
f1b0: 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20  ->nKeyCol==1 && 
f1c0: 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
f1d0: 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b  dx))).        ){
f1e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f1f0: 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
f200: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
f210: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f220: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f230: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f240: 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61  OP_OpenRead, iTa
f250: 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  b, pIdx->tnum, i
f260: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Db);.          s
f270: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
f280: 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
f290: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Idx);.          
f2a0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
f2b0: 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d  "%s", pIdx->zNam
f2c0: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  e));.          a
f2d0: 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f  ssert( IN_INDEX_
f2e0: 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e  INDEX_DESC == IN
f2f0: 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43  _INDEX_INDEX_ASC
f300: 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +1 );.          
f310: 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58  eType = IN_INDEX
f320: 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64  _INDEX_ASC + pId
f330: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  x->aSortOrder[0]
f340: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
f350: 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26   prRhsHasNull &&
f360: 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   !pTab->aCol[iCo
f370: 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 23 69  l].notNull ){.#i
f380: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f390: 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
f3a0: 41 53 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ASK.            
f3b0: 63 6f 6e 73 74 20 69 36 34 20 73 4f 6e 65 20 3d  const i64 sOne =
f3c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
f3d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f3e0: 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
f3f0: 6d 6e 73 55 73 65 64 2c 20 0a 20 20 20 20 20 20  mnsUsed, .      
f400: 20 20 20 20 20 20 20 20 20 20 69 54 61 62 2c 20            iTab, 
f410: 30 2c 20 30 2c 20 28 75 38 2a 29 26 73 4f 6e 65  0, 0, (u8*)&sOne
f420: 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65 6e  , P4_INT64);.#en
f430: 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
f440: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20  *prRhsHasNull = 
f450: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f460: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f470: 74 65 33 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61  te3SetHasNullFla
f480: 67 28 76 2c 20 69 54 61 62 2c 20 2a 70 72 52 68  g(v, iTab, *prRh
f490: 73 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  sHasNull);.     
f4a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f4b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f4c0: 48 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a  Here(v, iAddr);.
f4d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
f4f0: 2a 20 49 66 20 6e 6f 20 70 72 65 65 78 69 73 74  * If no preexist
f500: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 61 76 61  ing index is ava
f510: 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 49  ilable for the I
f520: 4e 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 61 6e  N clause.  ** an
f530: 64 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20  d IN_INDEX_NOOP 
f540: 69 73 20 61 6e 20 61 6c 6c 6f 77 65 64 20 72 65  is an allowed re
f550: 70 6c 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ply.  ** and the
f560: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
f570: 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
f580: 74 2c 20 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t, not a subquer
f590: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 52  y.  ** and the R
f5a0: 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  HS is not consta
f5b0: 6e 74 20 6f 72 20 68 61 73 20 74 77 6f 20 6f 72  nt or has two or
f5c0: 20 66 65 77 65 72 20 74 65 72 6d 73 2c 0a 20 20   fewer terms,.  
f5d0: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
f5e0: 74 20 77 6f 72 74 68 20 63 72 65 61 74 69 6e 67  t worth creating
f5f0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61   an ephemeral ta
f600: 62 6c 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a  ble to evaluate.
f610: 20 20 2a 2a 20 74 68 65 20 49 4e 20 6f 70 65 72    ** the IN oper
f620: 61 74 6f 72 20 73 6f 20 72 65 74 75 72 6e 20 49  ator so return I
f630: 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 2e 0a 20 20  N_INDEX_NOOP..  
f640: 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
f650: 30 0a 20 20 20 26 26 20 28 69 6e 46 6c 61 67 73  0.   && (inFlags
f660: 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   & IN_INDEX_NOOP
f670: 5f 4f 4b 29 0a 20 20 20 26 26 20 21 45 78 70 72  _OK).   && !Expr
f680: 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c 20  HasProperty(pX, 
f690: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 0a 20 20  EP_xIsSelect).  
f6a0: 20 26 26 20 28 21 73 71 6c 69 74 65 33 49 6e 52   && (!sqlite3InR
f6b0: 68 73 49 73 43 6f 6e 73 74 61 6e 74 28 70 58 29  hsIsConstant(pX)
f6c0: 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c 69 73 74 2d   || pX->x.pList-
f6d0: 3e 6e 45 78 70 72 3c 3d 32 29 0a 20 20 29 7b 0a  >nExpr<=2).  ){.
f6e0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
f6f0: 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 20  NDEX_NOOP;.  }. 
f700: 20 20 20 20 0a 0a 20 20 69 66 28 20 65 54 79 70      ..  if( eTyp
f710: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43  e==0 ){.    /* C
f720: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 6e  ould not find an
f730: 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20   existing table 
f740: 6f 72 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  or index to use 
f750: 61 73 20 74 68 65 20 52 48 53 20 62 2d 74 72 65  as the RHS b-tre
f760: 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 77 69 6c  e..    ** We wil
f770: 6c 20 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61  l have to genera
f780: 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
f790: 74 61 62 6c 65 20 74 6f 20 64 6f 20 74 68 65 20  table to do the 
f7a0: 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  job..    */.    
f7b0: 75 33 32 20 73 61 76 65 64 4e 51 75 65 72 79 4c  u32 savedNQueryL
f7c0: 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51  oop = pParse->nQ
f7d0: 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 69 6e  ueryLoop;.    in
f7e0: 74 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20 3d  t rMayHaveNull =
f7f0: 20 30 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   0;.    eType = 
f800: 49 4e 5f 49 4e 44 45 58 5f 45 50 48 3b 0a 20 20  IN_INDEX_EPH;.  
f810: 20 20 69 66 28 20 69 6e 46 6c 61 67 73 20 26 20    if( inFlags & 
f820: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 29 7b  IN_INDEX_LOOP ){
f830: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
f840: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 30 3b 0a 20  QueryLoop = 0;. 
f850: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 4c 65       if( pX->pLe
f860: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  ft->iColumn<0 &&
f870: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
f880: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
f890: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ct) ){.        e
f8a0: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
f8b0: 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20  ROWID;.      }. 
f8c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 72 52     }else if( prR
f8d0: 68 73 48 61 73 4e 75 6c 6c 20 29 7b 0a 20 20 20  hsHasNull ){.   
f8e0: 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c     *prRhsHasNull
f8f0: 20 3d 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20   = rMayHaveNull 
f900: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f910: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
f920: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
f930: 28 70 50 61 72 73 65 2c 20 70 58 2c 20 72 4d 61  (pParse, pX, rMa
f940: 79 48 61 76 65 4e 75 6c 6c 2c 20 65 54 79 70 65  yHaveNull, eType
f950: 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
f960: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
f970: 51 75 65 72 79 4c 6f 6f 70 20 3d 20 73 61 76 65  QueryLoop = save
f980: 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 7d  dNQueryLoop;.  }
f990: 65 6c 73 65 7b 0a 20 20 20 20 70 58 2d 3e 69 54  else{.    pX->iT
f9a0: 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 7d  able = iTab;.  }
f9b0: 0a 20 20 72 65 74 75 72 6e 20 65 54 79 70 65 3b  .  return eType;
f9c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f9d0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
f9e0: 6f 72 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  or scalar subque
f9f0: 72 69 65 73 20 75 73 65 64 20 61 73 20 61 20 73  ries used as a s
fa00: 75 62 71 75 65 72 79 20 65 78 70 72 65 73 73 69  ubquery expressi
fa10: 6f 6e 2c 20 45 58 49 53 54 53 2c 0a 2a 2a 20 6f  on, EXISTS,.** o
fa20: 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 20  r IN operators. 
fa30: 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a   Examples:.**.**
fa40: 20 20 20 20 20 28 53 45 4c 45 43 54 20 61 20 46       (SELECT a F
fa50: 52 4f 4d 20 62 29 20 20 20 20 20 20 20 20 20 20  ROM b)          
fa60: 2d 2d 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  -- subquery.**  
fa70: 20 20 20 45 58 49 53 54 53 20 28 53 45 4c 45 43     EXISTS (SELEC
fa80: 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 2d 2d  T a FROM b)   --
fa90: 20 45 58 49 53 54 53 20 73 75 62 71 75 65 72 79   EXISTS subquery
faa0: 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28 34 2c  .**     x IN (4,
fab0: 35 2c 31 31 29 20 20 20 20 20 20 20 20 20 20 20  5,11)           
fac0: 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f     -- IN operato
fad0: 72 20 77 69 74 68 20 6c 69 73 74 20 6f 6e 20 72  r with list on r
fae0: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 0a 2a  ight-hand side.*
faf0: 2a 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45  *     x IN (SELE
fb00: 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20  CT a FROM b)    
fb10: 20 2d 2d 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   -- IN operator 
fb20: 77 69 74 68 20 73 75 62 71 75 65 72 79 20 6f 6e  with subquery on
fb30: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 0a 2a 2a   the right.**.**
fb40: 20 54 68 65 20 70 45 78 70 72 20 70 61 72 61 6d   The pExpr param
fb50: 65 74 65 72 20 64 65 73 63 72 69 62 65 73 20 74  eter describes t
fb60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
fb70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
fb80: 49 4e 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 6f  IN.** operator o
fb90: 72 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  r subquery..**.*
fba0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
fbb0: 73 52 6f 77 69 64 20 69 73 20 6e 6f 6e 2d 7a 65  sRowid is non-ze
fbc0: 72 6f 2c 20 74 68 65 6e 20 65 78 70 72 65 73 73  ro, then express
fbd0: 69 6f 6e 20 70 45 78 70 72 20 69 73 20 67 75 61  ion pExpr is gua
fbe0: 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ranteed.** to be
fbf0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 72   of the form "<r
fc00: 6f 77 69 64 3e 20 49 4e 20 28 3f 2c 20 3f 2c 20  owid> IN (?, ?, 
fc10: 3f 29 22 2c 20 77 68 65 72 65 20 3c 72 6f 77 69  ?)", where <rowi
fc20: 64 3e 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  d> is a referenc
fc30: 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65 20 69 6e 74  e.** to some int
fc40: 65 67 65 72 20 6b 65 79 20 63 6f 6c 75 6d 6e 20  eger key column 
fc50: 6f 66 20 61 20 74 61 62 6c 65 20 42 2d 54 72 65  of a table B-Tre
fc60: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
fc70: 20 75 73 65 20 61 6e 0a 2a 2a 20 69 6e 74 6b 65   use an.** intke
fc80: 79 20 42 2d 54 72 65 65 20 74 6f 20 73 74 6f 72  y B-Tree to stor
fc90: 65 20 74 68 65 20 73 65 74 20 6f 66 20 49 4e 28  e the set of IN(
fca0: 2e 2e 2e 29 20 76 61 6c 75 65 73 20 69 6e 73 74  ...) values inst
fcb0: 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c  ead of the usual
fcc0: 0a 2a 2a 20 28 73 6c 6f 77 65 72 29 20 76 61 72  .** (slower) var
fcd0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
fce0: 73 20 42 2d 54 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  s B-Tree..**.** 
fcf0: 49 66 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 20  If rMayHaveNull 
fd00: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 61  is non-zero, tha
fd10: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
fd20: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 6e   operation is an
fd30: 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20 61 20 53 45   IN.** (not a SE
fd40: 4c 45 43 54 20 6f 72 20 45 58 49 53 54 53 29 20  LECT or EXISTS) 
fd50: 61 6e 64 20 74 68 61 74 20 74 68 65 20 52 48 53  and that the RHS
fd60: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 73 20   might contains 
fd70: 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c 6c 20 74 68  NULLs..** All th
fd80: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
fd90: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  is initialize th
fda0: 65 20 72 65 67 69 73 74 65 72 20 67 69 76 65 6e  e register given
fdb0: 20 62 79 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c   by rMayHaveNull
fdc0: 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e 20 20 43 61  .** to NULL.  Ca
fdd0: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 77  lling routines w
fde0: 69 6c 6c 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ill take care of
fdf0: 20 63 68 61 6e 67 69 6e 67 20 74 68 69 73 20 72   changing this r
fe00: 65 67 69 73 74 65 72 0a 2a 2a 20 76 61 6c 75 65  egister.** value
fe10: 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20   to non-NULL if 
fe20: 74 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d  the RHS is NULL-
fe30: 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  free..**.** For 
fe40: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
fe50: 54 53 20 6f 70 65 72 61 74 6f 72 2c 20 72 65 74  TS operator, ret
fe60: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
fe70: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 0a   that holds the.
fe80: 2a 2a 20 72 65 73 75 6c 74 2e 20 20 46 6f 72 20  ** result.  For 
fe90: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 6f 72 20  IN operators or 
fea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
feb0: 72 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 76  rs, the return v
fec0: 61 6c 75 65 20 69 73 20 30 2e 0a 2a 2f 0a 23 69  alue is 0..*/.#i
fed0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fee0: 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74 20 73  T_SUBQUERY.int s
fef0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
ff00: 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
ff10: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
ff20: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
ff30: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  t */.  Expr *pEx
ff40: 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr,            /
ff50: 2a 20 54 68 65 20 49 4e 2c 20 53 45 4c 45 43 54  * The IN, SELECT
ff60: 2c 20 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72  , or EXISTS oper
ff70: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 72 48  ator */.  int rH
ff80: 61 73 4e 75 6c 6c 46 6c 61 67 2c 20 20 20 20 20  asNullFlag,     
ff90: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
ffa0: 61 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  at records wheth
ffb0: 65 72 20 4e 55 4c 4c 73 20 65 78 69 73 74 20 69  er NULLs exist i
ffc0: 6e 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 69  n RHS */.  int i
ffd0: 73 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  sRowid          
ffe0: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 4c     /* If true, L
fff0: 48 53 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  HS of IN operato
10000 72 20 69 73 20 61 20 72 6f 77 69 64 20 2a 2f 0a  r is a rowid */.
10010 29 7b 0a 20 20 69 6e 74 20 6a 6d 70 49 66 44 79  ){.  int jmpIfDy
10020 6e 61 6d 69 63 20 3d 20 2d 31 3b 20 20 20 20 20  namic = -1;     
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65 20 74 65 73   /* One-time tes
10050 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69  t address */.  i
10060 6e 74 20 72 52 65 67 20 3d 20 30 3b 20 20 20 20  nt rReg = 0;    
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
10090 65 72 20 73 74 6f 72 69 6e 67 20 72 65 73 75 6c  er storing resul
100a0 74 69 6e 67 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ting */.  Vdbe *
100b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
100c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
100d0 28 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20  ( NEVER(v==0) ) 
100e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
100f0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
10100 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 2f 2a 20  (pParse);..  /* 
10110 54 68 69 73 20 63 6f 64 65 20 6d 75 73 74 20 62  This code must b
10120 65 20 72 75 6e 20 69 6e 20 69 74 73 20 65 6e 74  e run in its ent
10130 69 72 65 74 79 20 65 76 65 72 79 20 74 69 6d 65  irety every time
10140 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
10150 65 64 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 6f  ed.  ** if any o
10160 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
10170 69 73 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20  is true:.  **.  
10180 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67  **    *  The rig
10190 68 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20  ht-hand side is 
101a0 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62  a correlated sub
101b0 71 75 65 72 79 0a 20 20 2a 2a 20 20 20 20 2a 20  query.  **    * 
101c0 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   The right-hand 
101d0 73 69 64 65 20 69 73 20 61 6e 20 65 78 70 72 65  side is an expre
101e0 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
101f0 69 6e 69 6e 67 20 76 61 72 69 61 62 6c 65 73 0a  ining variables.
10200 20 20 2a 2a 20 20 20 20 2a 20 20 57 65 20 61 72    **    *  We ar
10210 65 20 69 6e 73 69 64 65 20 61 20 74 72 69 67 67  e inside a trigg
10220 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  er.  **.  ** If 
10230 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
10240 20 61 72 65 20 66 61 6c 73 65 2c 20 74 68 65 6e   are false, then
10250 20 77 65 20 63 61 6e 20 72 75 6e 20 74 68 69 73   we can run this
10260 20 63 6f 64 65 20 6a 75 73 74 20 6f 6e 63 65 0a   code just once.
10270 20 20 2a 2a 20 73 61 76 65 20 74 68 65 20 72 65    ** save the re
10280 73 75 6c 74 73 2c 20 61 6e 64 20 72 65 75 73 65  sults, and reuse
10290 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
102a0 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69   on subsequent i
102b0 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a 20 20 2a 2f  nvocations..  */
102c0 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
102d0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
102e0 50 5f 56 61 72 53 65 6c 65 63 74 29 20 29 7b 0a  P_VarSelect) ){.
102f0 20 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63      jmpIfDynamic
10300 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
10310 63 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65  ce(pParse); Vdbe
10320 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
10330 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10340 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
10350 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
10360 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68  ain==2 ){.    ch
10370 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
10380 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
10390 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
103a0 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
103b0 2c 0a 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44  ,.        jmpIfD
103c0 79 6e 61 6d 69 63 3e 3d 30 3f 22 22 3a 22 43 4f  ynamic>=0?"":"CO
103d0 52 52 45 4c 41 54 45 44 20 22 2c 0a 20 20 20 20  RRELATED ",.    
103e0 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
103f0 4b 5f 49 4e 3f 22 4c 49 53 54 22 3a 22 53 43 41  K_IN?"LIST":"SCA
10400 4c 41 52 22 2c 0a 20 20 20 20 20 20 20 20 70 50  LAR",.        pP
10410 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
10420 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
10430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
10440 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
10450 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
10460 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
10470 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
10480 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
10490 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
104a0 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
104b0 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
104c0 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
104d0 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
104e0 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
104f0 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   IN */.      int
10500 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
10510 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10520 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
10530 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
10540 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
10550 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
10560 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
10570 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
10580 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
10590 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
105a0 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
105b0 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
105c0 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  /..      affinit
105d0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
105e0 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
105f0 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
10600 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
10610 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
10620 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
10630 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
10640 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
10650 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
10660 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
10670 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
10680 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
10690 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
106a0 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
106b0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
106c0 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
106d0 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
106e0 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
106f0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
10700 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
10710 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
10720 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
10730 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
10740 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
10750 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
10760 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
10770 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
10780 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
10790 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
107a0 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
107b0 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
107c0 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
107d0 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
107e0 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
107f0 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
10800 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
10810 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
10820 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
10830 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
10840 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
10850 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
10860 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
10870 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
10880 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
10890 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
108a0 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
108b0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
108c0 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
108d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
108e0 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
108f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10900 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
10910 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
10920 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b  able, !isRowid);
10930 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
10940 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
10950 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10960 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
10970 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  1, 1);..      if
10980 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
10990 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
109a0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
109b0 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
109c0 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
109d0 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
109e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
109f0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
10a00 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
10a10 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
10a20 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
10a30 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
10a40 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
10a50 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
10a60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10a70 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
10a80 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
10a90 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  ct;.        Sele
10aa0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
10ab0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
10ac0 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
10ad0 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
10ae0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
10af0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
10b00 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
10b10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
10b20 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
10b30 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66  ffSdst = (u8)aff
10b40 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61  inity;.        a
10b50 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
10b60 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
10b70 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
10b80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   );.        pSel
10b90 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
10ba0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
10bb0 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  e( pSelect->selF
10bc0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
10bd0 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ct );.        te
10be0 73 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f  stcase( pKeyInfo
10bf0 3d 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64  ==0 ); /* Caused
10c00 20 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74   by OOM in sqlit
10c10 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29  e3KeyInfoAlloc()
10c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10c30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10c40 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
10c50 64 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  dest) ){.       
10c60 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
10c70 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
10c80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
10c90 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
10ca0 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d          pEList =
10cb0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
10cc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10cd0 28 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b  ( pKeyInfo!=0 );
10ce0 20 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75   /* OOM will cau
10cf0 73 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71  se exit after sq
10d00 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f  lite3Select() */
10d10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10d20 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
10d30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
10d40 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  List->nExpr>0 );
10d50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10d60 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
10d70 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49  sWriteable(pKeyI
10d80 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20  nfo) );.        
10d90 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
10da0 30 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  0] = sqlite3Bina
10db0 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
10dc0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
10dd0 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20  pLeft,.         
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
10e20 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  pr);.      }else
10e30 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
10e40 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29  r->x.pList!=0) )
10e50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
10e60 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
10e70 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
10e80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
10e90 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
10ea0 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
10eb0 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
10ec0 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
10ed0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
10ee0 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
10ef0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
10f00 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
10f10 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
10f20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
10f30 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
10f40 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
10f50 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
10f60 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
10f70 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
10f80 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
10f90 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
10fa0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
10fb0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
10fc0 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
10fd0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  x.pList;.       
10fe0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
10ff0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
11000 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32        int r1, r2
11010 2c 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69  , r3;..        i
11020 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a  f( !affinity ){.
11030 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69            affini
11040 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
11050 42 4c 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BLOB;.        }.
11060 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
11070 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
11080 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11090 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
110a0 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b  ble(pKeyInfo) );
110b0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
110c0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  nfo->aColl[0] = 
110d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
110e0 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
110f0 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
11100 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
11110 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63  Loop through eac
11120 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
11130 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20  <exprlist>. */. 
11140 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
11150 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11160 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  arse);.        r
11170 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
11180 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
11190 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
111a0 69 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  id ) sqlite3Vdbe
111b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
111c0 6c 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20  l, 0, r2);.     
111d0 20 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e     for(i=pList->
111e0 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69  nExpr, pItem=pLi
111f0 73 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  st->a; i>0; i--,
11200 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
11210 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
11220 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
11230 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61           int iVa
11240 6c 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20  lToIns;..       
11250 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70     /* If the exp
11260 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63  ression is not c
11270 6f 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20  onstant then we 
11280 77 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20  will need to.   
11290 20 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c         ** disabl
112a0 65 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20  e the test that 
112b0 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62  was generated ab
112c0 6f 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ove that makes s
112d0 75 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ure.          **
112e0 20 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20   this code only 
112f0 65 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20  executes once.  
11300 42 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f  Because for a no
11310 6e 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20  n-constant.     
11320 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
11330 6f 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  on we need to re
11340 72 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61  run this code ea
11350 63 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  ch time..       
11360 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
11370 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
11380 3e 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  >=0 && !sqlite3E
11390 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45  xprIsConstant(pE
113a0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
113b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
113c0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70  ngeToNoop(v, jmp
113d0 49 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20  IfDynamic);.    
113e0 20 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e          jmpIfDyn
113f0 61 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20  amic = -1;.     
11400 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
11410 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
11420 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
11430 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
11440 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
11450 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
11460 69 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74  isRowid && sqlit
11470 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
11480 70 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29  pE2, &iValToIns)
11490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
114a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
114b0 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e  3(v, OP_InsertIn
114c0 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  t, pExpr->iTable
114d0 2c 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29  , r2, iValToIns)
114e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
114f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
11500 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  3 = sqlite3ExprC
11510 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
11520 2c 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20  , pE2, r1);.    
11530 20 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f          if( isRo
11540 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
11550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11560 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73  AddOp2(v, OP_Mus
11570 74 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20  tBeInt, r3,.    
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11590 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
115a0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
115b0 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20  dr(v)+2);.      
115c0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
115d0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
115e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
115f0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
11600 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
11610 61 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20  able, r2, r3);. 
11620 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
11630 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11640 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11650 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
11660 72 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26  rd, r3, 1, r2, &
11670 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
11680 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
11690 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
116a0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
116b0 65 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20  e, r3, 1);.     
116c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
116d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
116e0 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70  _IdxInsert, pExp
116f0 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a  r->iTable, r2);.
11700 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11720 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
11730 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
11740 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
11750 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
11760 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
11770 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  rse, r2);.      
11780 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  }.      if( pKey
11790 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
117a0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
117b0 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP4(v, addr, (vo
117c0 69 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  id *)pKeyInfo, P
117d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
117e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
117f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
11800 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20   TK_EXISTS:.    
11810 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
11820 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
11830 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
11840 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
11850 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
11860 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
11870 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
11880 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
11890 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
118a0 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
118b0 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
118c0 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
118d0 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
118e0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  .  If this is an
118f0 20 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20   EXISTS, write. 
11900 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67       ** an integ
11910 65 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73  er 0 (not exists
11920 29 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20  ) or 1 (exists) 
11930 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
11940 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ll.      ** and 
11950 72 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f  record that memo
11960 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
11970 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
11980 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
119b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
119c0 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  encode */.      
119d0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20        /* How to 
11a00 64 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74  deal with SELECt
11a10 20 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20   result */..    
11a20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
11a30 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
11a40 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
11a50 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
11a60 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20  K_SELECT );.    
11a70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
11a80 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c  >op==TK_EXISTS |
11a90 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
11aa0 53 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20  SELECT );..     
11ab0 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
11ac0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
11ad0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
11ae0 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45  .      pSel = pE
11af0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
11b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
11b10 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
11b20 74 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e  t, 0, ++pParse->
11b30 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  nMem);.      if(
11b40 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
11b50 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20  ELECT ){.       
11b60 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
11b70 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64  T_Mem;.        d
11b80 65 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74  est.iSdst = dest
11b90 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20  .iSDParm;.      
11ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11bb0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
11bc0 30 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29  0, dest.iSDParm)
11bd0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
11be0 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20  mment((v, "Init 
11bf0 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22  subquery result"
11c00 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
11c10 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
11c20 65 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73  est = SRT_Exists
11c30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11c40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11c50 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65  P_Integer, 0, de
11c60 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
11c70 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
11c80 28 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54  ((v, "Init EXIST
11c90 53 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  S result"));.   
11ca0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11cb0 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
11cc0 72 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70  rse->db, pSel->p
11cd0 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53  Limit);.      pS
11ce0 65 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c  el->pLimit = sql
11cf0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
11d00 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c  , TK_INTEGER, 0,
11d10 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e        &sqlite3In
11d40 74 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20  tTokens[1]);.   
11d50 20 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20     pSel->iLimit 
11d60 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  = 0;.      pSel-
11d70 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
11d80 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20  _MultiValue;.   
11d90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
11da0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
11db0 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
11dc0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65       }.      rRe
11de0 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  g = dest.iSDParm
11df0 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56  ;.      ExprSetV
11e00 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
11e10 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
11e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11e30 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48   }.  }..  if( rH
11e40 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20  asNullFlag ){.  
11e50 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
11e60 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72  ullFlag(v, pExpr
11e70 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75  ->iTable, rHasNu
11e80 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20  llFlag);.  }..  
11e90 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
11ea0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
11eb0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11ec0 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
11ed0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
11ee0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
11ef0 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  e);..  return rR
11f00 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
11f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
11f20 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
11f30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
11f40 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
11f50 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
11f60 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
11f70 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
11f80 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
11f90 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
11fa0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
11fb0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
11fc0 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
11fd0 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
11fe0 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d  ion.  The right-
11ff0 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a  hand side (RHS).
12000 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
12010 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76  f zero or more v
12020 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72  alues.  The expr
12030 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69  ession is true i
12040 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20  f the LHS is.** 
12050 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
12060 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76   the RHS.  The v
12070 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72  alue of the expr
12080 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77  ession is unknow
12090 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74  n (NULL).** if t
120a0 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f  he LHS is NULL o
120b0 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  r if the LHS is 
120c0 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  not contained wi
120d0 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64  thin the RHS and
120e0 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74   the.** RHS cont
120f0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
12100 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
12110 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12120 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
12130 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
12140 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
12150 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
12160 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
12170 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
12180 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
12190 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
121a0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
121b0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
121c0 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
121d0 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
121e0 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
121f0 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
12200 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
12210 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
12220 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12230 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
12240 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12250 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12260 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
12270 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
12280 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
12290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
122a0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
122b0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
122c0 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
122d0 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
122e0 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
122f0 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
12300 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
12310 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
12320 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
12330 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
12340 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
12350 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
12360 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
12370 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
12380 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
12390 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
123a0 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
123b0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
123c0 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20  son affinity to 
123d0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  use */.  int eTy
123e0 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
123f0 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
12400 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12420 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
12430 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
12440 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
12450 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
12460 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
12470 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  n */..  /* Compu
12480 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66  te the RHS.   Af
12490 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74  ter this step, t
124a0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
124b0 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d  rsor.  ** pExpr-
124c0 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e  >iTable will con
124d0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
124e0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
124f0 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20  e RHS..  */.  v 
12500 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12510 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12520 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
12530 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
12540 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
12550 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
12560 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
12570 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
12580 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
12590 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
125a0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
125d0 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
125e0 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
12610 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
12620 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
12630 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ull);..  /* Figu
12640 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
12650 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
12660 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
12670 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
12680 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
12690 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
126a0 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
126b0 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
126c0 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f  for.  ** P4 of O
126d0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
126e0 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20  */.  affinity = 
126f0 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
12700 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  ty(pExpr);..  /*
12710 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
12720 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
12730 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
12740 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
12750 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
12760 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71  arse);.  r1 = sq
12770 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12780 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
12790 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
127a0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
127b0 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73   r1);..  /* If s
127c0 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
127d0 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  x() did not find
127e0 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e   or create an in
127f0 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  dex that is.  **
12800 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76   suitable for ev
12810 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20  aluating the IN 
12820 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65  operator, then e
12830 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a  valuate using a.
12840 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66    ** sequence of
12850 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20   comparisons..  
12860 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
12870 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
12880 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
12890 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
128a0 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
128b0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
128c0 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
128d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
128e0 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
128f0 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
12900 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12910 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67  .    int r2, reg
12920 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20  ToFree;.    int 
12930 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20  regCkNull = 0;. 
12940 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61     int ii;.    a
12950 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
12960 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
12970 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
12980 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
12990 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
129a0 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
129b0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
129c0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
129d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
129e0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
129f0 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72 65  tAnd, r1, r1, re
12a00 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
12a10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
12a20 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
12a30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
12a40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
12a50 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
12a60 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
12a70 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
12a80 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
12a90 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
12aa0 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
12ab0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
12ac0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12ad0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
12ae0 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
12af0 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
12b00 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
12b10 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
12b20 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
12b30 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
12b40 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
12b50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12b60 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61  v, OP_Eq, r1, la
12b70 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
12ba0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
12bb0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12bc0 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
12bd0 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
12be0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
12bf0 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
12c00 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
12c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12c20 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69  ChangeP5(v, affi
12c30 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nity);.      }el
12c40 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
12c50 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  rt( destIfNull==
12c60 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20  destIfFalse );. 
12c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12c80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
12c90 65 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c  e, r1, destIfFal
12ca0 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
12cd0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
12ce0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12d00 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66  eChangeP5(v, aff
12d10 69 6e 69 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a  inity | SQLITE_J
12d20 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
12d30 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
12d40 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12d50 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
12d60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
12d70 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
12d80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12d90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
12da0 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
12db0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
12dc0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
12de0 6f 74 6f 28 76 2c 20 64 65 73 74 49 66 46 61 6c  oto(v, destIfFal
12df0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se);.    }.    s
12e00 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
12e10 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f  eLabel(v, labelO
12e20 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  k);.    sqlite3R
12e30 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12e40 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29  arse, regCkNull)
12e50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  ;.  }else{.  .  
12e60 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20    /* If the LHS 
12e70 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
12e80 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74 68  e result is eith
12e90 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c  er false or NULL
12ea0 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a   depending.    *
12eb0 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65  * on whether the
12ec0 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72   RHS is empty or
12ed0 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65   not, respective
12ee0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
12ef0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  f( sqlite3ExprCa
12f00 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e 70  nBeNull(pExpr->p
12f10 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Left) ){.      i
12f20 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64  f( destIfNull==d
12f30 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20  estIfFalse ){.  
12f40 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75        /* Shortcu
12f50 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  t for the common
12f60 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
12f70 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f  false and NULL o
12f80 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20  utcomes are.    
12f90 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
12fa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
12fb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12fc0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
12fd0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
12fe0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13000 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73     int addr1 = s
13010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13020 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
13030 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r1); VdbeCoverag
13040 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  e(v);.        sq
13050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13060 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45  v, OP_Rewind, pE
13070 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
13080 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
13090 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
130a0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
130b0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 64  te3VdbeGoto(v, d
130c0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
130d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
130e0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
130f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13100 0a 20 20 0a 20 20 20 20 69 66 28 20 65 54 79 70  .  .    if( eTyp
13110 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49  e==IN_INDEX_ROWI
13120 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  D ){.      /* In
13130 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
13140 52 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44  RHS is the ROWID
13150 20 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65   of table b-tree
13160 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13180 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
13190 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
131a0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72  , destIfFalse, r
131b0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
131c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
131d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
131e0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
131f0 20 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78   RHS is an index
13200 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a   b-tree..      *
13210 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
13220 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13230 41 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c  Affinity, r1, 1,
13240 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
13250 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
13260 66 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72  f the set member
13270 73 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c  ship test fails,
13280 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
13290 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
132a0 2a 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65  * "x IN (...)" e
132b0 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
132c0 65 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55  e either 0 or NU
132d0 4c 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20  LL. If the set. 
132e0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
132f0 20 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c   no NULL values,
13300 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
13310 20 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65   is 0. If the se
13320 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  t .      ** cont
13330 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
13340 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68   NULL values, th
13350 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  en the result of
13360 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
13370 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f  pression is also
13380 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a   NULL..      */.
13390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65        assert( de
133a0 73 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49  stIfFalse!=destI
133b0 66 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73  fNull || rRhsHas
133c0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
133d0 20 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c   if( rRhsHasNull
133e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
133f0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
13400 6e 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77  ns if it is know
13410 6e 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  n at compile tim
13420 65 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20  e that the RHS. 
13430 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74         ** cannot
13440 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61   contain NULL va
13450 6c 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65  lues. This happe
13460 6e 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ns as the result
13470 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
13480 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
13490 74 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61  traint in the da
134a0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
134b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
134c0 20 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68    ** Also run th
134d0 69 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c  is branch if NUL
134e0 4c 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  L is equivalent 
134f0 74 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20  to FALSE.       
13500 20 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72   ** for this par
13510 74 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61  ticular IN opera
13520 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
13530 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13540 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
13550 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  OP_NotFound, pEx
13560 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
13570 49 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b  IfFalse, r1, 1);
13580 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
13590 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
135a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
135b0 2a 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68  * In this branch
135c0 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  , the RHS of the
135d0 20 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69   IN might contai
135e0 6e 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20  n a NULL and.   
135f0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73       ** the pres
13600 65 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f  ence of a NULL o
13610 6e 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20  n the RHS makes 
13620 61 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  a difference in 
13630 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
13640 75 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20  utcome..        
13650 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
13660 64 64 72 31 3b 0a 20 20 0a 20 20 20 20 20 20 20  ddr1;.  .       
13670 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
13680 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 4c 48  to see if the LH
13690 53 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  S is contained i
136a0 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 73  n the RHS.  If s
136b0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
136c0 65 6e 20 74 68 65 20 61 6e 73 77 65 72 20 69 73  en the answer is
136d0 20 54 52 55 45 20 74 68 65 20 70 72 65 73 65 6e   TRUE the presen
136e0 63 65 20 6f 66 20 4e 55 4c 4c 73 20 69 6e 20 74  ce of NULLs in t
136f0 68 65 20 52 48 53 20 64 6f 65 73 0a 20 20 20 20  he RHS does.    
13700 20 20 20 20 2a 2a 20 6e 6f 74 20 6d 61 74 74 65      ** not matte
13710 72 2e 20 20 49 66 20 74 68 65 20 4c 48 53 20 69  r.  If the LHS i
13720 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
13730 69 6e 20 74 68 65 20 52 48 53 2c 20 74 68 65 6e  in the RHS, then
13740 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
13750 61 6e 73 77 65 72 20 69 73 20 4e 55 4c 4c 20 69  answer is NULL i
13760 66 20 74 68 65 20 52 48 53 20 63 6f 6e 74 61 69  f the RHS contai
13770 6e 73 20 4e 55 4c 4c 73 20 61 6e 64 20 74 68 65  ns NULLs and the
13780 20 61 6e 73 77 65 72 20 69 73 0a 20 20 20 20 20   answer is.     
13790 20 20 20 2a 2a 20 46 41 4c 53 45 20 69 66 20 74     ** FALSE if t
137a0 68 65 20 52 48 53 20 69 73 20 4e 55 4c 4c 2d 66  he RHS is NULL-f
137b0 72 65 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ree..        */.
137c0 20 20 20 20 20 20 20 20 61 64 64 72 31 20 3d 20          addr1 = 
137d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
137e0 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
137f0 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
13800 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20   0, r1, 1);.    
13810 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
13820 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
13830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13840 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 52 68  , OP_IsNull, rRh
13850 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74 49 66  sHasNull, destIf
13860 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 56  Null);.        V
13870 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
13880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13890 64 62 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 49  dbeGoto(v, destI
138a0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
138b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
138c0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
138d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
138e0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
138f0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
13900 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
13910 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
13920 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  rse);.  VdbeComm
13930 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
13940 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69  expr"));.}.#endi
13950 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13960 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69  _SUBQUERY */..#i
13970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13980 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
13990 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
139a0 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
139b0 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
139c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
139d0 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72 69 62  ** value describ
139e0 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  ed by z[0..n-1] 
139f0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
13a00 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 5b  em..**.** The z[
13a10 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 70 72  ] string will pr
13a20 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20 7a 65  obably not be ze
13a30 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 20 20  ro-terminated.  
13a40 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b 6e 5d  But the .** z[n]
13a50 20 63 68 61 72 61 63 74 65 72 20 69 73 20 67 75   character is gu
13a60 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 73  aranteed to be s
13a70 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 64 6f  omething that do
13a80 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a 20 6c  es not look.** l
13a90 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e 75 61  ike the continua
13aa0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75 6d 62  tion of the numb
13ab0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
13ac0 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64 62 65  id codeReal(Vdbe
13ad0 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
13ae0 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65 46 6c  *z, int negateFl
13af0 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b 0a 20  ag, int iMem){. 
13b00 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21 3d 30   if( ALWAYS(z!=0
13b10 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
13b20 76 61 6c 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  value;.    sqlit
13b30 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
13b40 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
13b50 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
13b60 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
13b70 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
13b80 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
13b90 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
13ba0 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
13bb0 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
13bc0 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
13bd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13be0 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
13bf0 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65 6d 2c  P_Real, 0, iMem,
13c00 20 30 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c   0, (u8*)&value,
13c10 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
13c20 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
13c30 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
13c40 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
13c50 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
13c60 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
13c70 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
13c80 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
13c90 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
13ca0 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
13cb0 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
13cc0 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
13cd0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
13ce0 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
13cf0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
13d00 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
13d10 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
13d20 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
13d30 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
13d40 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
13d50 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
13d60 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
13d70 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
13d80 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
13d90 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
13da0 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
13db0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13dc0 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
13dd0 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
13de0 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
13df0 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
13e00 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
13e10 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
13e20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
13e30 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
13e40 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
13e50 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
13e60 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
13e70 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
13e80 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
13e90 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
13ea0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
13eb0 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
13ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13ed0 64 4f 70 34 44 75 70 38 28 76 2c 20 4f 50 5f 49  dOp4Dup8(v, OP_I
13ee0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
13ef0 2c 20 28 75 38 2a 29 26 76 61 6c 75 65 2c 20 50  , (u8*)&value, P
13f00 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 7d 65  4_INT64);.    }e
13f10 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
13f20 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
13f30 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 73 71 6c  _POINT.      sql
13f40 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13f50 72 73 65 2c 20 22 6f 76 65 72 73 69 7a 65 64 20  rse, "oversized 
13f60 69 6e 74 65 67 65 72 3a 20 25 73 25 73 22 2c 20  integer: %s%s", 
13f70 6e 65 67 46 6c 61 67 20 3f 20 22 2d 22 20 3a 20  negFlag ? "-" : 
13f80 22 22 2c 20 7a 29 3b 0a 23 65 6c 73 65 0a 23 69  "", z);.#else.#i
13f90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13fa0 54 5f 48 45 58 5f 49 4e 54 45 47 45 52 0a 20 20  T_HEX_INTEGER.  
13fb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
13fc0 73 74 72 6e 69 63 6d 70 28 7a 2c 22 30 78 22 2c  strnicmp(z,"0x",
13fd0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
13fe0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13ff0 28 70 50 61 72 73 65 2c 20 22 68 65 78 20 6c 69  (pParse, "hex li
14000 74 65 72 61 6c 20 74 6f 6f 20 62 69 67 3a 20 25  teral too big: %
14010 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 65  s", z);.      }e
14020 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
14030 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 52   {.        codeR
14040 65 61 6c 28 76 2c 20 7a 2c 20 6e 65 67 46 6c 61  eal(v, z, negFla
14050 67 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  g, iMem);.      
14060 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
14070 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
14080 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
14090 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 65  /*.** Verify the
140a0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 6f 66 20   consistency of 
140b0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
140c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
140d0 61 63 68 65 49 73 56 61 6c 69 64 28 50 61 72 73  acheIsValid(Pars
140e0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e  e *pParse){.  in
140f0 74 20 69 2c 20 6e 3b 0a 20 20 66 6f 72 28 69 3d  t i, n;.  for(i=
14100 6e 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  n=0; i<SQLITE_N_
14110 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 29 7b 0a  COLCACHE; i++){.
14120 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
14130 61 43 6f 6c 43 61 63 68 65 5b 69 5d 2e 69 52 65  aColCache[i].iRe
14140 67 3e 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  g>0 ) n++;.  }. 
14150 20 72 65 74 75 72 6e 20 6e 3d 3d 70 50 61 72 73   return n==pPars
14160 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 3b 0a 7d 0a  e->nColCache;.}.
14170 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
14180 65 61 72 20 61 20 63 61 63 68 65 20 65 6e 74 72  ear a cache entr
14190 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
141a0 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  d cacheEntryClea
141b0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
141c0 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
141d0 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
141e0 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20 20 69  tempReg ){.    i
141f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
14200 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28 70 50  Reg<ArraySize(pP
14210 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 29 20  arse->aTempReg) 
14220 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ){.      pParse-
14230 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
14240 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
14250 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20  p->iReg;.    }. 
14260 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
14270 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 52 65 67  0;.  }.  p->iReg
14280 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
14290 6e 43 6f 6c 43 61 63 68 65 2d 2d 3b 0a 20 20 61  nColCache--;.  a
142a0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
142b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
142c0 7c 7c 20 63 61 63 68 65 49 73 56 61 6c 69 64 28  || cacheIsValid(
142d0 70 50 61 72 73 65 29 20 29 3b 0a 7d 0a 0a 0a 2f  pParse) );.}.../
142e0 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74  *.** Record in t
142f0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  he column cache 
14300 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c 61  that a particula
14310 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a  r column from a.
14320 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74 61  ** particular ta
14330 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ble is stored in
14340 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72 65   a particular re
14350 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  gister..*/.void 
14360 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14370 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61  Store(Parse *pPa
14380 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69  rse, int iTab, i
14390 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65  nt iCol, int iRe
143a0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
143b0 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74  nt minLru;.  int
143c0 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63   idxLru;.  struc
143d0 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
143e0 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 61 6e 20  .  /* Unless an 
143f0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
14400 65 64 2c 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ed, register num
14410 62 65 72 73 20 61 72 65 20 61 6c 77 61 79 73 20  bers are always 
14420 70 6f 73 69 74 69 76 65 2e 20 2a 2f 0a 20 20 61  positive. */.  a
14430 73 73 65 72 74 28 20 69 52 65 67 3e 30 20 7c 7c  ssert( iReg>0 ||
14440 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
14450 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
14460 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 61  locFailed );.  a
14470 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d 31 20  ssert( iCol>=-1 
14480 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20 29 3b  && iCol<32768 );
14490 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f 6c 75    /* Finite colu
144a0 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 0a 20  mn numbers */.. 
144b0 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 43   /* The SQLITE_C
144c0 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61 67 20  olumnCache flag 
144d0 64 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c  disables the col
144e0 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73  umn cache.  This
144f0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 66 6f   is used.  ** fo
14500 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2d  r testing only -
14510 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
14520 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20 67 65  SQLite always ge
14530 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  ts the same answ
14540 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 64  er.  ** with and
14550 20 77 69 74 68 6f 75 74 20 74 68 65 20 63 6f 6c   without the col
14560 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a  umn cache..  */.
14570 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
14580 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61 72 73  onDisabled(pPars
14590 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
145a0 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72 65 74  lumnCache) ) ret
145b0 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  urn;..  /* First
145c0 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69   replace any exi
145d0 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20 20 2a  sting entry..  *
145e0 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
145f0 20 74 68 65 20 77 61 79 20 74 68 65 20 63 6f 6c   the way the col
14600 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63 75 72  umn cache is cur
14610 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77 65 20  rently used, we 
14620 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 0a 20  are guaranteed. 
14630 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 62 6a   ** that the obj
14640 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  ect will never a
14650 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63 61 63  lready be in cac
14660 68 65 2e 20 20 56 65 72 69 66 79 20 74 68 69 73  he.  Verify this
14670 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20 2a 2f   guarantee..  */
14680 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14690 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
146a0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
146b0 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
146c0 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
146d0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
146e0 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 54 61  Reg==0 || p->iTa
146f0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70 2d 3e  ble!=iTab || p->
14700 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20 29 3b  iColumn!=iCol );
14710 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
14720 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74 79 20  * Find an empty 
14730 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61 63 65  slot and replace
14740 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30   it */.  for(i=0
14750 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
14760 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
14770 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
14780 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
14790 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->iReg==0 ){.   
147a0 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
147b0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
147c0 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61  el;.      p->iTa
147d0 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  ble = iTab;.    
147e0 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
147f0 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52  Col;.      p->iR
14800 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 20  eg = iReg;.     
14810 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b   p->tempReg = 0;
14820 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20  .      p->lru = 
14830 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e  pParse->iCacheCn
14840 74 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73  t++;.      pPars
14850 65 2d 3e 6e 43 6f 6c 43 61 63 68 65 2b 2b 3b 0a  e->nColCache++;.
14860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14870 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14880 46 61 69 6c 65 64 20 7c 7c 20 63 61 63 68 65 49  Failed || cacheI
14890 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20 29  sValid(pParse) )
148a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
148b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
148c0 52 65 70 6c 61 63 65 20 74 68 65 20 6c 61 73 74  Replace the last
148d0 20 72 65 63 65 6e 74 6c 79 20 75 73 65 64 20 2a   recently used *
148e0 2f 0a 20 20 6d 69 6e 4c 72 75 20 3d 20 30 78 37  /.  minLru = 0x7
148f0 66 66 66 66 66 66 66 3b 0a 20 20 69 64 78 4c 72  fffffff;.  idxLr
14900 75 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  u = -1;.  for(i=
14910 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
14920 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
14930 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14940 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
14950 70 2d 3e 6c 72 75 3c 6d 69 6e 4c 72 75 20 29 7b  p->lru<minLru ){
14960 0a 20 20 20 20 20 20 69 64 78 4c 72 75 20 3d 20  .      idxLru = 
14970 69 3b 0a 20 20 20 20 20 20 6d 69 6e 4c 72 75 20  i;.      minLru 
14980 3d 20 70 2d 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a  = p->lru;.    }.
14990 20 20 7d 0a 20 20 69 66 28 20 41 4c 57 41 59 53    }.  if( ALWAYS
149a0 28 69 64 78 4c 72 75 3e 3d 30 29 20 29 7b 0a 20  (idxLru>=0) ){. 
149b0 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
149c0 61 43 6f 6c 43 61 63 68 65 5b 69 64 78 4c 72 75  aColCache[idxLru
149d0 5d 3b 0a 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c  ];.    p->iLevel
149e0 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
149f0 65 4c 65 76 65 6c 3b 0a 20 20 20 20 70 2d 3e 69  eLevel;.    p->i
14a00 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
14a10 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69    p->iColumn = i
14a20 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 69 52 65 67  Col;.    p->iReg
14a30 20 3d 20 69 52 65 67 3b 0a 20 20 20 20 70 2d 3e   = iReg;.    p->
14a40 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20  tempReg = 0;.   
14a50 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65   p->lru = pParse
14a60 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20  ->iCacheCnt++;. 
14a70 20 20 20 61 73 73 65 72 74 28 20 63 61 63 68 65     assert( cache
14a80 49 73 56 61 6c 69 64 28 70 50 61 72 73 65 29 20  IsValid(pParse) 
14a90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
14aa0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69   }.}../*.** Indi
14ab0 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73 74  cate that regist
14ac0 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65 67  ers between iReg
14ad0 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61 72  ..iReg+nReg-1 ar
14ae0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
14af0 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74 68  ten..** Purge th
14b00 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  e range of regis
14b10 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ters from the co
14b20 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a 76  lumn cache..*/.v
14b30 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
14b40 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73 65  acheRemove(Parse
14b50 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
14b60 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
14b70 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
14b80 65 20 2a 70 3b 0a 20 20 69 66 28 20 69 52 65 67  e *p;.  if( iReg
14b90 3c 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  <=0 || pParse->n
14ba0 43 6f 6c 43 61 63 68 65 3d 3d 30 20 29 20 72 65  ColCache==0 ) re
14bb0 74 75 72 6e 3b 0a 20 20 70 20 3d 20 26 70 50 61  turn;.  p = &pPa
14bc0 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 53  rse->aColCache[S
14bd0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
14be0 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  -1];.  while(1){
14bf0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67  .    if( p->iReg
14c00 20 3e 3d 20 69 52 65 67 20 26 26 20 70 2d 3e 69   >= iReg && p->i
14c10 52 65 67 20 3c 20 69 52 65 67 2b 6e 52 65 67 20  Reg < iReg+nReg 
14c20 29 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61  ) cacheEntryClea
14c30 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  r(pParse, p);.  
14c40 20 20 69 66 28 20 70 3d 3d 70 50 61 72 73 65 2d    if( p==pParse-
14c50 3e 61 43 6f 6c 43 61 63 68 65 20 29 20 62 72 65  >aColCache ) bre
14c60 61 6b 3b 0a 20 20 20 20 70 2d 2d 3b 0a 20 20 7d  ak;.    p--;.  }
14c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
14c80 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  er the current c
14c90 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e 74  olumn cache cont
14ca0 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65 6e  ext.  Any new en
14cb0 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20 61  tries added.** a
14cc0 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c 75  dded to the colu
14cd0 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20 74  mn cache after t
14ce0 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65 6d  his call are rem
14cf0 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  oved when the.**
14d00 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
14d10 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f  op occurs..*/.vo
14d20 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
14d30 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a 70  chePush(Parse *p
14d40 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
14d50 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b 3b  ->iCacheLevel++;
14d60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
14d70 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72 73  EBUG.  if( pPars
14d80 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
14d90 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
14da0 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e  race ){.    prin
14db0 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c 6e  tf("PUSH to %d\n
14dc0 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  ", pParse->iCach
14dd0 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65 6e  eLevel);.  }.#en
14de0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
14df0 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6c  ove from the col
14e00 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65 6e  umn cache any en
14e10 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  tries that were 
14e20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65 0a  added since the.
14e30 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
14e40 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14e50 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Push operation. 
14e60 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
14e70 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65 20   restore.** the 
14e80 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74 61  cache to the sta
14e90 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72 69  te it was in pri
14ea0 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
14eb0 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69 64  nt Push..*/.void
14ec0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14ed0 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
14ee0 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  se){.  int i;.  
14ef0 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
14f00 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70   *p;.  assert( p
14f10 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
14f20 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72 73  el>=1 );.  pPars
14f30 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d 2d  e->iCacheLevel--
14f40 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14f50 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
14f60 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
14f70 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
14f80 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
14f90 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64 5c  ntf("POP  to %d\
14fa0 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
14fb0 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
14fc0 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ndif.  for(i=0, 
14fd0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
14fe0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
14ff0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
15000 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
15010 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76 65  iReg && p->iLeve
15020 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  l>pParse->iCache
15030 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 63  Level ){.      c
15040 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28 70  acheEntryClear(p
15050 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
15060 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
15070 65 6e 20 61 20 63 61 63 68 65 64 20 63 6f 6c 75  en a cached colu
15080 6d 6e 20 69 73 20 72 65 75 73 65 64 2c 20 6d 61  mn is reused, ma
15090 6b 65 20 73 75 72 65 20 74 68 61 74 20 69 74 73  ke sure that its
150a0 20 72 65 67 69 73 74 65 72 20 69 73 0a 2a 2a 20   register is.** 
150b0 6e 6f 20 6c 6f 6e 67 65 72 20 61 76 61 69 6c 61  no longer availa
150c0 62 6c 65 20 61 73 20 61 20 74 65 6d 70 20 72 65  ble as a temp re
150d0 67 69 73 74 65 72 2e 20 20 74 69 63 6b 65 74 20  gister.  ticket 
150e0 23 33 38 37 39 3a 20 20 74 68 61 74 20 73 61 6d  #3879:  that sam
150f0 65 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 6d 69  e.** register mi
15100 67 68 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  ght be in the ca
15110 63 68 65 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  che in multiple 
15120 70 6c 61 63 65 73 2c 20 73 6f 20 62 65 20 73 75  places, so be su
15130 72 65 20 74 6f 0a 2a 2a 20 67 65 74 20 74 68 65  re to.** get the
15140 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  m all..*/.static
15150 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70   void sqlite3Exp
15160 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
15170 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
15180 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 6e   int iReg){.  in
15190 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43  t i;.  struct yC
151a0 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f  olCache *p;.  fo
151b0 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
151c0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
151d0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
151e0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
151f0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 69 52 65  if( p->iReg==iRe
15200 67 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 65  g ){.      p->te
15210 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  mpReg = 0;.    }
15220 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  .  }.}../* Gener
15230 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
15240 6c 6c 20 6c 6f 61 64 20 69 6e 74 6f 20 72 65 67  ll load into reg
15250 69 73 74 65 72 20 72 65 67 4f 75 74 20 61 20 76  ister regOut a v
15260 61 6c 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  alue that is.** 
15270 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
15280 74 68 65 20 69 49 64 78 43 6f 6c 2d 74 68 20 63  the iIdxCol-th c
15290 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
152a0 49 64 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Idx..*/.void sql
152b0 69 74 65 33 45 78 70 72 43 6f 64 65 4c 6f 61 64  ite3ExprCodeLoad
152c0 49 6e 64 65 78 43 6f 6c 75 6d 6e 28 0a 20 20 50  IndexColumn(.  P
152d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 2f  arse *pParse,  /
152e0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
152f0 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78  ntext */.  Index
15300 20 2a 70 49 64 78 2c 20 20 20 20 2f 2a 20 54 68   *pIdx,    /* Th
15310 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 63 6f  e index whose co
15320 6c 75 6d 6e 20 69 73 20 74 6f 20 62 65 20 6c 6f  lumn is to be lo
15330 61 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  aded */.  int iT
15340 61 62 43 75 72 2c 20 20 20 20 2f 2a 20 43 75 72  abCur,    /* Cur
15350 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
15360 61 20 74 61 62 6c 65 20 72 6f 77 20 2a 2f 0a 20  a table row */. 
15370 20 69 6e 74 20 69 49 64 78 43 6f 6c 2c 20 20 20   int iIdxCol,   
15380 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6f   /* The column o
15390 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 62  f the index to b
153a0 65 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 69 6e  e loaded */.  in
153b0 74 20 72 65 67 4f 75 74 20 20 20 20 20 20 2f 2a  t regOut      /*
153c0 20 53 74 6f 72 65 20 74 68 65 20 69 6e 64 65 78   Store the index
153d0 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e   column value in
153e0 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a   this register *
153f0 2f 0a 29 7b 0a 20 20 69 31 36 20 69 54 61 62 43  /.){.  i16 iTabC
15400 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
15410 75 6d 6e 5b 69 49 64 78 43 6f 6c 5d 3b 0a 20 20  umn[iIdxCol];.  
15420 69 66 28 20 69 54 61 62 43 6f 6c 3d 3d 58 4e 5f  if( iTabCol==XN_
15430 45 58 50 52 20 29 7b 0a 20 20 20 20 61 73 73 65  EXPR ){.    asse
15440 72 74 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78  rt( pIdx->aColEx
15450 70 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  pr );.    assert
15460 28 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72  ( pIdx->aColExpr
15470 2d 3e 6e 45 78 70 72 3e 69 49 64 78 43 6f 6c 20  ->nExpr>iIdxCol 
15480 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
15490 53 65 6c 66 54 61 62 20 3d 20 69 54 61 62 43 75  SelfTab = iTabCu
154a0 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  r;.    sqlite3Ex
154b0 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61 72 73  prCodeCopy(pPars
154c0 65 2c 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70  e, pIdx->aColExp
154d0 72 2d 3e 61 5b 69 49 64 78 43 6f 6c 5d 2e 70 45  r->a[iIdxCol].pE
154e0 78 70 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  xpr, regOut);.  
154f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
15500 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c  e3ExprCodeGetCol
15510 75 6d 6e 4f 66 54 61 62 6c 65 28 70 50 61 72 73  umnOfTable(pPars
15520 65 2d 3e 70 56 64 62 65 2c 20 70 49 64 78 2d 3e  e->pVdbe, pIdx->
15530 70 54 61 62 6c 65 2c 20 69 54 61 62 43 75 72 2c  pTable, iTabCur,
15540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15560 20 20 20 20 20 69 54 61 62 43 6f 6c 2c 20 72 65       iTabCol, re
15570 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  gOut);.  }.}../*
15580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
15590 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
155a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43   value of the iC
155b0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
155c0 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  a table..*/.void
155d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
155e0 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65  GetColumnOfTable
155f0 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
15600 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
15610 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
15620 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  on */.  Table *p
15630 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74  Tab,    /* The t
15640 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
15650 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  the value */.  i
15660 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f  nt iTabCur,    /
15670 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72 73  * The table curs
15680 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63  or.  Or the PK c
15690 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55  ursor for WITHOU
156a0 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74  T ROWID */.  int
156b0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20   iCol,       /* 
156c0 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  Index of the col
156d0 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a  umn to extract *
156e0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20  /.  int regOut  
156f0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
15700 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  he value into th
15710 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29  is register */.)
15720 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c  {.  if( iCol<0 |
15730 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  | iCol==pTab->iP
15740 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
15750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15760 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75  OP_Rowid, iTabCu
15770 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65  r, regOut);.  }e
15780 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  lse{.    int op 
15790 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  = IsVirtual(pTab
157a0 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a  ) ? OP_VColumn :
157b0 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   OP_Column;.    
157c0 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20  int x = iCol;.  
157d0 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
157e0 70 54 61 62 29 20 26 26 20 21 49 73 56 69 72 74  pTab) && !IsVirt
157f0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
15800 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
15810 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69  lumnOfIndex(sqli
15820 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
15830 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b  ex(pTab), iCol);
15840 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15850 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15860 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c 20  op, iTabCur, x, 
15870 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  regOut);.  }.  i
15880 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
15890 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44    sqlite3ColumnD
158a0 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c 20  efault(v, pTab, 
158b0 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20  iCol, regOut);. 
158c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
158d0 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
158e0 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65 20  ill extract the 
158f0 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d  iColumn-th colum
15900 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20  n from.** table 
15910 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20 74  pTab and store t
15920 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
15930 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20 0a  in a register. .
15940 2a 2a 0a 2a 2a 20 41 6e 20 65 66 66 6f 72 74 20  **.** An effort 
15950 69 73 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65  is made to store
15960 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
15970 65 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52  e in register iR
15980 65 67 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  eg.  This.** is 
15990 6e 6f 74 20 67 61 72 61 6e 74 65 65 65 64 20 66  not garanteeed f
159a0 6f 72 20 47 65 74 43 6f 6c 75 6d 6e 28 29 20 2d  or GetColumn() -
159b0 20 74 68 65 20 72 65 73 75 6c 74 20 63 61 6e 20   the result can 
159c0 62 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  be stored in.** 
159d0 61 6e 79 20 72 65 67 69 73 74 65 72 2e 20 20 42  any register.  B
159e0 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ut the result is
159f0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
15a00 61 6e 64 20 69 6e 20 72 65 67 69 73 74 65 72 20  and in register 
15a10 69 52 65 67 0a 2a 2a 20 66 6f 72 20 47 65 74 43  iReg.** for GetC
15a20 6f 6c 75 6d 6e 54 6f 52 65 67 28 29 2e 0a 2a 2a  olumnToReg()..**
15a30 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
15a40 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72  e an open cursor
15a50 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62   to pTab in iTab
15a60 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
15a70 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
15a80 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30  d.  If iColumn<0
15a90 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65   then code is ge
15aa0 6e 65 72 61 74 65 64 20 74 68 61 74 20 65 78 74  nerated that ext
15ab0 72 61 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e  racts the rowid.
15ac0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
15ad0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
15ae0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15af0 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  e,   /* Parsing 
15b00 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
15b10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15b20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
15b30 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
15b40 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
15b50 20 61 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f   are reading fro
15b60 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  m */.  int iColu
15b70 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  mn,     /* Index
15b80 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f   of the table co
15b90 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54  lumn */.  int iT
15ba0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  able,      /* Th
15bb0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  e cursor pointin
15bc0 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a  g to the table *
15bd0 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20  /.  int iReg,   
15be0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65       /* Store re
15bf0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
15c00 75 38 20 70 35 20 20 20 20 20 20 20 20 20 20 20  u8 p5           
15c10 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72   /* P5 value for
15c20 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2b 20 46 4c 41   OP_Column + FLA
15c30 47 53 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  GS */.){.  Vdbe 
15c40 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
15c50 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
15c60 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
15c70 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  *p;..  for(i=0, 
15c80 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
15c90 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
15ca0 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
15cb0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
15cc0 69 52 65 67 3e 30 20 26 26 20 70 2d 3e 69 54 61  iReg>0 && p->iTa
15cd0 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
15ce0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  ->iColumn==iColu
15cf0 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6c  mn ){.      p->l
15d00 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
15d10 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
15d20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15d30 50 69 6e 52 65 67 69 73 74 65 72 28 70 50 61 72  PinRegister(pPar
15d40 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b 0a 20 20  se, p->iReg);.  
15d50 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 52      return p->iR
15d60 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a  eg;.    }.  }  .
15d70 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
15d80 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
15d90 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61  odeGetColumnOfTa
15da0 62 6c 65 28 76 2c 20 70 54 61 62 2c 20 69 54 61  ble(v, pTab, iTa
15db0 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20 69 52  ble, iColumn, iR
15dc0 65 67 29 3b 0a 20 20 69 66 28 20 70 35 20 29 7b  eg);.  if( p5 ){
15dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15de0 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35 29 3b  ChangeP5(v, p5);
15df0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a 20 20 20  .  }else{   .   
15e00 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
15e10 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
15e20 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c 20  Table, iColumn, 
15e30 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iReg);.  }.  ret
15e40 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 76 6f 69 64  urn iReg;.}.void
15e50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15e60 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 0a  GetColumnToReg(.
15e70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
15e80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
15e90 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
15ea0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
15eb0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
15ec0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
15ed0 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
15ee0 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
15ef0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
15f00 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
15f10 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
15f20 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
15f30 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
15f40 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
15f50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
15f60 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
15f70 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
15f80 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
15f90 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
15fa0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
15fb0 6d 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  mn(pParse, pTab,
15fc0 20 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 6c 65   iColumn, iTable
15fd0 2c 20 69 52 65 67 2c 20 30 29 3b 0a 20 20 69 66  , iReg, 0);.  if
15fe0 28 20 72 31 21 3d 69 52 65 67 20 29 20 73 71 6c  ( r1!=iReg ) sql
15ff0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
16000 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
16010 5f 53 43 6f 70 79 2c 20 72 31 2c 20 69 52 65 67  _SCopy, r1, iReg
16020 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
16030 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
16040 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
16050 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
16060 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
16070 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
16080 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
16090 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20  lCache *p;..#if 
160a0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
160b0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
160c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
160d0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
160e0 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41      printf("CLEA
160f0 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  R\n");.  }.#endi
16100 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
16110 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
16120 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
16130 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
16140 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
16150 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
16160 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
16170 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
16180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
16190 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61   the fact that a
161a0 6e 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67  n affinity chang
161b0 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f  e has occurred o
161c0 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69  n iCount.** regi
161d0 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77  sters starting w
161e0 69 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76  ith iStart..*/.v
161f0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
16200 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
16210 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
16220 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e  , int iStart, in
16230 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c  t iCount){.  sql
16240 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
16250 6f 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61  ove(pParse, iSta
16260 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a  rt, iCount);.}..
16270 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16280 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74  ode to move cont
16290 65 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65  ent from registe
162a0 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d  rs iFrom...iFrom
162b0 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20  +nReg-1.** over 
162c0 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67  to iTo..iTo+nReg
162d0 2d 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c  -1. Keep the col
162e0 75 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d  umn cache up-to-
162f0 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  date..*/.void sq
16300 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
16310 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
16320 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
16330 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  iTo, int nReg){.
16340 20 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e    assert( iFrom>
16350 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72  =iTo+nReg || iFr
16360 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a  om+nReg<=iTo );.
16370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16380 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
16390 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f  e, OP_Move, iFro
163a0 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20  m, iTo, nReg);. 
163b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
163c0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
163d0 69 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a  iFrom, nReg);.}.
163e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
163f0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
16400 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
16410 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
16420 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
16430 20 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e   any register in
16440 20 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d   the range iFrom
16450 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65  ..iTo (inclusive
16460 29 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20  ).** is used as 
16470 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  part of the colu
16480 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  mn cache..**.** 
16490 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
164a0 75 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65  used within asse
164b0 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73  rt() and testcas
164c0 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a  e() macros only.
164d0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ** and does not 
164e0 61 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d  appear in a norm
164f0 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  al build..*/.sta
16500 74 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f  tic int usedAsCo
16510 6c 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20  lumnCache(Parse 
16520 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72  *pParse, int iFr
16530 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
16540 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
16550 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20  yColCache *p;.  
16560 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
16570 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
16580 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
16590 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
165a0 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65    int r = p->iRe
165b0 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46  g;.    if( r>=iF
165c0 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20  rom && r<=iTo ) 
165d0 72 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e  return 1;    /*N
165e0 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72  O_TEST*/.  }.  r
165f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
16600 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16610 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45  G || SQLITE_COVE
16620 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f  RAGE_TEST */.../
16630 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
16640 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
16650 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52  to a TK_REGISTER
16660 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16670 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 45  exprToRegister(E
16680 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67  xpr *p, int iReg
16690 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d  ){.  p->op2 = p-
166a0 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  >op;.  p->op = T
166b0 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d  K_REGISTER;.  p-
166c0 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a  >iTable = iReg;.
166d0 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65    ExprClearPrope
166e0 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b  rty(p, EP_Skip);
166f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
16700 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
16710 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
16720 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
16730 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
16740 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73  n.  Attempt to s
16750 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
16760 20 69 6e 20 72 65 67 69 73 74 65 72 20 22 74 61   in register "ta
16770 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e  rget"..** Return
16780 20 74 68 65 20 72 65 67 69 73 74 65 72 20 77 68   the register wh
16790 65 72 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  ere results are 
167a0 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69  stored..**.** Wi
167b0 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  th this routine,
167c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61   there is no gua
167d0 72 61 6e 74 65 65 20 74 68 61 74 20 72 65 73 75  rantee that resu
167e0 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73  lts will.** be s
167f0 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e  tored in target.
16800 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67    The result mig
16810 68 74 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ht be stored in 
16820 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65  some other.** re
16830 67 69 73 74 65 72 20 69 66 20 69 74 20 69 73 20  gister if it is 
16840 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f  convenient to do
16850 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e   so.  The callin
16860 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75  g function.** mu
16870 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
16880 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76  urn code and mov
16890 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  e the results to
168a0 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20   the desired.** 
168b0 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74  register..*/.int
168c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
168d0 54 61 72 67 65 74 28 50 61 72 73 65 20 2a 70 50  Target(Parse *pP
168e0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
168f0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
16900 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
16910 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54  se->pVdbe;  /* T
16920 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73  he VM under cons
16930 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
16940 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
16950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
16960 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65  pcode being code
16970 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67  d */.  int inReg
16980 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20 20 20   = target;      
16990 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72   /* Results stor
169a0 65 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 69  ed in register i
169b0 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65  nReg */.  int re
169c0 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20  gFree1 = 0;     
169d0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
169e0 72 6f 20 66 72 65 65 20 74 68 69 73 20 74 65 6d  ro free this tem
169f0 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
16a00 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
16a10 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  2 = 0;         /
16a20 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
16a30 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
16a40 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
16a50 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20  int r1, r2, r3, 
16a60 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72  r4;       /* Var
16a70 69 6f 75 73 20 72 65 67 69 73 74 65 72 20 6e 75  ious register nu
16a80 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  mbers */.  sqlit
16a90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16aa0 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
16ab0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16ac0 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b  */.  Expr tempX;
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ae0 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72  * Temporary expr
16af0 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a  ession node */..
16b00 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74    assert( target
16b10 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50  >0 && target<=pP
16b20 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20  arse->nMem );.  
16b30 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
16b40 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
16b50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16b60 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
16b70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78  ;.  }..  if( pEx
16b80 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
16b90 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
16ba0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
16bb0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
16bc0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
16bd0 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
16be0 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49  MN: {.      AggI
16bf0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
16c00 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b  pExpr->pAggInfo;
16c10 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67  .      struct Ag
16c20 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
16c30 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
16c40 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a  l[pExpr->iAgg];.
16c50 20 20 20 20 20 20 69 66 28 20 21 70 41 67 67 49        if( !pAggI
16c60 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
16c70 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
16c80 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20  t( pCol->iMem>0 
16c90 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67  );.        inReg
16ca0 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20   = pCol->iMem;. 
16cb0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16cc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41      }else if( pA
16cd0 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69  ggInfo->useSorti
16ce0 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20  ngIdx ){.       
16cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16d00 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
16d10 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69   pAggInfo->sorti
16d20 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20  ngIdxPTab,.     
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
16d50 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61  SorterColumn, ta
16d60 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62  rget);.        b
16d70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
16d80 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
16d90 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  , fall thru into
16da0 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63   the TK_COLUMN c
16db0 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
16dc0 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
16dd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61   {.      int iTa
16de0 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  b = pExpr->iTabl
16df0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  e;.      if( iTa
16e00 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  b<0 ){.        i
16e10 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73  f( pParse->ckBas
16e20 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
16e30 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43   /* Generating C
16e40 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
16e50 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   or inserting in
16e60 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78  to partial index
16e70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
16e80 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Reg = pExpr->iCo
16e90 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63  lumn + pParse->c
16ea0 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  kBase;.         
16eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16ed0 20 2f 2a 20 43 6f 64 69 6e 67 20 61 6e 20 65 78   /* Coding an ex
16ee0 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73  pression that is
16ef0 20 70 61 72 74 20 6f 66 20 61 6e 20 69 6e 64 65   part of an inde
16f00 78 20 77 68 65 72 65 20 63 6f 6c 75 6d 6e 20 6e  x where column n
16f10 61 6d 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ames.          *
16f20 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 72  * in the index r
16f30 65 66 65 72 20 74 6f 20 74 68 65 20 74 61 62 6c  efer to the tabl
16f40 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
16f50 6e 64 65 78 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  ndex belongs */.
16f60 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d            iTab =
16f70 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 66 54 61   pParse->iSelfTa
16f80 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  b;.        }.   
16f90 20 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67     }.      inReg
16fa0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16fb0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
16fc0 73 65 2c 20 70 45 78 70 72 2d 3e 70 54 61 62 2c  se, pExpr->pTab,
16fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
17000 69 54 61 62 2c 20 74 61 72 67 65 74 2c 0a 20 20  iTab, target,.  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
17030 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20 20 20 20  pr->op2);.      
17040 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17050 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
17060 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e  : {.      codeIn
17070 74 65 67 65 72 28 70 50 61 72 73 65 2c 20 70 45  teger(pParse, pE
17080 78 70 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  xpr, 0, target);
17090 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
170a0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
170b0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
170c0 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
170d0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
170e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
170f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
17100 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
17110 3b 0a 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c  ;.      codeReal
17120 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  (v, pExpr->u.zTo
17130 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65 74 29 3b  ken, 0, target);
17140 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17150 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
17160 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
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 73 71 6c  ue) );.      sql
171b0 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69  ite3VdbeLoadStri
171c0 6e 67 28 76 2c 20 74 61 72 67 65 74 2c 20 70 45  ng(v, target, pE
171d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
171e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
171f0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
17200 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULL: {.      sql
17210 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17220 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 74 61  , OP_Null, 0, ta
17230 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
17240 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
17250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c  f SQLITE_OMIT_BL
17260 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63  OB_LITERAL.    c
17270 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20  ase TK_BLOB: {. 
17280 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
17290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
172a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 6c  .      char *zBl
172b0 6f 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ob;.      assert
172c0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
172d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
172e0 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
172f0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75  assert( pExpr->u
17300 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 78 27 20  .zToken[0]=='x' 
17310 7c 7c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  || pExpr->u.zTok
17320 65 6e 5b 30 5d 3d 3d 27 58 27 20 29 3b 0a 20 20  en[0]=='X' );.  
17330 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17340 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d  r->u.zToken[1]==
17350 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a 20  '\'' );.      z 
17360 3d 20 26 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  = &pExpr->u.zTok
17370 65 6e 5b 32 5d 3b 0a 20 20 20 20 20 20 6e 20 3d  en[2];.      n =
17380 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17390 28 7a 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  (z) - 1;.      a
173a0 73 73 65 72 74 28 20 7a 5b 6e 5d 3d 3d 27 5c 27  ssert( z[n]=='\'
173b0 27 20 29 3b 0a 20 20 20 20 20 20 7a 42 6c 6f 62  ' );.      zBlob
173c0 20 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 42   = sqlite3HexToB
173d0 6c 6f 62 28 73 71 6c 69 74 65 33 56 64 62 65 44  lob(sqlite3VdbeD
173e0 62 28 76 29 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  b(v), z, n);.   
173f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17400 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
17410 20 6e 2f 32 2c 20 74 61 72 67 65 74 2c 20 30 2c   n/2, target, 0,
17420 20 7a 42 6c 6f 62 2c 20 50 34 5f 44 59 4e 41 4d   zBlob, P4_DYNAM
17430 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
17440 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
17450 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
17460 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  BLE: {.      ass
17470 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
17480 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
17490 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
174a0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
174b0 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 3b  ->u.zToken!=0 );
174c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
174d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
174e0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  ]!=0 );.      sq
174f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17500 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20  v, OP_Variable, 
17510 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
17520 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 69  target);.      i
17530 66 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  f( pExpr->u.zTok
17540 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a 20 20 20 20  en[1]!=0 ){.    
17550 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
17560 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
17570 27 3f 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  '?' .           
17580 20 20 7c 7c 20 73 74 72 63 6d 70 28 70 45 78 70    || strcmp(pExp
17590 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 50 61  r->u.zToken, pPa
175a0 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72  rse->azVar[pExpr
175b0 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 29 3d 3d 30  ->iColumn-1])==0
175c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
175d0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
175e0 76 2c 20 2d 31 2c 20 70 50 61 72 73 65 2d 3e 61  v, -1, pParse->a
175f0 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  zVar[pExpr->iCol
17600 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53 54 41 54 49  umn-1], P4_STATI
17610 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  C);.      }.    
17620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17630 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
17640 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52  TER: {.      inR
17650 65 67 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  eg = pExpr->iTab
17660 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  le;.      break;
17670 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
17680 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
17690 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54      case TK_CAST
176a0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70  : {.      /* Exp
176b0 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
176c0 66 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65  form:   CAST(pLe
176d0 66 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a  ft AS token) */.
176e0 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
176f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
17700 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
17710 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
17720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52  );.      if( inR
17730 65 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20  eg!=target ){.  
17740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
17760 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
17770 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  et);.        inR
17780 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
17790 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
177a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
177b0 4f 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c  OP_Cast, target,
177c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
177d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
177e0 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
177f0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
17800 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
17810 65 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43  e( usedAsColumnC
17820 61 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52  ache(pParse, inR
17830 65 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20  eg, inReg) );.  
17840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17850 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
17860 67 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67  ge(pParse, inReg
17870 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
17880 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
17890 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
178a0 41 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  AST */.    case 
178b0 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
178c0 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
178d0 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
178e0 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
178f0 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
17900 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72  TK_EQ: {.      r
17910 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
17920 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
17930 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
17940 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
17950 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
17960 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
17970 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
17980 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
17990 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
179a0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
179b0 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
179c0 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  t, op,.         
179d0 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
179e0 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53   inReg, SQLITE_S
179f0 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61  TOREP2);.      a
17a00 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
17a10 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
17a20 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
17a30 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
17a40 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
17a50 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
17a60 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
17a70 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
17a80 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
17a90 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
17aa0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
17ab0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
17ac0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
17ad0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
17ae0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17af0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
17b00 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
17b10 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
17b20 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
17b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
17b40 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
17b50 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
17b60 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
17b70 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
17b80 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
17b90 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
17ba0 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
17bb0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
17bc0 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
17bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
17be0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
17bf0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
17c00 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
17c10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17c20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
17c30 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
17c40 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
17c50 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
17c60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17c70 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
17c80 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
17c90 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
17ca0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
17cb0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
17cc0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
17cd0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
17ce0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
17cf0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
17d00 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
17d10 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
17d20 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
17d30 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
17d40 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
17d50 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
17d60 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
17d70 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
17d80 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
17d90 4f 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e  OREP2 | SQLITE_N
17da0 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64  ULLEQ);.      Vd
17db0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
17dc0 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20  op==TK_EQ);.    
17dd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
17de0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a  (v, op==TK_NE);.
17df0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17e00 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
17e10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
17e20 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
17e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17e40 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
17e50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
17e60 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
17e70 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
17e80 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
17e90 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
17ea0 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
17eb0 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
17ec0 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
17ed0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
17ee0 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
17ef0 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
17f00 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
17f10 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
17f20 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
17f30 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
17f40 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65  );            te
17f50 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41  stcase( op==TK_A
17f60 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
17f70 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72  rt( TK_OR==OP_Or
17f80 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
17f90 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
17fa0 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73  K_OR );.      as
17fb0 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
17fc0 50 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20  P_Add );        
17fd0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
17fe0 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20  =TK_PLUS );.    
17ff0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e    assert( TK_MIN
18000 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20  US==OP_Subtract 
18010 29 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28  );     testcase(
18020 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b   op==TK_MINUS );
18030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18040 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e  K_REM==OP_Remain
18050 64 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74  der );      test
18060 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d  case( op==TK_REM
18070 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18080 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f  ( TK_BITAND==OP_
18090 42 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74  BitAnd );      t
180a0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
180b0 42 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20  BITAND );.      
180c0 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52  assert( TK_BITOR
180d0 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20  ==OP_BitOr );   
180e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
180f0 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20  p==TK_BITOR );. 
18100 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
18110 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
18120 20 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61   );       testca
18130 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48  se( op==TK_SLASH
18140 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18150 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
18160 53 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74  ShiftLeft );   t
18170 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
18180 4c 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20  LSHIFT );.      
18190 61 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46  assert( TK_RSHIF
181a0 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74  T==OP_ShiftRight
181b0 20 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f   );  testcase( o
181c0 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a  p==TK_RSHIFT );.
181d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
181e0 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63  _CONCAT==OP_Conc
181f0 61 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  at );      testc
18200 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43  ase( op==TK_CONC
18210 41 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  AT );.      r1 =
18220 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18230 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
18240 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
18250 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20  ree1);.      r2 
18260 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
18270 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
18280 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65  xpr->pRight, &re
18290 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73  gFree2);.      s
182a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
182b0 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20  (v, op, r2, r1, 
182c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74  target);.      t
182d0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
182e0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
182f0 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
18300 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
18310 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18320 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
18330 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
18340 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
18350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18360 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
18370 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
18380 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
18390 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
183a0 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31  pParse, pLeft, 1
183b0 2c 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64  , target);.#ifnd
183c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
183d0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
183e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
183f0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
18400 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
18410 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
18420 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
18430 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
18440 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c       codeReal(v,
18450 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
18460 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65  , 1, target);.#e
18470 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
18480 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e  {.        tempX.
18490 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b  op = TK_INTEGER;
184a0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66  .        tempX.f
184b0 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c  lags = EP_IntVal
184c0 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b  ue|EP_TokenOnly;
184d0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75  .        tempX.u
184e0 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20  .iValue = 0;.   
184f0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
18500 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
18510 61 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72  arse, &tempX, &r
18520 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
18530 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
18540 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
18550 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
18560 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
18570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18580 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
18590 74 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74  tract, r2, r1, t
185a0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
185b0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
185c0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  e2==0 );.      }
185d0 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74  .      inReg = t
185e0 61 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65  arget;.      bre
185f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18600 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
18610 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
18620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
18630 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74  K_BITNOT==OP_Bit
18640 4e 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73  Not );   testcas
18650 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54  e( op==TK_BITNOT
18660 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
18670 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
18680 20 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74   );         test
18690 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
186a0 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73   );.      r1 = s
186b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
186c0 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
186d0 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65  ->pLeft, &regFre
186e0 65 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e1);.      testc
186f0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
18700 20 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20   );.      inReg 
18710 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
18720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18730 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52  2(v, op, r1, inR
18740 65 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  eg);.      break
18750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18760 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
18770 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
18780 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
18790 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
187a0 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
187b0 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63  sNull );   testc
187c0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55  ase( op==TK_ISNU
187d0 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LL );.      asse
187e0 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d  rt( TK_NOTNULL==
187f0 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65  OP_NotNull ); te
18800 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e  stcase( op==TK_N
18810 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  OTNULL );.      
18820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18830 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
18840 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20   1, target);.   
18850 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
18860 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
18870 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
18880 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
18890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
188a0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
188b0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
188c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f  3VdbeAddOp1(v, o
188d0 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  p, r1);.      Vd
188e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
188f0 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
18900 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
18910 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
18920 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  OTNULL);.      s
18930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18940 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
18950 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
18960 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18970 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
18980 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18990 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
189a0 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
189b0 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49       AggInfo *pI
189c0 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67  nfo = pExpr->pAg
189d0 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  gInfo;.      if(
189e0 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20   pInfo==0 ){.   
189f0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
18a00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
18a10 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
18a20 29 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) );.        sql
18a30 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18a40 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
18a50 61 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22  aggregate: %s()"
18a60 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
18a70 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
18a80 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
18a90 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45   pInfo->aFunc[pE
18aa0 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b  xpr->iAgg].iMem;
18ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
18ac0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18ad0 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
18ae0 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
18af0 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
18b00 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
18b10 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
18b20 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72  /.      int nFar
18b30 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
18b40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63  * Number of func
18b50 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
18b60 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
18b70 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f  *pDef;         /
18b80 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  * The function d
18b90 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74  efinition object
18ba0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
18bb0 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
18bc0 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
18bd0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 75   name */.      u
18be0 33 32 20 63 6f 6e 73 74 4d 61 73 6b 20 3d 20 30  32 constMask = 0
18bf0 3b 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  ;     /* Mask of
18c00 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
18c10 6e 74 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e  nts that are con
18c20 73 74 61 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  stant */.      i
18c30 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
18c40 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18c50 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  unter */.      u
18c60 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
18c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
18c80 74 20 65 6e 63 6f 64 69 6e 67 20 75 73 65 64 20  t encoding used 
18c90 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
18ca0 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   */.      CollSe
18cb0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 20 20 20  q *pColl = 0;   
18cc0 20 2f 2a 20 41 20 63 6f 6c 6c 61 74 69 6e 67 20   /* A collating 
18cd0 73 65 71 75 65 6e 63 65 20 2a 2f 0a 0a 20 20 20  sequence */..   
18ce0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
18cf0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
18d00 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
18d10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
18d20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
18d30 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
18d40 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  y) ){.        pF
18d50 61 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  arg = 0;.      }
18d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
18d70 61 72 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  arg = pExpr->x.p
18d80 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
18d90 20 20 20 20 6e 46 61 72 67 20 3d 20 70 46 61 72      nFarg = pFar
18da0 67 20 3f 20 70 46 61 72 67 2d 3e 6e 45 78 70 72  g ? pFarg->nExpr
18db0 20 3a 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   : 0;.      asse
18dc0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
18dd0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
18de0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
18df0 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
18e00 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70  .zToken;.      p
18e10 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
18e20 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49  dFunction(db, zI
18e30 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30  d, nFarg, enc, 0
18e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
18e50 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46  f==0 || pDef->xF
18e60 69 6e 61 6c 69 7a 65 21 3d 30 20 29 7b 0a 20 20  inalize!=0 ){.  
18e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
18e80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
18e90 6e 6b 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a  nknown function:
18ea0 20 25 73 28 29 22 2c 20 7a 49 64 29 3b 0a 20 20   %s()", zId);.  
18eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18ec0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41     }..      /* A
18ed0 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74 20  ttempt a direct 
18ee0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
18ef0 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43  f the built-in C
18f00 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20  OALESCE() and.  
18f10 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20      ** IFNULL() 
18f20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
18f30 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73   avoids unnecess
18f40 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  ary evaluation o
18f50 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d  f.      ** argum
18f60 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66 69  ents past the fi
18f70 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  rst non-NULL arg
18f80 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
18f90 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
18fa0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
18fb0 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45  TE_FUNC_COALESCE
18fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
18fd0 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71  endCoalesce = sq
18fe0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
18ff0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61  el(v);.        a
19000 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20  ssert( nFarg>=2 
19010 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19020 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
19030 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
19040 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
19050 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
19060 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
19070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
19090 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74  _NotNull, target
190a0 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a  , endCoalesce);.
190b0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
190c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
190d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
190e0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
190f0 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a  se, target, 1);.
19100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19110 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19120 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
19130 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19140 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d  e(pParse, pFarg-
19150 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72  >a[i].pExpr, tar
19160 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  get);.          
19170 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
19180 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
19190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
191a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
191b0 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61  eLabel(v, endCoa
191c0 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20  lesce);.        
191d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
191e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c        /* The UNL
191f0 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e  IKELY() function
19200 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68   is a no-op.  Th
19210 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65 20  e result is the 
19220 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f  value.      ** o
19230 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  f the first argu
19240 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
19250 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
19260 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
19270 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
19280 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
19290 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20  t( nFarg>=1 );. 
192a0 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73         inReg = s
192b0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
192c0 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 46 61  rget(pParse, pFa
192d0 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
192e0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
192f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
19300 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
19310 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
19320 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
19330 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
19340 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
19350 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
19360 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
19370 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20  e( i==31 );.    
19380 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
19390 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b  |= MASKBIT32(i);
193a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
193b0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
193c0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
193d0 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
193e0 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
193f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
19400 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
19410 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
19420 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
19430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19440 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
19450 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rg ){.        if
19460 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20  ( constMask ){. 
19470 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50           r1 = pP
19480 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
19490 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
194a0 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20  nMem += nFarg;. 
194b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
194c0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
194d0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
194e0 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
194f0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
19500 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74      /* For lengt
19510 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
19520 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
19530 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e  a column argumen
19540 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  t,.        ** se
19550 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  t the P5 paramet
19560 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c  er to the OP_Col
19570 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  umn opcode to OP
19580 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20  FLAG_LENGTHARG. 
19590 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46         ** or OPF
195a0 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65  LAG_TYPEOFARG re
195b0 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61  spectively, to a
195c0 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
195d0 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a   data.        **
195e0 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   loading..      
195f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
19600 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
19610 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
19620 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
19630 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
19640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
19650 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
19660 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
19670 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
19680 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
19690 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
196a0 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
196b0 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
196c0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
196d0 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
196e0 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
196f0 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
19700 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
19710 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
19720 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
19730 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
19740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
19750 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
19760 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
19770 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
19780 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
19790 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  se( pDef->funcFl
197a0 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e  ags & OPFLAG_LEN
197b0 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
197c0 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30        pFarg->a[0
197d0 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a  ].pExpr->op2 = .
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
19800 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  s & (OPFLAG_LENG
19810 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
19820 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
19830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
19840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
19850 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
19860 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63  rse);     /* Tic
19870 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
19880 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
19890 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
198a0 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  ist(pParse, pFar
198b0 67 2c 20 72 31 2c 20 30 2c 0a 20 20 20 20 20 20  g, r1, 0,.      
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
198e0 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45  _ECEL_DUP|SQLITE
198f0 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20  _ECEL_FACTOR);. 
19900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19910 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
19920 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  e);      /* Tick
19930 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
19940 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
19950 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
19960 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
19970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
19980 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
19990 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
199a0 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
199b0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
199c0 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
199d0 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
199e0 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
199f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
19a00 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
19a10 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
19a20 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
19a30 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
19a40 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
19a50 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
19a60 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
19a70 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
19a80 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
19a90 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
19aa0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
19ab0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
19ac0 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
19ad0 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
19ae0 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
19af0 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
19b00 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
19b10 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
19b20 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
19b30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
19b40 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
19b50 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
19b60 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
19b70 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
19b80 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
19b90 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
19ba0 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
19bb0 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
19bc0 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
19bd0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
19be0 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
19bf0 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
19c00 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
19c10 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
19c20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
19c30 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
19c40 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
19c50 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
19c60 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
19c70 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
19c80 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
19c90 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
19ca0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
19cb0 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
19cc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
19cd0 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
19ce0 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
19cf0 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
19d00 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
19d10 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
19d20 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
19d30 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
19d40 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
19d50 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
19d60 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
19d70 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
19d80 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
19d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
19da0 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
19db0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
19dc0 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
19dd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19df0 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
19e00 6e 30 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72  n0, constMask, r
19e10 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20  1, target,.     
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20     (char*)pDef, 
19e40 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
19e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
19e60 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46  angeP5(v, (u8)nF
19e70 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  arg);.      if( 
19e80 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61  nFarg && constMa
19e90 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sk==0 ){.       
19ea0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
19eb0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
19ec0 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20   r1, nFarg);.   
19ed0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
19ee0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
19ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
19f00 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
19f10 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
19f20 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
19f30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
19f40 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
19f50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19f60 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b  op==TK_SELECT );
19f70 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73  .      inReg = s
19f80 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
19f90 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
19fa0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
19fb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19fc0 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
19fd0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46       int destIfF
19fe0 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  alse = sqlite3Vd
19ff0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a000 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
1a010 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
1a020 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1a030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a040 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1a050 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1a060 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a070 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20  rCodeIN(pParse, 
1a080 70 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c  pExpr, destIfFal
1a090 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b  se, destIfNull);
1a0a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a0b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1a0c0 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65  nteger, 1, targe
1a0d0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a0e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1a0f0 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65  l(v, destIfFalse
1a100 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a120 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c  _AddImm, target,
1a130 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
1a140 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a150 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c  el(v, destIfNull
1a160 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a170 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1a180 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1a190 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a  UERY */...    /*
1a1a0 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54  .    **    x BET
1a1b0 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20  WEEN y AND z.   
1a1c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1a1d0 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
1a1e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a1f0 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a    x>=y AND x<=z.
1a200 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20      **.    ** X 
1a210 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
1a220 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
1a230 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Y is stored in
1a240 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1a250 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [0].pExpr..    *
1a260 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  * Z is stored in
1a270 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
1a280 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a  [1].pExpr..    *
1a290 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  /.    case TK_BE
1a2a0 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
1a2b0 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
1a2c0 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
1a2d0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a2e0 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
1a2f0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1a300 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
1a310 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
1a320 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31  pExpr;..      r1
1a330 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1a340 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1a350 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1a360 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c  ;.      r2 = sql
1a370 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1a380 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
1a390 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1a3a0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1a3b0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1a3c0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1a3d0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1a3e0 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r3 = sqlite3Get
1a3f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a400 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69  .      r4 = sqli
1a410 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1a420 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64  arse);.      cod
1a430 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
1a440 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
1a450 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20  OP_Ge,.         
1a460 20 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c           r1, r2,
1a470 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52   r3, SQLITE_STOR
1a480 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72  EP2);  VdbeCover
1a490 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c  age(v);.      pL
1a4a0 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52  Item++;.      pR
1a4b0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
1a4c0 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
1a4d0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1a4e0 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
1a4f0 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20  e2);.      r2 = 
1a500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1a510 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67  emp(pParse, pRig
1a520 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1a530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a540 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
1a550 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
1a560 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
1a570 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72  pRight, OP_Le, r
1a580 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54  1, r2, r4, SQLIT
1a590 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
1a5a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
1a5b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a5c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a5d0 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61  _And, r3, r4, ta
1a5e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
1a5f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1a600 65 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a  eg(pParse, r3);.
1a610 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1a620 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a630 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62  se, r4);.      b
1a640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1a650 63 61 73 65 20 54 4b 5f 53 50 41 4e 3a 0a 20 20  case TK_SPAN:.  
1a660 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
1a670 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
1a680 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
1a690 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1a6a0 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1a6b0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1a6c0 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
1a6d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1a6e0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
1a6f0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
1a700 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
1a710 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
1a720 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
1a730 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
1a740 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
1a750 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
1a760 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
1a770 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
1a780 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
1a790 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
1a7a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
1a7b0 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
1a7c0 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
1a7d0 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
1a7e0 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
1a7f0 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
1a800 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
1a810 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
1a820 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
1a830 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
1a840 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
1a850 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
1a860 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
1a870 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
1a880 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1a890 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1a8a0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
1a8b0 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
1a8c0 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
1a8d0 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
1a8e0 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
1a8f0 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
1a900 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
1a910 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
1a920 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
1a930 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
1a940 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
1a950 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
1a960 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
1a970 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
1a980 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
1a990 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
1a9a0 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
1a9b0 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
1a9c0 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
1a9d0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
1a9e0 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
1a9f0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
1aa00 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1aa10 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
1aa20 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
1aa30 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
1aa40 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
1aa50 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
1aa60 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
1aa70 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
1aa80 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
1aa90 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1aaa0 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
1aab0 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
1aac0 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
1aad0 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
1aae0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
1aaf0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
1ab00 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
1ab10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1ab20 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
1ab30 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
1ab40 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
1ab50 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
1ab60 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
1ab70 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
1ab80 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
1ab90 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
1aba0 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
1abb0 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
1abc0 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
1abd0 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
1abe0 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
1abf0 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
1ac00 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
1ac10 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
1ac20 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
1ac30 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
1ac40 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
1ac50 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
1ac60 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
1ac70 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
1ac80 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
1ac90 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
1aca0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1acb0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1acc0 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
1acd0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
1ace0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
1acf0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
1ad00 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
1ad10 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
1ad20 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
1ad30 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
1ad40 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
1ad50 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
1ad60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ad70 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
1ad80 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
1ad90 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
1ada0 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
1adb0 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
1adc0 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
1add0 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
1ade0 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
1adf0 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
1ae00 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
1ae10 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
1ae20 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
1ae30 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
1ae40 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
1ae50 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
1ae60 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
1ae70 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
1ae80 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
1ae90 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
1aea0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
1aeb0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
1aec0 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
1aed0 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
1aee0 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
1aef0 6c 79 20 72 65 61 6c 2e 0a 20 20 20 20 20 20 2a  ly real..      *
1af00 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
1af10 4e 43 45 2d 4f 46 3a 20 52 2d 36 30 39 38 35 2d  NCE-OF: R-60985-
1af20 35 37 36 36 32 20 53 51 4c 69 74 65 20 77 69 6c  57662 SQLite wil
1af30 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 76 61  l convert the va
1af40 6c 75 65 20 62 61 63 6b 20 74 6f 0a 20 20 20 20  lue back to.    
1af50 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f    ** floating po
1af60 69 6e 74 20 77 68 65 6e 20 65 78 74 72 61 63 74  int when extract
1af70 69 6e 67 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ing it from the 
1af80 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 20 20  record.  */.    
1af90 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1afa0 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20  lumn>=0 .       
1afb0 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45  && pTab->aCol[pE
1afc0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66  xpr->iColumn].af
1afd0 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
1afe0 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b  FF_REAL.      ){
1aff0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b000 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1b010 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74  _RealAffinity, t
1b020 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  arget);.      }.
1b030 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1b040 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1b050 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41  /*.    ** Form A
1b060 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
1b070 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72  x WHEN e1 THEN r
1b080 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72  1 WHEN e2 THEN r
1b090 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48  2 ... WHEN eN TH
1b0a0 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44  EN rN ELSE y END
1b0b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1b0c0 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20  orm B:.    **   
1b0d0 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48 45  CASE WHEN e1 THE
1b0e0 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48 45  N r1 WHEN e2 THE
1b0f0 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e  N r2 ... WHEN eN
1b100 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20   THEN rN ELSE y 
1b110 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  END.    **.    *
1b120 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20  * Form A is can 
1b130 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  be transformed i
1b140 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65  nto the equivale
1b150 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c  nt form B as fol
1b160 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43  lows:.    **   C
1b170 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48  ASE WHEN x=e1 TH
1b180 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20  EN r1 WHEN x=e2 
1b190 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20  THEN r2 ....    
1b1a0 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20 78  **        WHEN x
1b1b0 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45  =eN THEN rN ELSE
1b1c0 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20   y END.    **.  
1b1d0 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78    ** X (if it ex
1b1e0 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78 70  ists) is in pExp
1b1f0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
1b200 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73   Y is in the las
1b210 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78  t element of pEx
1b220 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70  pr->x.pList if p
1b230 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1b240 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f  Expr is.    ** o
1b250 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c  dd.  The Y is al
1b260 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66  so optional.  If
1b270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1b280 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69  lements in x.pLi
1b290 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65  st.    ** is eve
1b2a0 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69  n, then Y is omi
1b2b0 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74  tted and the "ot
1b2c0 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74 20  herwise" result 
1b2d0 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20  is NULL..    ** 
1b2e0 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e  Ei is in pExpr->
1b2f0 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e  pList->a[i*2] an
1b300 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70  d Ri is pExpr->p
1b310 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a  List->a[i*2+1]..
1b320 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1b330 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
1b340 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
1b350 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69 72  e Ri for the fir
1b360 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a  st matching Ei,.
1b370 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65      ** or if the
1b380 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e  re is no matchin
1b390 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74  g Ei, the ELSE t
1b3a0 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65  erm Y, or if the
1b3b0 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20  re is.    ** no 
1b3c0 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e  ELSE term, NULL.
1b3d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
1b3e0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d  ult: assert( op=
1b3f0 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20  =TK_CASE ); {.  
1b400 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c      int endLabel
1b410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b420 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61        /* GOTO la
1b430 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43  bel for end of C
1b440 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20  ASE stmt */.    
1b450 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20    int nextCase; 
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
1b480 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20  l for next WHEN 
1b490 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
1b4a0 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20  int nExpr;      
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f    /* 2x number o
1b4d0 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a  f WHEN terms */.
1b4e0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b510 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1b520 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1b530 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1b540 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48     /* List of WH
1b550 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
1b560 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1b570 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
1b580 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
1b590 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
1b5a0 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61      Expr opCompa
1b5b0 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
1b5c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d        /* The X==
1b5d0 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  Ei expression */
1b5e0 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b610 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  X expression */.
1b620 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 73        Expr *pTes
1b630 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1b640 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69          /* X==Ei
1b650 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73   (form A) or jus
1b660 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f  t Ei (form B) */
1b670 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28  .      VVA_ONLY(
1b680 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c   int iCacheLevel
1b690 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68   = pParse->iCach
1b6a0 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20  eLevel; )..     
1b6b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1b6c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1b6d0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26   EP_xIsSelect) &
1b6e0 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  & pExpr->x.pList
1b6f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b700 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
1b710 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
1b720 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
1b730 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
1b740 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
1b750 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
1b760 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
1b770 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c  Expr;.      endL
1b780 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
1b790 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b7a0 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d 20        if( (pX = 
1b7b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30  pExpr->pLeft)!=0
1b7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70   ){.        temp
1b7d0 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  X = *pX;.       
1b7e0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f   testcase( pX->o
1b7f0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
1b800 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52 65          exprToRe
1b810 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73  gister(&tempX, s
1b820 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1b830 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26  mp(pParse, pX, &
1b840 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20  regFree1));.    
1b850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1b860 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1b870 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f       opCompare.o
1b880 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20  p = TK_EQ;.     
1b890 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65     opCompare.pLe
1b8a0 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20  ft = &tempX;.   
1b8b0 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70       pTest = &op
1b8c0 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20  Compare;.       
1b8d0 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64   /* Ticket b351d
1b8e0 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39 64  95f9cd5ef17e9d9d
1b8f0 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39 30  bae18f5ca8611190
1b900 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20  001:.        ** 
1b910 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67  The value in reg
1b920 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74 20  Free1 might get 
1b930 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68  SCopy-ed into th
1b940 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20  e file result.. 
1b950 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b         ** So mak
1b960 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
1b970 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74 65  regFree1 registe
1b980 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20  r is not reused 
1b990 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20  for other.      
1b9a0 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e    ** purposes an
1b9b0 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77  d possibly overw
1b9c0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
1b9d0 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20 30      regFree1 = 0
1b9e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b9f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1ba00 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20  -1; i=i+2){.    
1ba10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ba20 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1ba30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
1ba40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
1ba50 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20 29  sert( pTest!=0 )
1ba60 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f  ;.          opCo
1ba70 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61  mpare.pRight = a
1ba80 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
1ba90 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
1baa0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 73  {.          pTes
1bab0 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  t = aListelem[i]
1bac0 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
1bad0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43 61  }.        nextCa
1bae0 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
1baf0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1bb00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bb10 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pTest->op==TK_CO
1bb20 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  LUMN );.        
1bb30 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1bb40 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73 74  se(pParse, pTest
1bb50 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49  , nextCase, SQLI
1bb60 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1bb70 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1bb80 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  ( aListelem[i+1]
1bb90 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  .pExpr->op==TK_C
1bba0 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
1bbb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bbc0 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
1bbd0 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74  em[i+1].pExpr, t
1bbe0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1bbf0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1bc00 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20  v, endLabel);.  
1bc10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bc20 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
1bc30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1bc40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1bc50 65 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b  el(v, nextCase);
1bc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bc70 66 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20  f( (nExpr&1)!=0 
1bc80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1bc90 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
1bca0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
1bcb0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1bcc0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d  (pParse, pEList-
1bcd0 3e 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70  >a[nExpr-1].pExp
1bce0 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
1bcf0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1bd00 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1bd10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bd20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bd30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1bd40 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a  ll, 0, target);.
1bd50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1bd60 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1bd70 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
1bd80 2d 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20  ->nErr>0 .      
1bd90 20 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e       || pParse->
1bda0 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61  iCacheLevel==iCa
1bdb0 63 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20  cheLevel );.    
1bdc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1bdd0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64  olveLabel(v, end
1bde0 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  Label);.      br
1bdf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1be00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1be10 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1be20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1be30 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1be40 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f  >affinity==OE_Ro
1be50 6c 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20  llback .        
1be60 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66     || pExpr->aff
1be70 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a  inity==OE_Abort.
1be80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1be90 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1bea0 45 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20  E_Fail.         
1beb0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1bec0 6e 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a  nity==OE_Ignore.
1bed0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
1bee0 66 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69  f( !pParse->pTri
1bef0 67 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20  ggerTab ){.     
1bf00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1bf10 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f    "RAISE() may o
1bf40 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
1bf50 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
1bf60 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20  gram");.        
1bf70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1bf80 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
1bf90 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f  r->affinity==OE_
1bfa0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
1bfb0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
1bfc0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1bfd0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1bfe0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1bff0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
1c000 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66  lue) );.      if
1c010 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  ( pExpr->affinit
1c020 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a  y==OE_Ignore ){.
1c030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c040 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20  dbeAddOp4(.     
1c050 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c         v, OP_Hal
1c060 74 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45  t, SQLITE_OK, OE
1c070 5f 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70  _Ignore, 0, pExp
1c080 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a  r->u.zToken,0);.
1c090 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1c0a0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
1c0b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1c0c0 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
1c0d0 69 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49  int(pParse, SQLI
1c0e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
1c0f0 49 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  IGGER,.         
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
1c120 6e 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  nity, pExpr->u.z
1c130 54 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  Token, 0, 0);.  
1c140 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65      }..      bre
1c150 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1c160 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1c170 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1c180 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1c190 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1c1a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1c1b0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74  regFree2);.  ret
1c1c0 75 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a  urn inReg;.}../*
1c1d0 0a 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74  .** Factor out t
1c1e0 68 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67  he code of the g
1c1f0 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
1c200 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  to initializatio
1c210 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
1c220 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1c230 74 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a  tInit(.  Parse *
1c240 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
1c250 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c260 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
1c270 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
1c280 65 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77  ession to code w
1c290 68 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69  hen the VDBE ini
1c2a0 74 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e  tializes */.  in
1c2b0 74 20 72 65 67 44 65 73 74 2c 20 20 20 20 20 20  t regDest,      
1c2c0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c  /* Store the val
1c2d0 75 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ue in this regis
1c2e0 74 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73  ter */.  u8 reus
1c2f0 61 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72  able       /* Tr
1c300 75 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65  ue if this expre
1c310 73 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c  ssion is reusabl
1c320 65 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69  e */.){.  ExprLi
1c330 73 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  st *p;.  assert(
1c340 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70   ConstFactorOk(p
1c350 50 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20  Parse) );.  p = 
1c360 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78  pParse->pConstEx
1c370 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  pr;.  pExpr = sq
1c380 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
1c390 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20  rse->db, pExpr, 
1c3a0 30 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  0);.  p = sqlite
1c3b0 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1c3c0 70 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72  pParse, p, pExpr
1c3d0 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c3e0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1c3f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1c400 20 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d   &p->a[p->nExpr-
1c410 31 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  1];.     pItem->
1c420 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20  u.iConstExprReg 
1c430 3d 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20  = regDest;.     
1c440 70 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20  pItem->reusable 
1c450 3d 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a  = reusable;.  }.
1c460 20 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74    pParse->pConst
1c470 45 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  Expr = p;.}../*.
1c480 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1c490 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20   to evaluate an 
1c4a0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73  expression and s
1c4b0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
1c4c0 0a 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73  .** into a regis
1c4d0 74 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ter.  Return the
1c4e0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
1c4f0 20 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c   where the resul
1c500 74 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  ts.** are stored
1c510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1c520 65 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d  egister is a tem
1c530 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20  porary register 
1c540 74 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c  that can be deal
1c550 6c 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e  located,.** then
1c560 20 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65   write its numbe
1c570 72 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49  r into *pReg.  I
1c580 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67  f the result reg
1c590 69 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20  ister is not.** 
1c5a0 61 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65  a temporary, the
1c5b0 6e 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a  n set *pReg to z
1c5c0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  ero..**.** If pE
1c5d0 78 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  xpr is a constan
1c5e0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  t, then this rou
1c5f0 74 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72  tine might gener
1c600 61 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65  ate this.** code
1c610 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67   to fill the reg
1c620 69 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69  ister in the ini
1c630 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74  tialization sect
1c640 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44  ion of the.** VD
1c650 42 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f  BE program, in o
1c660 72 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69  rder to factor i
1c670 74 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61  t out of the eva
1c680 6c 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f  luation loop..*/
1c690 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
1c6a0 43 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a  CodeTemp(Parse *
1c6b0 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1c6c0 78 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b  xpr, int *pReg){
1c6d0 0a 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78  .  int r2;.  pEx
1c6e0 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
1c6f0 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70  SkipCollate(pExp
1c700 72 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46  r);.  if( ConstF
1c710 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a  actorOk(pParse).
1c720 20 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21     && pExpr->op!
1c730 3d 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20  =TK_REGISTER.   
1c740 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
1c750 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28  ConstantNotJoin(
1c760 70 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20  pExpr).  ){.    
1c770 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50  ExprList *p = pP
1c780 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1c790 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1c7a0 20 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20   *pReg  = 0;.   
1c7b0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1c7c0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1c7d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1c7e0 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e     for(pItem=p->
1c7f0 61 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69  a, i=p->nExpr; i
1c800 3e 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d  >0; pItem++, i--
1c810 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1c820 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26  Item->reusable &
1c830 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
1c840 70 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  pare(pItem->pExp
1c850 72 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29  r,pExpr,-1)==0 )
1c860 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1c870 72 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e  rn pItem->u.iCon
1c880 73 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20  stExprReg;.     
1c890 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c8a0 20 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50   }.    r2 = ++pP
1c8b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1c8c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1c8d0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1c8e0 78 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d  xpr, r2, 1);.  }
1c8f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31  else{.    int r1
1c900 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1c910 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1c920 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1c930 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1c940 72 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b  rse, pExpr, r1);
1c950 0a 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20  .    if( r2==r1 
1c960 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d  ){.      *pReg =
1c970 20 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   r1;.    }else{.
1c980 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
1c990 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1c9a0 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a  se, r1);.      *
1c9b0 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pReg = 0;.    }.
1c9c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b    }.  return r2;
1c9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1c9e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
1c9f0 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65  l evaluate expre
1ca00 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20  ssion pExpr and 
1ca10 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73  store the.** res
1ca20 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72  ults in register
1ca30 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65   target.  The re
1ca40 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e  sults are guaran
1ca50 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a  teed to appear.*
1ca60 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61  * in register ta
1ca70 72 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rget..*/.void sq
1ca80 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61  lite3ExprCode(Pa
1ca90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1caa0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1cab0 72 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52  rget){.  int inR
1cac0 65 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74  eg;..  assert( t
1cad0 61 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65  arget>0 && targe
1cae0 74 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  t<=pParse->nMem 
1caf0 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26  );.  if( pExpr &
1cb00 26 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  & pExpr->op==TK_
1cb10 52 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20  REGISTER ){.    
1cb20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cb30 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  2(pParse->pVdbe,
1cb40 20 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d   OP_Copy, pExpr-
1cb50 3e 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29  >iTable, target)
1cb60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1cb70 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
1cb80 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
1cb90 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67  rse, pExpr, targ
1cba0 65 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  et);.    assert(
1cbb0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21 3d   pParse->pVdbe!=
1cbc0 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
1cbd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1cbe0 0a 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d  .    if( inReg!=
1cbf0 74 61 72 67 65 74 20 26 26 20 70 50 61 72 73 65  target && pParse
1cc00 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 20  ->pVdbe ){.     
1cc10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1cc20 70 32 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p2(pParse->pVdbe
1cc30 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 69 6e 52 65  , OP_SCopy, inRe
1cc40 67 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  g, target);.    
1cc50 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
1cc60 61 6b 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ake a transient 
1cc70 63 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69  copy of expressi
1cc80 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 74 68 65  on pExpr and the
1cc90 6e 20 63 6f 64 65 20 69 74 20 75 73 69 6e 67 0a  n code it using.
1cca0 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ** sqlite3ExprCo
1ccb0 64 65 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  de().  This rout
1ccc0 69 6e 65 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  ine works just l
1ccd0 69 6b 65 20 73 71 6c 69 74 65 33 45 78 70 72 43  ike sqlite3ExprC
1cce0 6f 64 65 28 29 0a 2a 2a 20 65 78 63 65 70 74 20  ode().** except 
1ccf0 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20 65  that the input e
1cd00 78 70 72 65 73 73 69 6f 6e 20 69 73 20 67 75 61  xpression is gua
1cd10 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 75 6e  ranteed to be un
1cd20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 76 6f 69 64  changed..*/.void
1cd30 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1cd40 43 6f 70 79 28 50 61 72 73 65 20 2a 70 50 61 72  Copy(Parse *pPar
1cd50 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1cd60 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
1cd70 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1cd80 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 45 78 70  arse->db;.  pExp
1cd90 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
1cda0 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30 29  up(db, pExpr, 0)
1cdb0 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ;.  if( !db->mal
1cdc0 6c 6f 63 46 61 69 6c 65 64 20 29 20 73 71 6c 69  locFailed ) sqli
1cdd0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1cde0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1cdf0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1ce00 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
1ce10 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  r);.}../*.** Gen
1ce20 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1ce30 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78  will evaluate ex
1ce40 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61  pression pExpr a
1ce50 6e 64 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20  nd store the.** 
1ce60 72 65 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73  results in regis
1ce70 74 65 72 20 74 61 72 67 65 74 2e 20 20 54 68 65  ter target.  The
1ce80 20 72 65 73 75 6c 74 73 20 61 72 65 20 67 75 61   results are gua
1ce90 72 61 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61  ranteed to appea
1cea0 72 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72  r.** in register
1ceb0 20 74 61 72 67 65 74 2e 20 20 49 66 20 74 68 65   target.  If the
1cec0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
1ced0 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68  onstant, then th
1cee0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
1cef0 67 68 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f  ght choose to co
1cf00 64 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  de the expressio
1cf10 6e 20 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  n at initializat
1cf20 69 6f 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  ion time..*/.voi
1cf30 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
1cf40 65 46 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73  eFactorable(Pars
1cf50 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1cf60 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1cf70 65 74 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  et){.  if( pPars
1cf80 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
1cf90 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49   && sqlite3ExprI
1cfa0 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29  sConstant(pExpr)
1cfb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1cfc0 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50  xprCodeAtInit(pP
1cfd0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1cfe0 67 65 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  get, 0);.  }else
1cff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d000 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1d010 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1d020 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1d030 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
1d040 61 6c 75 61 74 65 73 20 74 68 65 20 67 69 76 65  aluates the give
1d050 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  n expression and
1d060 20 70 75 74 73 20 74 68 65 20 72 65 73 75 6c 74   puts the result
1d070 0a 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20  .** in register 
1d080 74 61 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  target..**.** Al
1d090 73 6f 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  so make a copy o
1d0a0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1d0b0 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e   results into an
1d0c0 6f 74 68 65 72 20 22 63 61 63 68 65 22 20 72 65  other "cache" re
1d0d0 67 69 73 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f  gister.** and mo
1d0e0 64 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73  dify the express
1d0f0 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
1d100 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1d110 65 76 61 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68  evaluated,.** th
1d120 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 63 6f  e result is a co
1d130 70 79 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  py of the cache 
1d140 72 65 67 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  register..**.** 
1d150 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1d160 75 73 65 64 20 66 6f 72 20 65 78 70 72 65 73 73  used for express
1d170 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 75 73  ions that are us
1d180 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
1d190 74 69 6d 65 73 2e 20 20 54 68 65 79 20 61 72 65  times.  They are
1d1a0 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 20   evaluated once 
1d1b0 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 73 20  and the results 
1d1c0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1d1d0 6e 0a 2a 2a 20 61 72 65 20 72 65 75 73 65 64 2e  n.** are reused.
1d1e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d1f0 45 78 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65  ExprCodeAndCache
1d200 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d210 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1d220 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62 65   target){.  Vdbe
1d230 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1d240 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
1d250 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
1d260 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1d270 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1d280 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20 73 71  REGISTER );.  sq
1d290 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1d2a0 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1d2b0 67 65 74 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b  get);.  iMem = +
1d2c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1d2d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d2e0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74  p2(v, OP_Copy, t
1d2f0 61 72 67 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20  arget, iMem);.  
1d300 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 70  exprToRegister(p
1d310 45 78 70 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a  Expr, iMem);.}..
1d320 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1d330 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
1d340 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
1d350 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
1d360 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
1d370 73 73 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20  ssion list into 
1d380 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
1d390 67 69 73 74 65 72 73 20 62 65 67 69 6e 6e 69 6e  gisters beginnin
1d3a0 67 20 61 74 20 74 61 72 67 65 74 2e 0a 2a 2a 0a  g at target..**.
1d3b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1d3c0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
1d3d0 20 65 76 61 6c 75 61 74 65 64 2e 0a 2a 2a 0a 2a   evaluated..**.*
1d3e0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45  * The SQLITE_ECE
1d3f0 4c 5f 44 55 50 20 66 6c 61 67 20 70 72 65 76 65  L_DUP flag preve
1d400 6e 74 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74  nts the argument
1d410 73 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20  s from being.** 
1d420 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 4f 50 5f  filled using OP_
1d430 53 43 6f 70 79 2e 20 20 4f 50 5f 43 6f 70 79 20  SCopy.  OP_Copy 
1d440 6d 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73  must be used ins
1d450 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tead..**.** The 
1d460 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1d470 4f 52 20 61 72 67 75 6d 65 6e 74 20 61 6c 6c 6f  OR argument allo
1d480 77 73 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75  ws constant argu
1d490 6d 65 6e 74 73 20 74 6f 20 62 65 0a 2a 2a 20 66  ments to be.** f
1d4a0 61 63 74 6f 72 65 64 20 6f 75 74 20 69 6e 74 6f  actored out into
1d4b0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1d4c0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1d4d0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
1d4e0 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61 74 20  flag means that 
1d4f0 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
1d500 68 65 20 6c 69 73 74 20 77 69 74 68 0a 2a 2a 20  he list with.** 
1d510 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 75 2e 78  ExprList.a[].u.x
1d520 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 68  .iOrderByCol>0 h
1d530 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1d540 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 73   evaluated and s
1d550 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 72 65 67 69  tored.** in regi
1d560 73 74 65 72 73 20 61 74 20 73 72 63 52 65 67 2c  sters at srcReg,
1d570 20 61 6e 64 20 73 6f 20 74 68 65 20 76 61 6c 75   and so the valu
1d580 65 20 63 61 6e 20 62 65 20 63 6f 70 69 65 64 20  e can be copied 
1d590 66 72 6f 6d 20 74 68 65 72 65 2e 0a 2a 2f 0a 69  from there..*/.i
1d5a0 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
1d5b0 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  deExprList(.  Pa
1d5c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1d5d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
1d5e0 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
1d5f0 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54  t *pList,   /* T
1d600 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1d610 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  st to be coded *
1d620 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20  /.  int target, 
1d630 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
1d640 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74 73  to write results
1d650 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 52 65 67   */.  int srcReg
1d660 2c 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ,        /* Sour
1d670 63 65 20 72 65 67 69 73 74 65 72 73 20 69 66 20  ce registers if 
1d680 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20  SQLITE_ECEL_REF 
1d690 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20  */.  u8 flags   
1d6a0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
1d6b0 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a  E_ECEL_* flags *
1d6c0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78  /.){.  struct Ex
1d6d0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1d6e0 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  em;.  int i, j, 
1d6f0 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d  n;.  u8 copyOp =
1d700 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1d710 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f  _ECEL_DUP) ? OP_
1d720 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b  Copy : OP_SCopy;
1d730 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1d740 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1d750 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
1d760 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ;.  assert( targ
1d770 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  et>0 );.  assert
1d780 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 21  ( pParse->pVdbe!
1d790 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72 20  =0 );  /* Never 
1d7a0 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f 74  gets this far ot
1d7b0 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20 3d  herwise */.  n =
1d7c0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
1d7d0 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74 6f   if( !ConstFacto
1d7e0 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66 6c  rOk(pParse) ) fl
1d7f0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 45  ags &= ~SQLITE_E
1d800 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66 6f  CEL_FACTOR;.  fo
1d810 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
1d820 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
1d830 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
1d840 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 74  xpr *pExpr = pIt
1d850 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69  em->pExpr;.    i
1d860 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  f( (flags & SQLI
1d870 54 45 5f 45 43 45 4c 5f 52 45 46 29 21 3d 30 20  TE_ECEL_REF)!=0 
1d880 26 26 20 28 6a 20 3d 20 70 4c 69 73 74 2d 3e 61  && (j = pList->a
1d890 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
1d8a0 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
1d8b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d8c0 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 6a 2b 73  2(v, copyOp, j+s
1d8d0 72 63 52 65 67 2d 31 2c 20 74 61 72 67 65 74 2b  rcReg-1, target+
1d8e0 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  i);.    }else if
1d8f0 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  ( (flags & SQLIT
1d900 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 21 3d  E_ECEL_FACTOR)!=
1d910 30 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  0 && sqlite3Expr
1d920 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72  IsConstant(pExpr
1d930 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1d940 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74  e3ExprCodeAtInit
1d950 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d960 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a 20 20  target+i, 0);.  
1d970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1d980 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74  nt inReg = sqlit
1d990 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
1d9a0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1d9b0 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20  target+i);.     
1d9c0 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1d9d0 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20 20 20  et+i ){.        
1d9e0 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20  VdbeOp *pOp;.   
1d9f0 20 20 20 20 20 69 66 28 20 63 6f 70 79 4f 70 3d       if( copyOp=
1da00 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20  =OP_Copy.       
1da10 20 20 26 26 20 28 70 4f 70 3d 73 71 6c 69 74 65    && (pOp=sqlite
1da20 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 2d 31  3VdbeGetOp(v, -1
1da30 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  ))->opcode==OP_C
1da40 6f 70 79 0a 20 20 20 20 20 20 20 20 20 26 26 20  opy.         && 
1da50 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e 70 33 2b  pOp->p1+pOp->p3+
1da60 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20 20 20 20  1==inReg.       
1da70 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b 70 4f 70    && pOp->p2+pOp
1da80 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65 74 2b 69  ->p3+1==target+i
1da90 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1daa0 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 2b 2b 3b        pOp->p3++;
1dab0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dac0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1dad0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 63  3VdbeAddOp2(v, c
1dae0 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c 20 74 61  opyOp, inReg, ta
1daf0 72 67 65 74 2b 69 29 3b 0a 20 20 20 20 20 20 20  rget+i);.       
1db00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1db10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1db20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1db30 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 42 45  te code for a BE
1db40 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  TWEEN operator..
1db50 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45 54 57 45  **.**    x BETWE
1db60 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a 0a 2a 2a  EN y AND z.**.**
1db70 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 65 71   The above is eq
1db80 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 0a  uivalent to .**.
1db90 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78  **    x>=y AND x
1dba0 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 69  <=z.**.** Code i
1dbb0 74 20 61 73 20 73 75 63 68 2c 20 74 61 6b 69 6e  t as such, takin
1dbc0 67 20 63 61 72 65 20 74 6f 20 64 6f 20 74 68 65  g care to do the
1dbd0 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78 70 72 65   common subexpre
1dbe0 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d 69 6e 61  ssion.** elimina
1dbf0 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f 0a 73 74  tion of x..*/.st
1dc00 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
1dc10 64 65 42 65 74 77 65 65 6e 28 0a 20 20 50 61 72  deBetween(.  Par
1dc20 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1dc30 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f  * Parsing and co
1dc40 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
1dc50 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
1dc60 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20  *pExpr,      /* 
1dc70 54 68 65 20 42 45 54 57 45 45 4e 20 65 78 70 72  The BETWEEN expr
1dc80 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1dc90 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
1dca0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 68   Jump here if th
1dcb0 65 20 6a 75 6d 70 20 69 73 20 74 61 6b 65 6e 20  e jump is taken 
1dcc0 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 54  */.  int jumpIfT
1dcd0 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b 65 20 74  rue,   /* Take t
1dce0 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42  he jump if the B
1dcf0 45 54 57 45 45 4e 20 69 73 20 74 72 75 65 20 2a  ETWEEN is true *
1dd00 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  /.  int jumpIfNu
1dd10 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65 20 74 68  ll    /* Take th
1dd20 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20 42 45  e jump if the BE
1dd30 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c 20 2a 2f  TWEEN is NULL */
1dd40 0a 29 7b 0a 20 20 45 78 70 72 20 65 78 70 72 41  .){.  Expr exprA
1dd50 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 41  nd;     /* The A
1dd60 4e 44 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 20  ND operator in  
1dd70 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 20 20 2a  x>=y AND x<=z  *
1dd80 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 4c 65 66  /.  Expr compLef
1dd90 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 20 78 3e  t;    /* The  x>
1dda0 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =y  term */.  Ex
1ddb0 70 72 20 63 6f 6d 70 52 69 67 68 74 3b 20 20 20  pr compRight;   
1ddc0 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20 20 74 65  /* The  x<=z  te
1ddd0 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20 65 78 70  rm */.  Expr exp
1dde0 72 58 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  rX;       /* The
1ddf0 20 20 78 20 20 73 75 62 65 78 70 72 65 73 73 69    x  subexpressi
1de00 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  on */.  int regF
1de10 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20 54 65 6d  ree1 = 0; /* Tem
1de20 70 6f 72 61 72 79 20 75 73 65 20 72 65 67 69 73  porary use regis
1de30 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
1de40 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
1de50 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
1de60 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 65 78 70  Select) );.  exp
1de70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e 70 4c 65  rX = *pExpr->pLe
1de80 66 74 3b 0a 20 20 65 78 70 72 41 6e 64 2e 6f 70  ft;.  exprAnd.op
1de90 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 65 78 70   = TK_AND;.  exp
1dea0 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20 26 63 6f  rAnd.pLeft = &co
1deb0 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e  mpLeft;.  exprAn
1dec0 64 2e 70 52 69 67 68 74 20 3d 20 26 63 6f 6d 70  d.pRight = &comp
1ded0 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70 4c 65 66  Right;.  compLef
1dee0 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b 0a 20 20  t.op = TK_GE;.  
1def0 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66 74 20 3d  compLeft.pLeft =
1df00 20 26 65 78 70 72 58 3b 0a 20 20 63 6f 6d 70 4c   &exprX;.  compL
1df10 65 66 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78  eft.pRight = pEx
1df20 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
1df30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f 6d 70 52  ].pExpr;.  compR
1df40 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f 4c 45 3b  ight.op = TK_LE;
1df50 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 4c 65  .  compRight.pLe
1df60 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63  ft = &exprX;.  c
1df70 6f 6d 70 52 69 67 68 74 2e 70 52 69 67 68 74 20  ompRight.pRight 
1df80 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1df90 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
1dfa0 65 78 70 72 54 6f 52 65 67 69 73 74 65 72 28 26  exprToRegister(&
1dfb0 65 78 70 72 58 2c 20 73 71 6c 69 74 65 33 45 78  exprX, sqlite3Ex
1dfc0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1dfd0 65 2c 20 26 65 78 70 72 58 2c 20 26 72 65 67 46  e, &exprX, &regF
1dfe0 72 65 65 31 29 29 3b 0a 20 20 69 66 28 20 6a 75  ree1));.  if( ju
1dff0 6d 70 49 66 54 72 75 65 20 29 7b 0a 20 20 20 20  mpIfTrue ){.    
1e000 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1e010 65 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 41  e(pParse, &exprA
1e020 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  nd, dest, jumpIf
1e030 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
1e040 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e050 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 26  fFalse(pParse, &
1e060 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a  exprAnd, dest, j
1e070 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  umpIfNull);.  }.
1e080 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1e090 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1e0a0 72 65 67 46 72 65 65 31 29 3b 0a 0a 20 20 2f 2a  regFree1);..  /*
1e0b0 20 45 6e 73 75 72 65 20 61 64 65 71 75 61 74 65   Ensure adequate
1e0c0 20 74 65 73 74 20 63 6f 76 65 72 61 67 65 20 2a   test coverage *
1e0d0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  /.  testcase( ju
1e0e0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e0f0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1e100 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e110 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e120 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1e130 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1e140 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1e150 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e160 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1e170 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1e180 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1e190 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d  ase( jumpIfTrue=
1e1a0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e1b0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  !=0 && regFree1!
1e1c0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e1d0 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e1e0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1e1f0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1e200 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1e210 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1e220 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26  jumpIfNull==0 &&
1e230 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1e240 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e250 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1e260 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1e270 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74  gFree1==0 );.  t
1e280 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54  estcase( jumpIfT
1e290 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66  rue!=0 && jumpIf
1e2a0 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72  Null!=0 && regFr
1e2b0 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ee1!=0 );.}../*.
1e2c0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1e2d0 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1e2e0 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1e2f0 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1e300 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1e310 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1e320 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
1e330 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
1e340 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
1e350 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
1e360 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1e370 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
1e380 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1e390 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1e3a0 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1e3b0 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
1e3c0 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
1e3d0 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
1e3e0 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 53 51 4c  Null flag is SQL
1e3f0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 2e 0a  ITE_JUMPIFNULL..
1e400 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
1e410 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
1e420 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
1e430 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
1e440 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
1e450 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
1e460 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
1e470 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
1e480 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
1e490 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
1e4a0 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
1e4b0 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
1e4c0 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
1e4d0 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
1e4e0 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
1e4f0 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
1e500 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
1e510 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
1e520 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
1e530 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
1e540 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
1e550 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
1e560 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e570 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
1e580 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1e590 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
1e5a0 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
1e5b0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
1e5c0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1e5d0 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 6e  int op = 0;.  in
1e5e0 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a  t regFree1 = 0;.
1e5f0 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d    int regFree2 =
1e600 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20 72 32   0;.  int r1, r2
1e610 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 75 6d  ;..  assert( jum
1e620 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f  pIfNull==SQLITE_
1e630 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75  JUMPIFNULL || ju
1e640 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e650 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30 29   if( NEVER(v==0)
1e660 20 29 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20   )     return;  
1e670 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1e680 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1e690 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1e6a0 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
1e6b0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 4e 6f  ) return;  /* No
1e6c0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
1e6d0 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  ppen */.  op = p
1e6e0 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74  Expr->op;.  swit
1e6f0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1e700 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20  se TK_AND: {.   
1e710 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1e720 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e730 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1e740 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1e750 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e760 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1e770 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1e780 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49 66 4e 75  eft, d2,jumpIfNu
1e790 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1e7a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1e7b0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1e7c0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1e7d0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
1e7e0 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
1e7f0 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
1e800 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1e820 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
1e830 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e840 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1e850 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1e860 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e870 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
1e880 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e890 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e8a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
1e8b0 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
1e8c0 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
1e8d0 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
1e8e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e8f0 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1e900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e910 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1e920 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e930 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e950 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
1e960 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rse);.      brea
1e970 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e980 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
1e990 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e9a0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1e9b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e9c0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
1e9d0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
1e9e0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e9f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ea00 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
1ea10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
1ea20 4e 4f 54 3a 0a 20 20 20 20 20 20 74 65 73 74 63  NOT:.      testc
1ea30 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29  ase( op==TK_IS )
1ea40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ea50 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ( op==TK_ISNOT )
1ea60 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
1ea70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
1ea80 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
1ea90 6a 75 6d 70 49 66 4e 75 6c 6c 20 3d 20 53 51 4c  jumpIfNull = SQL
1eaa0 49 54 45 5f 4e 55 4c 4c 45 51 3b 0a 20 20 20 20  ITE_NULLEQ;.    
1eab0 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
1eac0 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  /.    case TK_LT
1ead0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
1eae0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
1eaf0 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
1eb00 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
1eb10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
1eb20 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1eb30 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1eb40 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
1eb50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1eb60 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
1eb70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
1eb80 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
1eb90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1eba0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
1ebb0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
1ebc0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
1ebd0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1ebe0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ebf0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1ec00 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1ec10 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1ec20 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1ec30 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1ec40 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
1ec50 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
1ec60 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ec70 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
1ec80 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
1ec90 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
1eca0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
1ecb0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ecc0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
1ecd0 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
1ece0 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
1ecf0 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
1ed00 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ed10 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
1ed20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
1ed30 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
1ed40 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
1ed50 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
1ed60 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
1ed70 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
1ed80 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
1ed90 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 56  =OP_Eq);.      V
1eda0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1edb0 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a 75   op==OP_Eq && ju
1edc0 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45  mpIfNull==SQLITE
1edd0 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
1ede0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1edf0 2c 20 6f 70 3d 3d 4f 50 5f 45 71 20 26 26 20 6a  , op==OP_Eq && j
1ee00 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51 4c 49 54  umpIfNull!=SQLIT
1ee10 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
1ee20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
1ee30 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
1ee40 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
1ee50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1ee60 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26 26  (v, op==OP_Ne &&
1ee70 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c   jumpIfNull==SQL
1ee80 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20  ITE_NULLEQ);.   
1ee90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
1eea0 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 26  f(v, op==OP_Ne &
1eeb0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 53 51  & jumpIfNull!=SQ
1eec0 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
1eed0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1eee0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1eef0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1ef00 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1ef10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1ef20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1ef30 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1ef40 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1ef50 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1ef60 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1ef70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ef80 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1ef90 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1efa0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1efb0 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1efc0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1efd0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1efe0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1eff0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f000 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1f030 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1f040 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f050 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1f060 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
1f070 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1f080 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
1f090 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f0a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f0b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f0c0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1f0d0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1f0e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f0f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1f100 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1f110 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f120 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1f130 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f140 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f150 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f160 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1f170 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1f180 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1f190 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f1a0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1f1b0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
1f1c0 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
1f1d0 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
1f1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f1f0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1f200 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
1f210 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1f220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1f230 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a 20 20  oto(v, dest);.  
1f240 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
1f250 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
1f260 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20  estIfFalse);.   
1f270 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f280 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
1f290 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
1f2a0 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
1f2b0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1f2c0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1f2d0 28 76 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  (v, dest);.     
1f2e0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
1f2f0 6c 77 61 79 73 46 61 6c 73 65 28 70 45 78 70 72  lwaysFalse(pExpr
1f300 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1f310 4e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d  No-op */.      }
1f320 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31  else{.        r1
1f330 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1f340 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1f350 45 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29  Expr, &regFree1)
1f360 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1f370 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1f380 50 5f 49 66 2c 20 72 31 2c 20 64 65 73 74 2c 20  P_If, r1, dest, 
1f390 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a  jumpIfNull!=0);.
1f3a0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1f3b0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
1f3c0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f3d0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f3e0 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1f3f0 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  IfNull==0 );.   
1f400 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
1f410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1f420 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1f430 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1f440 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ree1);.  sqlite3
1f450 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
1f460 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29  Parse, regFree2)
1f470 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ;  .}../*.** Gen
1f480 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1f490 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
1f4a0 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
1f4b0 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
1f4c0 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
1f4d0 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
1f4e0 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
1f4f0 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
1f500 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
1f510 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
1f520 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
1f530 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1f540 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
1f550 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
1f560 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
1f570 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
1f580 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
1f590 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49   is SQLITE_JUMPI
1f5a0 46 4e 55 4c 4c 20 6f 72 20 66 61 6c 6c 20 74 68  FNULL or fall th
1f5b0 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
1f5c0 75 6c 6c 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a  ull.** is 0..*/.
1f5d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
1f5e0 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
1f5f0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1f600 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
1f610 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
1f620 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
1f630 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
1f640 6f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  op = 0;.  int re
1f650 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e  gFree1 = 0;.  in
1f660 74 20 72 65 67 46 72 65 65 32 20 3d 20 30 3b 0a  t regFree2 = 0;.
1f670 20 20 69 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20    int r1, r2;.. 
1f680 20 61 73 73 65 72 74 28 20 6a 75 6d 70 49 66 4e   assert( jumpIfN
1f690 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50  ull==SQLITE_JUMP
1f6a0 49 46 4e 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66  IFNULL || jumpIf
1f6b0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Null==0 );.  if(
1f6c0 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
1f6d0 65 74 75 72 6e 3b 20 2f 2a 20 45 78 69 73 74 65  eturn; /* Existe
1f6e0 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63  nce of VDBE chec
1f6f0 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f  ked by caller */
1f700 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1f710 29 20 20 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  )    return;..  
1f720 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
1f730 70 45 78 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70  pExpr->op and op
1f740 20 61 72 65 20 72 65 6c 61 74 65 64 20 61 73 20   are related as 
1f750 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
1f760 2a 2a 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  **       pExpr->
1f770 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 6f 70  op            op
1f780 0a 20 20 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d  .  **       ----
1f790 2d 2d 2d 2d 2d 20 20 20 20 20 20 20 20 20 20 2d  -----          -
1f7a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20  ---------.  **  
1f7b0 20 20 20 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20       TK_ISNULL  
1f7c0 20 20 20 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75          OP_NotNu
1f7d0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
1f7e0 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20 20 20 20 20  _NOTNULL        
1f7f0 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20   OP_IsNull.  ** 
1f800 20 20 20 20 20 20 54 4b 5f 4e 45 20 20 20 20 20        TK_NE     
1f810 20 20 20 20 20 20 20 20 20 4f 50 5f 45 71 0a 20           OP_Eq. 
1f820 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 45 51 20   **       TK_EQ 
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1f840 4e 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Ne.  **       TK
1f850 5f 47 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _GT             
1f860 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Le.  **     
1f870 20 20 54 4b 5f 4c 45 20 20 20 20 20 20 20 20 20    TK_LE         
1f880 20 20 20 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20       OP_Gt.  ** 
1f890 20 20 20 20 20 20 54 4b 5f 47 45 20 20 20 20 20        TK_GE     
1f8a0 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20           OP_Lt. 
1f8b0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 54 20   **       TK_LT 
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1f8d0 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  Ge.  **.  ** For
1f8e0 20 6f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   other values of
1f8f0 20 70 45 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69   pExpr->op, op i
1f900 73 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 20  s undefined and 
1f910 75 6e 75 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65  unused..  ** The
1f920 20 76 61 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e   value of TK_ an
1f930 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20  d OP_ constants 
1f940 61 72 65 20 61 72 72 61 6e 67 65 64 20 73 75 63  are arranged suc
1f950 68 20 74 68 61 74 20 77 65 0a 20 20 2a 2a 20 63  h that we.  ** c
1f960 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d  an compute the m
1f970 61 70 70 69 6e 67 20 61 62 6f 76 65 20 75 73 69  apping above usi
1f980 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1f990 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a   expression..  *
1f9a0 2a 20 41 73 73 65 72 74 28 29 73 20 76 65 72 69  * Assert()s veri
1f9b0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70  fy that the comp
1f9c0 75 74 61 74 69 6f 6e 20 69 73 20 63 6f 72 72 65  utation is corre
1f9d0 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20  ct..  */.  op = 
1f9e0 28 28 70 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f  ((pExpr->op+(TK_
1f9f0 49 53 4e 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54  ISNULL&1))^1)-(T
1fa00 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20  K_ISNULL&1);..  
1fa10 2f 2a 20 56 65 72 69 66 79 20 63 6f 72 72 65 63  /* Verify correc
1fa20 74 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54  t alignment of T
1fa30 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74  K_ and OP_ const
1fa40 61 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ants.  */.  asse
1fa50 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1fa60 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  K_ISNULL || op==
1fa70 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20  OP_NotNull );.  
1fa80 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1fa90 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c  p!=TK_NOTNULL ||
1faa0 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29   op==OP_IsNull )
1fab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1fac0 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20  r->op!=TK_NE || 
1fad0 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61  op==OP_Eq );.  a
1fae0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1faf0 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_EQ || op==O
1fb00 50 5f 4e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Ne );.  assert
1fb10 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1fb20 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20  LT || op==OP_Ge 
1fb30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1fb40 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c  pr->op!=TK_LE ||
1fb50 20 6f 70 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20   op==OP_Gt );.  
1fb60 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1fb70 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_GT || op==
1fb80 4f 50 5f 4c 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Le );.  asser
1fb90 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1fba0 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74  _GE || op==OP_Lt
1fbb0 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70   );..  switch( p
1fbc0 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
1fbd0 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
1fbe0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1fbf0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1fc00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fc10 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1fc20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1fc30 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fc40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fc50 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
1fc60 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1fc70 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1fc80 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1fc90 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1fca0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1fcb0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1fcc0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1fcd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1fce0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1fcf0 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
1fd00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
1fd10 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
1fd20 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e  estcase( jumpIfN
1fd30 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
1fd40 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1fd50 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1fd60 3e 70 4c 65 66 74 2c 20 64 32 2c 20 6a 75 6d 70  >pLeft, d2, jump
1fd70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55  IfNull^SQLITE_JU
1fd80 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
1fd90 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1fda0 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1fdb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1fdc0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1fdd0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1fde0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fdf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1fe00 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1fe10 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  v, d2);.      sq
1fe20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
1fe30 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
1fe40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1fe50 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
1fe60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1fe70 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1fe80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fe90 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1fea0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1feb0 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1fec0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1fed0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1fee0 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
1fef0 4b 5f 49 53 4e 4f 54 3a 0a 20 20 20 20 20 20 74  K_ISNOT:.      t
1ff00 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
1ff10 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1ff20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
1ff30 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54  pr->op==TK_ISNOT
1ff40 20 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28   );.      op = (
1ff50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
1ff60 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  ) ? TK_NE : TK_E
1ff70 51 3b 0a 20 20 20 20 20 20 6a 75 6d 70 49 66 4e  Q;.      jumpIfN
1ff80 75 6c 6c 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c  ull = SQLITE_NUL
1ff90 4c 45 51 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  LEQ;.      /* Fa
1ffa0 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 63  ll thru */.    c
1ffb0 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1ffc0 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1ffd0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1ffe0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1fff0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
20000 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
20010 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20020 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
20030 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
20040 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
20050 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
20060 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
20070 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
20080 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20090 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
200a0 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
200b0 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
200c0 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
200d0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
200e0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
20100 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
20110 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
20120 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
20130 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
20140 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
20150 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20160 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
20170 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
20180 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
20190 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
201a0 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
201b0 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
201c0 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
201d0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
201e0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
201f0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
20200 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20210 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
20220 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
20230 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
20240 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
20250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
20260 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
20270 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
20280 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
20290 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50  rageIf(v, op==OP
202a0 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c  _Eq && jumpIfNul
202b0 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  l!=SQLITE_NULLEQ
202c0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
202d0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f  erageIf(v, op==O
202e0 50 5f 45 71 20 26 26 20 6a 75 6d 70 49 66 4e 75  P_Eq && jumpIfNu
202f0 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  ll==SQLITE_NULLE
20300 51 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Q);.      assert
20310 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20  (TK_NE==OP_Ne); 
20320 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
20330 4e 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  Ne);.      VdbeC
20340 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d  overageIf(v, op=
20350 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49 66  =OP_Ne && jumpIf
20360 4e 75 6c 6c 21 3d 53 51 4c 49 54 45 5f 4e 55 4c  Null!=SQLITE_NUL
20370 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
20380 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20390 3d 3d 4f 50 5f 4e 65 20 26 26 20 6a 75 6d 70 49  ==OP_Ne && jumpI
203a0 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54 45 5f 4e 55  fNull==SQLITE_NU
203b0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 74 65 73  LLEQ);.      tes
203c0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
203d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
203e0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
203f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20410 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
20420 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
20430 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
20440 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20450 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20460 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
20470 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
20480 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
20490 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
204a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
204b0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
204c0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
204d0 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
204e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
204f0 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
20500 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
20510 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
20520 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
20530 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20540 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
20550 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20560 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
20570 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
20580 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20590 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
205a0 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
205b0 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
205c0 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
205d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
205e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
205f0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20600 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
20610 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
20620 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
20630 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
20640 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
20650 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
20660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20670 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
20680 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
20690 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
206a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
206b0 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
206c0 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
206d0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
206e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
206f0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
20700 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
20710 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20720 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
20730 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
20740 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
20750 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
20760 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
20770 65 47 6f 74 6f 28 76 2c 20 64 65 73 74 29 3b 0a  eGoto(v, dest);.
20780 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
20790 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 70  exprAlwaysTrue(p
207a0 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
207b0 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
207c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
207d0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
207e0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
207f0 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46 72  e, pExpr, &regFr
20800 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ee1);.        sq
20810 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
20820 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c  v, OP_IfNot, r1,
20830 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
20840 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56  l!=0);.        V
20850 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
20860 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20870 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b  ( regFree1==0 );
20880 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20890 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
208a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
208b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
208c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
208d0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
208e0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20  e, regFree1);.  
208f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
20900 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
20910 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gFree2);.}../*.*
20920 2a 20 4c 69 6b 65 20 73 71 6c 69 74 65 33 45 78  * Like sqlite3Ex
20930 70 72 49 66 46 61 6c 73 65 28 29 20 65 78 63 65  prIfFalse() exce
20940 70 74 20 74 68 61 74 20 61 20 63 6f 70 79 20 69  pt that a copy i
20950 73 20 6d 61 64 65 20 6f 66 20 70 45 78 70 72 20  s made of pExpr 
20960 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 64 65 20 67  before.** code g
20970 65 6e 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 74  eneration, and t
20980 68 61 74 20 63 6f 70 79 20 69 73 20 64 65 6c 65  hat copy is dele
20990 74 65 64 20 61 66 74 65 72 20 63 6f 64 65 20 67  ted after code g
209a0 65 6e 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 0a  eneration. This.
209b0 2a 2a 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ** ensures that 
209c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 45 78  the original pEx
209d0 70 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  pr is unchanged.
209e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
209f0 45 78 70 72 49 66 46 61 6c 73 65 44 75 70 28 50  ExprIfFalseDup(P
20a00 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
20a10 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
20a20 65 73 74 2c 69 6e 74 20 6a 75 6d 70 49 66 4e 75  est,int jumpIfNu
20a30 6c 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ll){.  sqlite3 *
20a40 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20a50 0a 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d  .  Expr *pCopy =
20a60 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
20a70 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20  db, pExpr, 0);. 
20a80 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20a90 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ailed==0 ){.    
20aa0 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
20ab0 73 65 28 70 50 61 72 73 65 2c 20 70 43 6f 70 79  se(pParse, pCopy
20ac0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20ad0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
20ae0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
20af0 20 70 43 6f 70 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   pCopy);.}.../*.
20b00 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
20b10 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
20b20 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
20b30 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
20b40 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
20b50 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
20b60 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
20b70 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
20b80 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
20b90 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
20ba0 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
20bb0 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
20bc0 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
20bd0 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
20be0 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
20bf0 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
20c00 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
20c10 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
20c20 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
20c30 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
20c40 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
20c50 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
20c60 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
20c70 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
20c80 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
20c90 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
20ca0 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
20cb0 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
20cc0 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
20cd0 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
20ce0 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
20cf0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
20d00 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
20d10 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
20d20 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
20d30 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
20d40 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
20d50 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
20d60 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
20d70 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
20d80 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
20d90 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
20da0 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
20db0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
20dc0 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
20dd0 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
20de0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
20df0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
20e00 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
20e10 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
20e20 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
20e30 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
20e40 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
20e50 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
20e60 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
20e70 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
20e80 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
20e90 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
20ea0 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
20eb0 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
20ec0 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
20ed0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20ee0 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
20ef0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
20f00 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
20f10 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
20f20 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
20f30 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
20f40 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
20f50 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
20f60 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
20f70 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
20f80 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
20f90 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
20fa0 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
20fb0 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
20fc0 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
20fd0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
20fe0 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
20ff0 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
21000 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   2;.  }.  combin
21010 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
21020 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
21030 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
21040 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
21050 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
21060 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
21070 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
21080 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
21090 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
210a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
210b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
210c0 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
210d0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
210e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
210f0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
21100 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
21110 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
21120 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20  pB, iTab)<2 ){. 
21130 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21140 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
21150 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
21160 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
21170 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c  mpare(pA, pB->pL
21180 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a  eft, iTab)<2 ){.
21190 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
211a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
211b0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
211c0 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
211d0 26 26 20 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41 47  && pA->op!=TK_AG
211e0 47 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 41 2d 3e  G_COLUMN && pA->
211f0 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  u.zToken ){.    
21200 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 46  if( pA->op==TK_F
21210 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20  UNCTION ){.     
21220 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
21230 43 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e  Cmp(pA->u.zToken
21240 2c 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d  ,pB->u.zToken)!=
21250 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  0 ) return 2;.  
21260 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
21270 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
21280 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
21290 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
212a0 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
212b0 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
212c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
212d0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
212e0 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
212f0 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
21300 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
21310 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
21320 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
21330 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b  okenOnly)==0) ){
21340 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
21350 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  dFlags & EP_xIsS
21360 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32  elect ) return 2
21370 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21380 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
21390 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
213a0 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
213b0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
213c0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
213d0 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
213e0 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
213f0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
21400 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
21410 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
21420 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
21430 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
21440 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  n 2;.    if( ALW
21450 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
21460 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
21470 3d 3d 30 29 20 26 26 20 70 41 2d 3e 6f 70 21 3d  ==0) && pA->op!=
21480 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
21490 20 20 20 69 66 28 20 70 41 2d 3e 69 43 6f 6c 75     if( pA->iColu
214a0 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
214b0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
214c0 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
214d0 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 0a 20 20  !=pB->iTable .  
214e0 20 20 20 20 20 26 26 20 28 70 41 2d 3e 69 54 61       && (pA->iTa
214f0 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 4e 45 56  ble!=iTab || NEV
21500 45 52 28 70 42 2d 3e 69 54 61 62 6c 65 3e 3d 30  ER(pB->iTable>=0
21510 29 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  )) ) return 2;. 
21520 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21530 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
21540 6d 70 61 72 65 20 74 77 6f 20 45 78 70 72 4c 69  mpare two ExprLi
21550 73 74 20 6f 62 6a 65 63 74 73 2e 20 20 52 65 74  st objects.  Ret
21560 75 72 6e 20 30 20 69 66 20 74 68 65 79 20 61 72  urn 0 if they ar
21570 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
21580 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
21590 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
215a0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  ny way..**.** If
215b0 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20   any subelement 
215c0 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e 69  of pB has Expr.i
215d0 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e  Table==(-1) then
215e0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a   it is allowed.*
215f0 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75  * to compare equ
21600 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c  al to an equival
21610 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70  ent element in p
21620 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62  A with Expr.iTab
21630 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20  le==iTab..**.** 
21640 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
21650 68 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ht return non-ze
21660 72 6f 20 66 6f 72 20 65 71 75 69 76 61 6c 65 6e  ro for equivalen
21670 74 20 45 78 70 72 4c 69 73 74 73 2e 20 20 54 68  t ExprLists.  Th
21680 65 0a 2a 2a 20 6f 6e 6c 79 20 63 6f 6e 73 65 71  e.** only conseq
21690 75 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 64 69  uence will be di
216a0 73 61 62 6c 65 64 20 6f 70 74 69 6d 69 7a 61 74  sabled optimizat
216b0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 69 73 20  ions.  But this 
216c0 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 75 73 74 20  routine.** must 
216d0 6e 65 76 65 72 20 72 65 74 75 72 6e 20 30 20 69  never return 0 i
216e0 66 20 74 68 65 20 74 77 6f 20 45 78 70 72 4c 69  f the two ExprLi
216f0 73 74 20 6f 62 6a 65 63 74 73 20 61 72 65 20 64  st objects are d
21700 69 66 66 65 72 65 6e 74 2c 20 6f 72 0a 2a 2a 20  ifferent, or.** 
21710 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 20 77 69  a malfunction wi
21720 6c 6c 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  ll result..**.**
21730 20 54 77 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65   Two NULL pointe
21740 72 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  rs are considere
21750 64 20 74 6f 20 62 65 20 74 68 65 20 73 61 6d 65  d to be the same
21760 2e 20 20 42 75 74 20 61 20 4e 55 4c 4c 20 70 6f  .  But a NULL po
21770 69 6e 74 65 72 0a 2a 2a 20 61 6c 77 61 79 73 20  inter.** always 
21780 64 69 66 66 65 72 73 20 66 72 6f 6d 20 61 20 6e  differs from a n
21790 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e  on-NULL pointer.
217a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
217b0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 45  xprListCompare(E
217c0 78 70 72 4c 69 73 74 20 2a 70 41 2c 20 45 78 70  xprList *pA, Exp
217d0 72 4c 69 73 74 20 2a 70 42 2c 20 69 6e 74 20 69  rList *pB, int i
217e0 54 61 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Tab){.  int i;. 
217f0 20 69 66 28 20 70 41 3d 3d 30 20 26 26 20 70 42   if( pA==0 && pB
21800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21810 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70    if( pA==0 || p
21820 42 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  B==0 ) return 1;
21830 0a 20 20 69 66 28 20 70 41 2d 3e 6e 45 78 70 72  .  if( pA->nExpr
21840 21 3d 70 42 2d 3e 6e 45 78 70 72 20 29 20 72 65  !=pB->nExpr ) re
21850 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d  turn 1;.  for(i=
21860 30 3b 20 69 3c 70 41 2d 3e 6e 45 78 70 72 3b 20  0; i<pA->nExpr; 
21870 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
21880 70 45 78 70 72 41 20 3d 20 70 41 2d 3e 61 5b 69  pExprA = pA->a[i
21890 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ].pExpr;.    Exp
218a0 72 20 2a 70 45 78 70 72 42 20 3d 20 70 42 2d 3e  r *pExprB = pB->
218b0 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
218c0 69 66 28 20 70 41 2d 3e 61 5b 69 5d 2e 73 6f 72  if( pA->a[i].sor
218d0 74 4f 72 64 65 72 21 3d 70 42 2d 3e 61 5b 69 5d  tOrder!=pB->a[i]
218e0 2e 73 6f 72 74 4f 72 64 65 72 20 29 20 72 65 74  .sortOrder ) ret
218f0 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 73  urn 1;.    if( s
21900 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21910 65 28 70 45 78 70 72 41 2c 20 70 45 78 70 72 42  e(pExprA, pExprB
21920 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
21930 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
21940 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
21950 75 72 6e 20 74 72 75 65 20 69 66 20 77 65 20 63  urn true if we c
21960 61 6e 20 70 72 6f 76 65 20 74 68 65 20 70 45 32  an prove the pE2
21970 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
21980 74 72 75 65 20 69 66 20 70 45 31 20 69 73 0a 2a  true if pE1 is.*
21990 2a 20 74 72 75 65 2e 20 20 52 65 74 75 72 6e 20  * true.  Return 
219a0 66 61 6c 73 65 20 69 66 20 77 65 20 63 61 6e 6e  false if we cann
219b0 6f 74 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  ot complete the 
219c0 70 72 6f 6f 66 20 6f 72 20 69 66 20 70 45 32 20  proof or if pE2 
219d0 6d 69 67 68 74 0a 2a 2a 20 62 65 20 66 61 6c 73  might.** be fals
219e0 65 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  e.  Examples:.**
219f0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 3d  .**     pE1: x==
21a00 35 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d  5       pE2: x==
21a10 35 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65  5             Re
21a20 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
21a30 20 20 70 45 31 3a 20 78 3e 30 20 20 20 20 20 20    pE1: x>0      
21a40 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20    pE2: x==5     
21a50 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20          Result: 
21a60 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31  false.**     pE1
21a70 3a 20 78 3d 32 31 20 20 20 20 20 20 20 70 45 32  : x=21       pE2
21a80 3a 20 78 3d 32 31 20 4f 52 20 79 3d 34 33 20 20  : x=21 OR y=43  
21a90 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
21aa0 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 31  **     pE1: x!=1
21ab0 32 33 20 20 20 20 20 70 45 32 3a 20 78 20 49 53  23     pE2: x IS
21ac0 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73   NOT NULL    Res
21ad0 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20  ult: true.**    
21ae0 20 70 45 31 3a 20 78 21 3d 3f 31 20 20 20 20 20   pE1: x!=?1     
21af0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
21b00 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74  ULL    Result: t
21b10 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  rue.**     pE1: 
21b20 78 20 49 53 20 4e 55 4c 4c 20 20 70 45 32 3a 20  x IS NULL  pE2: 
21b30 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
21b40 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a   Result: false.*
21b50 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
21b60 3f 32 20 20 20 20 70 45 32 3a 20 78 20 49 53 20  ?2    pE2: x IS 
21b70 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 75 73  NOT NULL    Reus
21b80 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 0a 2a 2a 20  lt: false.**.** 
21b90 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 54  When comparing T
21ba0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 62  K_COLUMN nodes b
21bb0 65 74 77 65 65 6e 20 70 45 31 20 61 6e 64 20 70  etween pE1 and p
21bc0 45 32 2c 20 69 66 20 70 45 32 20 68 61 73 0a 2a  E2, if pE2 has.*
21bd0 2a 20 45 78 70 72 2e 69 54 61 62 6c 65 3c 30 20  * Expr.iTable<0 
21be0 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 74 61  then assume a ta
21bf0 62 6c 65 20 6e 75 6d 62 65 72 20 67 69 76 65 6e  ble number given
21c00 20 62 79 20 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20   by iTab..**.** 
21c10 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72  When in doubt, r
21c20 65 74 75 72 6e 20 66 61 6c 73 65 2e 20 20 52 65  eturn false.  Re
21c30 74 75 72 6e 69 6e 67 20 74 72 75 65 20 6d 69 67  turning true mig
21c40 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
21c50 6d 61 6e 63 65 0a 2a 2a 20 69 6d 70 72 6f 76 65  mance.** improve
21c60 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  ment.  Returning
21c70 20 66 61 6c 73 65 20 6d 69 67 68 74 20 63 61 75   false might cau
21c80 73 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  se a performance
21c90 20 72 65 64 75 63 74 69 6f 6e 2c 20 62 75 74 0a   reduction, but.
21ca0 2a 2a 20 69 74 20 77 69 6c 6c 20 61 6c 77 61 79  ** it will alway
21cb0 73 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65  s give the corre
21cc0 63 74 20 61 6e 73 77 65 72 20 61 6e 64 20 69 73  ct answer and is
21cd0 20 68 65 6e 63 65 20 61 6c 77 61 79 73 20 73 61   hence always sa
21ce0 66 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  fe..*/.int sqlit
21cf0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
21d00 72 28 45 78 70 72 20 2a 70 45 31 2c 20 45 78 70  r(Expr *pE1, Exp
21d10 72 20 2a 70 45 32 2c 20 69 6e 74 20 69 54 61 62  r *pE2, int iTab
21d20 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
21d30 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 31 2c  ExprCompare(pE1,
21d40 20 70 45 32 2c 20 69 54 61 62 29 3d 3d 30 20 29   pE2, iTab)==0 )
21d50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
21d60 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f    }.  if( pE2->o
21d70 70 3d 3d 54 4b 5f 4f 52 0a 20 20 20 26 26 20 28  p==TK_OR.   && (
21d80 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
21d90 65 73 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d  esExpr(pE1, pE2-
21da0 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 0a 20 20  >pLeft, iTab).  
21db0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
21dc0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
21dd0 45 78 70 72 28 70 45 31 2c 20 70 45 32 2d 3e 70  Expr(pE1, pE2->p
21de0 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 0a 20  Right, iTab) ). 
21df0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
21e00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 32 2d  ;.  }.  if( pE2-
21e10 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a  >op==TK_NOTNULL.
21e20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
21e30 72 43 6f 6d 70 61 72 65 28 70 45 31 2d 3e 70 4c  rCompare(pE1->pL
21e40 65 66 74 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c  eft, pE2->pLeft,
21e50 20 69 54 61 62 29 3d 3d 30 0a 20 20 20 26 26 20   iTab)==0.   && 
21e60 28 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  (pE1->op!=TK_ISN
21e70 55 4c 4c 20 26 26 20 70 45 31 2d 3e 6f 70 21 3d  ULL && pE1->op!=
21e80 54 4b 5f 49 53 29 0a 20 20 29 7b 0a 20 20 20 20  TK_IS).  ){.    
21e90 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21ea0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21eb0 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
21ec0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
21ed0 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
21ee0 64 20 62 79 20 74 68 65 20 74 72 65 65 20 77 61  d by the tree wa
21ef0 6c 6b 65 72 0a 2a 2a 20 74 6f 20 63 6f 75 6e 74  lker.** to count
21f00 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
21f10 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  able columns in 
21f20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66  the arguments of
21f30 20 61 6e 20 0a 2a 2a 20 61 67 67 72 65 67 61 74   an .** aggregat
21f40 65 20 66 75 6e 63 74 69 6f 6e 2c 20 69 6e 20 6f  e function, in o
21f50 72 64 65 72 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  rder to implemen
21f60 74 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  t the.** sqlite3
21f70 46 75 6e 63 74 69 6f 6e 54 68 69 73 53 72 63 28  FunctionThisSrc(
21f80 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
21f90 72 75 63 74 20 53 72 63 43 6f 75 6e 74 20 7b 0a  ruct SrcCount {.
21fa0 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
21fb0 20 20 20 2f 2a 20 4f 6e 65 20 70 61 72 74 69 63     /* One partic
21fc0 75 6c 61 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ular FROM clause
21fd0 20 69 6e 20 61 20 6e 65 73 74 65 64 20 71 75 65   in a nested que
21fe0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ry */.  int nThi
21ff0 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
22000 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
22010 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70   to columns in p
22020 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  SrcList */.  int
22030 20 6e 4f 74 68 65 72 3b 20 20 20 20 20 20 2f 2a   nOther;      /*
22040 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
22050 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
22060 20 69 6e 20 6f 74 68 65 72 20 46 52 4f 4d 20 63   in other FROM c
22070 6c 61 75 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  lauses */.};../*
22080 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
22090 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
220a0 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  es to columns..*
220b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
220c0 72 53 72 63 43 6f 75 6e 74 28 57 61 6c 6b 65 72  rSrcCount(Walker
220d0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
220e0 2a 70 45 78 70 72 29 7b 0a 20 20 2f 2a 20 54 68  *pExpr){.  /* Th
220f0 65 20 4e 45 56 45 52 28 29 20 6f 6e 20 74 68 65  e NEVER() on the
22100 20 73 65 63 6f 6e 64 20 74 65 72 6d 20 69 73 20   second term is 
22110 62 65 63 61 75 73 65 20 73 71 6c 69 74 65 33 46  because sqlite3F
22120 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
22130 72 63 28 29 0a 20 20 2a 2a 20 69 73 20 61 6c 77  rc().  ** is alw
22140 61 79 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72  ays called befor
22150 65 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  e sqlite3ExprAna
22160 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
22170 20 61 6e 64 20 73 6f 20 74 68 65 0a 20 20 2a 2a   and so the.  **
22180 20 54 4b 5f 43 4f 4c 55 4d 4e 73 20 68 61 76 65   TK_COLUMNs have
22190 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
221a0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 54 4b 5f  nverted into TK_
221b0 41 47 47 5f 43 4f 4c 55 4d 4e 2e 20 20 49 66 0a  AGG_COLUMN.  If.
221c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63    ** sqlite3Func
221d0 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
221e0 29 20 69 73 20 75 73 65 64 20 64 69 66 66 65 72  ) is used differ
221f0 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 66 75 74  ently in the fut
22200 75 72 65 2c 20 74 68 65 0a 20 20 2a 2a 20 4e 45  ure, the.  ** NE
22210 56 45 52 28 29 20 77 69 6c 6c 20 6e 65 65 64 20  VER() will need 
22220 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2e 20 2a  to be removed. *
22230 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  /.  if( pExpr->o
22240 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
22250 4e 45 56 45 52 28 70 45 78 70 72 2d 3e 6f 70 3d  NEVER(pExpr->op=
22260 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20  =TK_AGG_COLUMN) 
22270 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
22280 20 20 73 74 72 75 63 74 20 53 72 63 43 6f 75 6e    struct SrcCoun
22290 74 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  t *p = pWalker->
222a0 75 2e 70 53 72 63 43 6f 75 6e 74 3b 0a 20 20 20  u.pSrcCount;.   
222b0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
222c0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 6e   p->pSrc;.    in
222d0 74 20 6e 53 72 63 20 3d 20 70 53 72 63 20 3f 20  t nSrc = pSrc ? 
222e0 70 53 72 63 2d 3e 6e 53 72 63 20 3a 20 30 3b 0a  pSrc->nSrc : 0;.
222f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
22300 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
22310 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
22320 6c 65 3d 3d 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  le==pSrc->a[i].i
22330 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a  Cursor ) break;.
22340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
22350 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d  nSrc ){.      p-
22360 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65  >nThis++;.    }e
22370 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f  lse{.      p->nO
22380 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  ther++;.    }.  
22390 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
223a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
223b0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61  * Determine if a
223c0 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65  ny of the argume
223d0 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70 72  nts to the pExpr
223e0 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65   Function refere
223f0 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e  nce.** pSrcList.
22400 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
22410 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20   they do.  Also 
22420 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
22430 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  he function.** h
22440 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  as no arguments 
22450 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73  or has only cons
22460 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20  tant arguments. 
22470 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
22480 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65   pExpr.** refere
22490 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74  nces columns but
224a0 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   not columns of 
224b0 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20  tables found in 
224c0 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74  pSrcList..*/.int
224d0 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
224e0 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70 72  UsesThisSrc(Expr
224f0 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74   *pExpr, SrcList
22500 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57   *pSrcList){.  W
22510 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63  alker w;.  struc
22520 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a  t SrcCount cnt;.
22530 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
22540 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op==TK_AGG_FUNC
22550 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74  TION );.  memset
22560 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
22570 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
22580 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43  lback = exprSrcC
22590 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63  ount;.  w.u.pSrc
225a0 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20  Count = &cnt;.  
225b0 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c  cnt.pSrc = pSrcL
225c0 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73  ist;.  cnt.nThis
225d0 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68   = 0;.  cnt.nOth
225e0 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
225f0 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77  3WalkExprList(&w
22600 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
22610 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e  );.  return cnt.
22620 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e  nThis>0 || cnt.n
22630 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  Other==0;.}../*.
22640 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
22650 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
22660 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72  Info->aCol[] arr
22670 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
22680 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
22690 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
226a0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
226b0 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
226c0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
226d0 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
226e0 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a  Column(sqlite3 *
226f0 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e  db, AggInfo *pIn
22700 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  fo){.  int i;.  
22710 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71  pInfo->aCol = sq
22720 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
22730 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20  te(.       db,. 
22740 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f        pInfo->aCo
22750 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66  l,.       sizeof
22760 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29  (pInfo->aCol[0])
22770 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
22780 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >nColumn,.      
22790 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
227a0 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
227b0 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
227c0 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49  ent to the pAggI
227d0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72  nfo->aFunc[] arr
227e0 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ay.  Return the 
227f0 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20  index of.** the 
22800 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65  new element.  Re
22810 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
22820 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63  number if malloc
22830 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
22840 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f  c int addAggInfo
22850 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62  Func(sqlite3 *db
22860 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
22870 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
22880 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c  nfo->aFunc = sql
22890 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
228a0 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20  e(.       db, . 
228b0 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75        pInfo->aFu
228c0 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  nc,.       sizeo
228d0 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  f(pInfo->aFunc[0
228e0 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66  ]),.       &pInf
228f0 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20  o->nFunc,.      
22900 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72   &i.  );.  retur
22910 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a  n i;.}    ../*.*
22920 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 45  * This is the xE
22930 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  xprCallback for 
22940 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20  a tree walker.  
22950 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a  It is used to.**
22960 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74   implement sqlit
22970 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
22980 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20  regates().  See 
22990 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
229a0 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20  zeAggregates.** 
229b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
229c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
229d0 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a  tatic int analyz
229e0 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65  eAggregate(Walke
229f0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
22a00 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20   *pExpr){.  int 
22a10 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
22a20 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d   *pNC = pWalker-
22a30 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  >u.pNC;.  Parse 
22a40 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  *pParse = pNC->p
22a50 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74  Parse;.  SrcList
22a60 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
22a70 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67  ->pSrcList;.  Ag
22a80 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
22a90 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b  = pNC->pAggInfo;
22aa0 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
22ab0 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
22ac0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
22ad0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
22ae0 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  UMN: {.      tes
22af0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
22b00 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
22b10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22b20 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
22b30 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
22b40 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
22b50 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
22b60 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
22b70 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
22b80 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  OM.      ** clau
22b90 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
22ba0 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  ate query */.   
22bb0 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53     if( ALWAYS(pS
22bc0 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  rcList!=0) ){.  
22bd0 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
22be0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
22bf0 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
22c00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
22c10 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
22c20 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
22c30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
22c40 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
22c50 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  pCol;.          
22c60 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
22c70 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
22c80 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
22c90 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20  Reduced) );.    
22ca0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
22cb0 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
22cc0 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
22cd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
22ce0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
22cf0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
22d00 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f 20  pExpr refers to 
22d10 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20  a table.        
22d20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69      ** that is i
22d30 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
22d40 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61  e of the aggrega
22d50 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20  te query.  .    
22d60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22d70 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61         ** Make a
22d80 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
22d90 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e  column in pAggIn
22da0 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68  fo->aCol[] if th
22db0 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ere.            
22dc0 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74  ** is not an ent
22dd0 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ry there already
22de0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
22df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22e00 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
22e10 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d  pCol = pAggInfo-
22e20 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  >aCol;.         
22e30 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41     for(k=0; k<pA
22e40 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
22e50 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   k++, pCol++){. 
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22e70 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70   pCol->iTable==p
22e80 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a  Expr->iTable &&.
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d    pCol->iColumn=
22eb0 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
22ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22ed0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22f00 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67      if( (k>=pAgg
22f10 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20  Info->nColumn). 
22f20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
22f30 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  k = addAggInfoCo
22f40 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  lumn(pParse->db,
22f50 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a   pAggInfo))>=0 .
22f60 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22f80 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
22f90 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Col[k];.        
22fa0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
22fb0 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a   = pExpr->pTab;.
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22fd0 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78  ol->iTable = pEx
22fe0 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
22ff0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
23000 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  iColumn = pExpr-
23010 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
23020 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d          pCol->iM
23030 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
23040 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
23050 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
23060 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
23070 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23080 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
230a0 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  ( pAggInfo->pGro
230b0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  upBy ){.        
230c0 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e          int j, n
230d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
230e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20    ExprList *pGB 
230f0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f  = pAggInfo->pGro
23100 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20  upBy;.          
23110 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
23120 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72  rList_item *pTer
23130 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20  m = pGB->a;.    
23140 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
23150 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pGB->nExpr;.    
23160 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
23170 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70  j=0; j<n; j++, p
23180 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
23190 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
231a0 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pE = pTerm->pEx
231b0 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
231c0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
231d0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
231e0 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72  E->iTable==pExpr
231f0 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20  ->iTable &&.    
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70    pE->iColumn==p
23220 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
23230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23240 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
23250 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  erColumn = j;.  
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23280 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
232c0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
232d0 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
232e0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
232f0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20  iSorterColumn = 
23300 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69  pAggInfo->nSorti
23310 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20  ngColumn++;.    
23320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23340 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
23350 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66  s now an entry f
23360 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67 67  or pExpr in pAgg
23370 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69  Info->aCol[] (ei
23380 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
23390 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 77   ** because it w
233a0 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65 20  as there before 
233b0 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  or because we ju
233c0 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a  st created it)..
233d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43              ** C
233e0 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70 72  onvert the pExpr
233f0 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f   to be a TK_AGG_
23400 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67  COLUMN referring
23410 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20   to that.       
23420 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f       ** pAggInfo
23430 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a  ->aCol[] entry..
23440 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
23450 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
23460 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
23470 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
23480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
23490 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d  Expr->pAggInfo =
234a0 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20   pAggInfo;.     
234b0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
234c0 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e   = TK_AGG_COLUMN
234d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
234e0 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36  xpr->iAgg = (i16
234f0 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )k;.            
23500 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23510 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70   } /* endif pExp
23520 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d  r->iTable==pItem
23530 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  ->iCursor */.   
23540 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f       } /* end lo
23550 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  op over pSrcList
23560 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
23570 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
23580 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ne;.    }.    ca
23590 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
235a0 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ON: {.      if( 
235b0 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
235c0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30  NC_InAggFunc)==0
235d0 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b  .       && pWalk
235e0 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d  er->walkerDepth=
235f0 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20  =pExpr->op2.    
23600 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
23610 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
23620 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c 69  pExpr is a dupli
23630 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  cate of another 
23640 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20 20  aggregate .     
23650 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74     ** function t
23660 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  hat is already i
23670 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73  n the pAggInfo s
23680 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20 20  tructure.       
23690 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75   */.        stru
236a0 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
236b0 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66  *pItem = pAggInf
236c0 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20  o->aFunc;.      
236d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
236e0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
236f0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
23700 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
23710 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
23720 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70  tem->pExpr, pExp
23730 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20  r, -1)==0 ){.   
23740 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23750 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23770 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e  ( i>=pAggInfo->n
23780 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Func ){.        
23790 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72    /* pExpr is or
237a0 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20  iginal.  Make a 
237b0 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67  new entry in pAg
237c0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20  gInfo->aFunc[]. 
237d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
237e0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
237f0 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  NC(pParse->db);.
23800 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 64            i = ad
23810 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61  dAggInfoFunc(pPa
23820 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66  rse->db, pAggInf
23830 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
23840 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i>=0 ){.      
23850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23860 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23870 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
23880 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ct) );.         
23890 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67     pItem = &pAgg
238a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a  Info->aFunc[i];.
238b0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
238c0 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
238d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
238e0 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  tem->iMem = ++pP
238f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
23900 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23910 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
23920 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
23930 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
23940 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63      pItem->pFunc
23950 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
23960 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
23970 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
23980 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a        pExpr->u.z
23990 54 6f 6b 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  Token, .        
239a0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
239b0 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70  ->x.pList ? pExp
239c0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
239d0 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
239e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
239f0 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
23a00 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
23a10 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
23a20 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70  m->iDistinct = p
23a30 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
23a40 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
23a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23a60 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74  pItem->iDistinct
23a70 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
23a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23aa0 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72     /* Make pExpr
23ab0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70   point to the ap
23ac0 70 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e  propriate pAggIn
23ad0 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72  fo->aFunc[] entr
23ae0 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  y.        */.   
23af0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
23b00 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
23b10 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  xpr, EP_TokenOnl
23b20 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
23b30 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74  .        ExprSet
23b40 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
23b50 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
23b60 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
23b70 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20  iAgg = (i16)i;. 
23b80 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41         pExpr->pA
23b90 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66  ggInfo = pAggInf
23ba0 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  o;.        retur
23bb0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
23bc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23bd0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
23be0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
23bf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23c00 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23c10 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  }.static int ana
23c20 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
23c30 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70  Select(Walker *p
23c40 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
23c50 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
23c60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61  ED_PARAMETER(pWa
23c70 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  lker);.  UNUSED_
23c80 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
23c90 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  t);.  return WRC
23ca0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
23cb0 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
23cc0 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
23cd0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
23ce0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
23cf0 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
23d00 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
23d10 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41  to be added to A
23d20 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  ggInfo object th
23d30 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f  at pNC->pAggInfo
23d40 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  .** points to.  
23d50 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  Additional entri
23d60 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74  es are made on t
23d70 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63  he AggInfo objec
23d80 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72  t as.** necessar
23d90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
23da0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
23db0 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65  y be called afte
23dc0 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  r the expression
23dd0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61   has been.** ana
23de0 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lyzed by sqlite3
23df0 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
23e00 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
23e10 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
23e20 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
23e30 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
23e40 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65  *pExpr){.  Walke
23e50 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
23e60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
23e70 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
23e80 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72  ck = analyzeAggr
23e90 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65  egate;.  w.xSele
23ea0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61  ctCallback = ana
23eb0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e  lyzeAggregatesIn
23ec0 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e  Select;.  w.u.pN
23ed0 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72  C = pNC;.  asser
23ee0 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
23ef0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
23f00 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
23f10 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  pr);.}../*.** Ca
23f20 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  ll sqlite3ExprAn
23f30 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
23f40 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72  ) for every expr
23f50 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20  ession in an.** 
23f60 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
23f70 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
23f80 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
23f90 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
23fa0 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61   is found, the a
23fb0 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73  nalysis is cut s
23fc0 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hort..*/.void sq
23fd0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
23fe0 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74  AggList(NameCont
23ff0 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69  ext *pNC, ExprLi
24000 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74  st *pList){.  st
24010 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
24020 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
24030 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
24040 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d  ){.    for(pItem
24050 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
24060 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
24070 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
24080 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24090 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
240a0 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45  s(pNC, pItem->pE
240b0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
240c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
240d0 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72  e a single new r
240e0 65 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20  egister for use 
240f0 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74  to hold some int
24100 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
24110 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24120 47 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65  GetTempReg(Parse
24130 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28   *pParse){.  if(
24140 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65   pParse->nTempRe
24150 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
24160 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65  rn ++pParse->nMe
24170 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  m;.  }.  return 
24180 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
24190 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  [--pParse->nTemp
241a0 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Reg];.}../*.** D
241b0 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69  eallocate a regi
241c0 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61  ster, making ava
241d0 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65  ilable for reuse
241e0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a   for some other.
241f0 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a  ** purpose..**.*
24200 2a 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20  * If a register 
24210 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
24220 6e 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ng used by the c
24230 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65  olumn cache, the
24240 6e 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63  n.** the dealloc
24250 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65  ation is deferre
24260 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75  d until the colu
24270 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68  mn cache line th
24280 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72  at uses.** the r
24290 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20  egister becomes 
242a0 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stale..*/.void s
242b0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
242c0 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72  pReg(Parse *pPar
242d0 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20  se, int iReg){. 
242e0 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61   if( iReg && pPa
242f0 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72  rse->nTempReg<Ar
24300 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e  raySize(pParse->
24310 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20  aTempReg) ){.   
24320 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75   int i;.    stru
24330 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
24340 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  .    for(i=0, p=
24350 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
24360 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
24370 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
24380 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
24390 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20  iReg==iReg ){.  
243a0 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
243b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
243c0 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  turn;.      }.  
243d0 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
243e0 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d  aTempReg[pParse-
243f0 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69  >nTempReg++] = i
24400 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Reg;.  }.}../*.*
24410 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65  * Allocate or de
24420 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b  allocate a block
24430 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75   of nReg consecu
24440 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tive registers.*
24450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74  /.int sqlite3Get
24460 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20  TempRange(Parse 
24470 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65  *pParse, int nRe
24480 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a  g){.  int i, n;.
24490 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52    i = pParse->iR
244a0 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70  angeReg;.  n = p
244b0 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
244c0 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20  ;.  if( nReg<=n 
244d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
244e0 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68  usedAsColumnCach
244f0 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e  e(pParse, i, i+n
24500 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73  -1) );.    pPars
24510 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20  e->iRangeReg += 
24520 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65  nReg;.    pParse
24530 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e  ->nRangeReg -= n
24540 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Reg;.  }else{.  
24550 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d    i = pParse->nM
24560 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
24570 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
24580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
24590 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  }.void sqlite3Re
245a0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50  leaseTempRange(P
245b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
245c0 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
245d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  ){.  sqlite3Expr
245e0 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72  CacheRemove(pPar
245f0 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b  se, iReg, nReg);
24600 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72  .  if( nReg>pPar
24610 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b  se->nRangeReg ){
24620 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61  .    pParse->nRa
24630 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20  ngeReg = nReg;. 
24640 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67     pParse->iRang
24650 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d  eReg = iReg;.  }
24660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
24670 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ll temporary reg
24680 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20  isters as being 
24690 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  unavailable for 
246a0 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reuse..*/.void s
246b0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
246c0 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  egCache(Parse *p
246d0 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
246e0 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a  ->nTempReg = 0;.
246f0 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65    pParse->nRange
24700 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reg = 0;.}../*.*
24710 2a 20 56 61 6c 69 64 61 74 65 20 74 68 61 74 20  * Validate that 
24720 6e 6f 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  no temporary reg
24730 69 73 74 65 72 20 66 61 6c 6c 73 20 77 69 74 68  ister falls with
24740 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a  in the range of.
24750 2a 2a 20 69 46 69 72 73 74 2e 2e 69 4c 61 73 74  ** iFirst..iLast
24760 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 54 68  , inclusive.  Th
24770 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
24780 6c 79 20 63 61 6c 6c 20 66 72 6f 6d 20 77 69 74  ly call from wit
24790 68 69 6e 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  hin assert().** 
247a0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 23  statements..*/.#
247b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
247c0 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  UG.int sqlite3No
247d0 54 65 6d 70 73 49 6e 52 61 6e 67 65 28 50 61 72  TempsInRange(Par
247e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
247f0 69 46 69 72 73 74 2c 20 69 6e 74 20 69 4c 61 73  iFirst, int iLas
24800 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
24810 66 28 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  f( pParse->nRang
24820 65 52 65 67 3e 30 0a 20 20 20 26 26 20 70 50 61  eReg>0.   && pPa
24830 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 2b 70  rse->iRangeReg+p
24840 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
24850 3c 69 4c 61 73 74 0a 20 20 20 26 26 20 70 50 61  <iLast.   && pPa
24860 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 3e 3d  rse->iRangeReg>=
24870 69 46 69 72 73 74 0a 20 20 29 7b 0a 20 20 20 20  iFirst.  ){.    
24880 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
24890 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
248a0 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3b 20 69 2b  se->nTempReg; i+
248b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72  +){.    if( pPar
248c0 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3e  se->aTempReg[i]>
248d0 3d 69 46 69 72 73 74 20 26 26 20 70 50 61 72 73  =iFirst && pPars
248e0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 69 5d 3c 3d  e->aTempReg[i]<=
248f0 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  iLast ){.      r
24900 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
24910 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
24920 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
24930 45 5f 44 45 42 55 47 20 2a 2f 0a                 E_DEBUG */.