/ Hex Artifact Content
Login

Artifact 4f101c8ddc6d5a22303c88278069f5261562a9a8:


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 20 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 29 7b  g sequence */.){
09c0: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d 65  .  if( pCollName
09d0: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78 70  ->n>0 ){.    Exp
09e0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
09f0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
0a00: 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41 54  e->db, TK_COLLAT
0a10: 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31 29  E, pCollName, 1)
0a20: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
0a30: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c  {.      pNew->pL
0a40: 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  eft = pExpr;.   
0a50: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
0a60: 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50 5f  = EP_Collate|EP_
0a70: 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78 70  Skip;.      pExp
0a80: 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
0a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
0aa0: 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c 69  pr;.}.Expr *sqli
0ab0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
0ac0: 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a 70  eString(Parse *p
0ad0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0ae0: 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pr, const char *
0af0: 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b 0a  zC){.  Token s;.
0b00: 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30 20    assert( zC!=0 
0b10: 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a 20  );.  s.z = zC;. 
0b20: 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   s.n = sqlite3St
0b30: 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20 72  rlen30(s.z);.  r
0b40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
0b50: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
0b60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
0b70: 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6b  &s);.}../*.** Sk
0b80: 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f 43  ip over any TK_C
0b90: 4f 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53 20  OLLATE or TK_AS 
0ba0: 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61 6e  operators and an
0bb0: 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a 20  y unlikely().** 
0bc0: 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  or likelihood() 
0bd0: 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65 20  function at the 
0be0: 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72 65  root of an expre
0bf0: 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ssion..*/.Expr *
0c00: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
0c10: 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45 78  ollate(Expr *pEx
0c20: 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45  pr){.  while( pE
0c30: 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50 72  xpr && ExprHasPr
0c40: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
0c50: 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69 66  _Skip) ){.    if
0c60: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
0c70: 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69  y(pExpr, EP_Unli
0c80: 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 61  kely) ){.      a
0c90: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
0ca0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0cb0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
0cc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
0cd0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
0ce0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  xpr>0 );.      a
0cf0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
0d00: 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  ==TK_FUNCTION );
0d10: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d20: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
0d30: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [0].pExpr;.    }
0d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
0d50: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
0d60: 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45 78  K_COLLATE || pEx
0d70: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 3b  pr->op==TK_AS );
0d80: 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
0d90: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
0da0: 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74 75   }.  }   .  retu
0db0: 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a  rn pExpr;.}../*.
0dc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
0dd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
0de0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
0df0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
0e00: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
0e10: 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ined collating s
0e20: 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e 20  equence, return 
0e30: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
0e40: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
0e50: 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74 65  ce might be dete
0e60: 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c 4c  rmined by a COLL
0e70: 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  ATE operator.** 
0e80: 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65 6e  or by the presen
0e90: 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 77  ce of a column w
0ea0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63 6f  ith a defined co
0eb0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
0ec0: 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70 65  ..** COLLATE ope
0ed0: 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72 73  rators take firs
0ee0: 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 4c  t precedence.  L
0ef0: 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61 6b  eft operands tak
0f00: 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65 20  e.** precedence 
0f10: 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72 61  over right opera
0f20: 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  nds..*/.CollSeq 
0f30: 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c  *sqlite3ExprColl
0f40: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
0f50: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
0f60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 43   pParse->db;.  C
0f80: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0f90: 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 70  0;.  Expr *p = p
0fa0: 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  Expr;.  while( p
0fb0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d   ){.    int op =
0fc0: 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28 20   p->op;.    if( 
0fd0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47 65  p->flags & EP_Ge
0fe0: 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a 20  neric ) break;. 
0ff0: 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41     if( op==TK_CA
1000: 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 4c  ST || op==TK_UPL
1010: 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  US ){.      p = 
1020: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
1030: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1040: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1050: 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d 54  OLLATE || (op==T
1060: 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d  K_REGISTER && p-
1070: 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  >op2==TK_COLLATE
1080: 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  ) ){.      pColl
1090: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
10a0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e 43  lSeq(pParse, ENC
10b0: 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a 54  (db), 0, p->u.zT
10c0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
10d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
10e0: 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20 20  ( p->pTab!=0.   
10f0: 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47 47    && (op==TK_AGG
1100: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d 54  _COLUMN || op==T
1110: 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20  K_COLUMN.       
1120: 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47     || op==TK_REG
1130: 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ISTER || op==TK_
1140: 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b 0a  TRIGGER).    ){.
1150: 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f        /* op==TK_
1160: 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e 70  REGISTER && p->p
1170: 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20 77  Tab!=0 happens w
1180: 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f 72  hen pExpr was or
1190: 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20 2a  iginally.      *
11a0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
11b0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
11c0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
11d0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
11e0: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ter */.      int
11f0: 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b   j = p->iColumn;
1200: 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30 20  .      if( j>=0 
1210: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
1220: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
1230: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ->pTab->aCol[j].
1240: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  zColl;.        p
1250: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
1260: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
1270: 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
1280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
12b0: 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
12c0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
12d0: 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d 3e  ->pLeft) && (p->
12e0: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45  pLeft->flags & E
12f0: 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29 7b  P_Collate)!=0 ){
1300: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  .        p = p->
1310: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pLeft;.      }el
1320: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  se{.        p = 
1330: 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  p->pRight;.     
1340: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1360: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1370: 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70  e3CheckCollSeq(p
1380: 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b  Parse, pColl) ){
1390: 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b   .    pColl = 0;
13a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
13b0: 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  oll;.}../*.** pE
13c0: 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61 6e  xpr is an operan
13d0: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
13e0: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
13f0: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
1400: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
1410: 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e 20   other operand. 
1420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1430: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
1440: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
1450: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
1460: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
1470: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
1480: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
1490: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
14a0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
14b0: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
14c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
14d0: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
14e0: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
14f0: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
1500: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
1510: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
1520: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
1530: 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20 61  numeric.    ** a
1540: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
1550: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
1560: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
1570: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
1580: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1590: 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20 73  inity(aff1) || s
15a0: 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41  qlite3IsNumericA
15b0: 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29 7b  ffinity(aff2) ){
15c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15d0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
15e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1600: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  _AFF_NONE;.    }
1610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1620: 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20  f1 && !aff2 ){. 
1630: 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69     /* Neither si
1640: 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  de of the compar
1650: 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  ison is a column
1660: 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a 20  .  Compare the. 
1670: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64 69     ** results di
1680: 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  rectly..    */. 
1690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a0: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c  _AFF_NONE;.  }el
16b0: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
16c0: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
16d0: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
16e0: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
16f0: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
1700: 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66 31      assert( aff1
1710: 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20 29  ==0 || aff2==0 )
1720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61 66  ;.    return (af
1730: 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a  f1 + aff2);.  }.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
1750: 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  s a comparison o
1760: 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e  perator.  Return
1770: 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e 69   the type affini
1780: 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  ty that should.*
1790: 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20  * be applied to 
17a0: 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72  both operands pr
17b0: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65  ior to doing the
17c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a   comparison..*/.
17d0: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70  static char comp
17e0: 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45  arisonAffinity(E
17f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63  xpr *pExpr){.  c
1800: 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72  har aff;.  asser
1810: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1820: 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _EQ || pExpr->op
1830: 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72  ==TK_IN || pExpr
1840: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20  ->op==TK_LT ||. 
1850: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1860: 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78  op==TK_GT || pEx
1870: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c  pr->op==TK_GE ||
1880: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
1890: 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  E ||.          p
18a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
18b0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
18c0: 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IS || pExpr->op
18d0: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
18e0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
18f0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
1900: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
1910: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
1920: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
1930: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
1940: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
1950: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
1960: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
1970: 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70 72    }else if( Expr
1980: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1990: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
19a0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
19b0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
19c0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70 53  nity(pExpr->x.pS
19d0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
19e0: 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b  [0].pExpr, aff);
19f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66  .  }else if( !af
1a00: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
1a10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
1a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
1a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
1a40: 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   is a comparison
1a50: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e   expression, eg.
1a60: 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e   '=', '<', IN(..
1a70: 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61  .) etc..** idx_a
1a80: 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61  ffinity is the a
1a90: 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e  ffinity of an in
1aa0: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65  dexed column. Re
1ab0: 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20  turn true.** if 
1ac0: 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61  the index with a
1ad0: 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69  ffinity idx_affi
1ae0: 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64  nity may be used
1af0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
1b00: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1b10: 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74  in pExpr..*/.int
1b20: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
1b30: 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45  inityOk(Expr *pE
1b40: 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66  xpr, char idx_af
1b50: 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20  finity){.  char 
1b60: 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e  aff = comparison
1b70: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b  Affinity(pExpr);
1b80: 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20 29  .  switch( aff )
1b90: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1ba0: 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20 20  E_AFF_NONE:.    
1bb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
1bd0: 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74 75  TEXT:.      retu
1be0: 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d  rn idx_affinity=
1bf0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  =SQLITE_AFF_TEXT
1c00: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
1c10: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1c20: 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66 69  te3IsNumericAffi
1c30: 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69 74  nity(idx_affinit
1c40: 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  y);.  }.}../*.**
1c50: 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20 76   Return the P5 v
1c60: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
1c70: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
1c80: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
1c90: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
1ca0: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
1cb0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
1cc0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
1cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 62  ..*/.static u8 b
1ce0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28 45  inaryCompareP5(E
1cf0: 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78 70  xpr *pExpr1, Exp
1d00: 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20 6a  r *pExpr2, int j
1d10: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75 38  umpIfNull){.  u8
1d20: 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71 6c   aff = (char)sql
1d30: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
1d40: 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66 20  (pExpr2);.  aff 
1d50: 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f 6d  = (u8)sqlite3Com
1d60: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
1d70: 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38 29  pr1, aff) | (u8)
1d80: 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72 65  jumpIfNull;.  re
1d90: 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a  turn aff;.}../*.
1da0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1db0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61  ter to the colla
1dc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68  tion sequence th
1dd0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
1de0: 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79  d by.** a binary
1df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1e00: 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70  ator comparing p
1e10: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e  Left and pRight.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65  .**.** If the le
1e30: 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69  ft hand expressi
1e40: 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  on has a collati
1e50: 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65  ng sequence type
1e60: 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  , then it is.** 
1e70: 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  used. Otherwise 
1e80: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1e90: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
1ea0: 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73  ight hand expres
1eb0: 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c  sion.** is used,
1ec0: 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20   or the default 
1ed0: 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74  (BINARY) if neit
1ee0: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68  her expression h
1ef0: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  as a collating.*
1f00: 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41 72  * type..**.** Ar
1f10: 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28 62  gument pRight (b
1f20: 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d 61  ut not pLeft) ma
1f30: 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  y be a null poin
1f40: 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ter. In this cas
1f50: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  e,.** it is not 
1f60: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 43  considered..*/.C
1f70: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 42  ollSeq *sqlite3B
1f80: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1f90: 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Seq(.  Parse *pP
1fa0: 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70  arse, .  Expr *p
1fb0: 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a 70  Left, .  Expr *p
1fc0: 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c 53  Right.){.  CollS
1fd0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73 73  eq *pColl;.  ass
1fe0: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
1ff0: 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73  if( pLeft->flags
2000: 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b   & EP_Collate ){
2010: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
2020: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2030: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
2040: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67    }else if( pRig
2050: 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e 66  ht && (pRight->f
2060: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
2070: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  e)!=0 ){.    pCo
2080: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
2090: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
20a0: 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73 65  pRight);.  }else
20b0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
20c0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
20d0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
20e0: 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20  .    if( !pColl 
20f0: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  ){.      pColl =
2100: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
2110: 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69 67  Seq(pParse, pRig
2120: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ht);.    }.  }. 
2130: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
2140: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2150: 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
2160: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
2170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2180: 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61  odeCompare(.  Pa
2190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21a0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28  /* The parsing (
21b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
21c0: 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ing) context */.
21d0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20    Expr *pLeft,  
21e0: 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
21f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70  operand */.  Exp
2200: 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f  r *pRight,     /
2210: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
2220: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63  and */.  int opc
2230: 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ode,       /* Th
2240: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63  e comparison opc
2250: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 31  ode */.  int in1
2260: 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52 65  , int in2, /* Re
2270: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 6f  gister holding o
2280: 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74  perands */.  int
2290: 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f   dest,         /
22a0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74  * Jump here if t
22b0: 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a  rue.  */.  int j
22c0: 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20  umpIfNull    /* 
22d0: 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66  If true, jump if
22e0: 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20   either operand 
22f0: 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  is NULL */.){.  
2300: 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61 64  int p5;.  int ad
2310: 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  dr;.  CollSeq *p
2320: 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69 74  4;..  p4 = sqlit
2330: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
2340: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
2350: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
2360: 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70   p5 = binaryComp
2370: 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52 69  areP5(pLeft, pRi
2380: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
2390: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
23a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50 61  e3VdbeAddOp4(pPa
23b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
23c0: 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20 69  de, in2, dest, i
23d0: 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n1,.            
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23f0: 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f 4c  void*)p4, P4_COL
2400: 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65 33  LSEQ);.  sqlite3
2410: 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50 61  VdbeChangeP5(pPa
2420: 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38 29  rse->pVdbe, (u8)
2430: 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  p5);.  return ad
2440: 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dr;.}..#if SQLIT
2450: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2460: 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  >0./*.** Check t
2470: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48 65  hat argument nHe
2480: 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68 61  ight is less tha
2490: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
24a0: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78 70  e maximum.** exp
24b0: 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61 6c  ression depth al
24c0: 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73 20  lowed. If it is 
24d0: 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  not, leave an er
24e0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a 2a  ror message in.*
24f0: 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74  * pParse..*/.int
2500: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
2510: 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a 70  kHeight(Parse *p
2520: 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69 67  Parse, int nHeig
2530: 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ht){.  int rc = 
2540: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
2550: 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61 72   mxHeight = pPar
2560: 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  se->db->aLimit[S
2570: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2580: 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20 6e  _DEPTH];.  if( n
2590: 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74 20  Height>mxHeight 
25a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
25c0: 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73 69         "Expressi
25d0: 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20 6c  on tree is too l
25e0: 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64 65  arge (maximum de
25f0: 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69 67  pth %d)", mxHeig
2600: 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  ht.    );.    rc
2610: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2630: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;.}../* The foll
2640: 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63  owing three func
2650: 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66 45  tions, heightOfE
2660: 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66 45  xpr(), heightOfE
2670: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e 64  xprList().** and
2680: 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28   heightOfSelect(
2690: 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  ), are used to d
26a0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
26b0: 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20 6f  imum height.** o
26c0: 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  f any expression
26d0: 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65 64   tree referenced
26e0: 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75 72   by the structur
26f0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  e passed as the.
2700: 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ** first argumen
2710: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
2720: 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74 20   maximum height 
2730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2740: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
2750: 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20  e pointed.** to 
2760: 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68 65  by pnHeight, the
2770: 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
2780: 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e 48  r, then set *pnH
2790: 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a 2a  eight to that.**
27a0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
27b0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 45  c void heightOfE
27c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
27d0: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
27e0: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  f( p ){.    if( 
27f0: 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48 65  p->nHeight>*pnHe
2800: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  ight ){.      *p
2810: 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48 65  nHeight = p->nHe
2820: 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ight;.    }.  }.
2830: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 65  }.static void he
2840: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 45  ightOfExprList(E
2850: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
2860: 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69 66  *pnHeight){.  if
2870: 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
2880: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2890: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  <p->nExpr; i++){
28a0: 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66 45  .      heightOfE
28b0: 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78 70  xpr(p->a[i].pExp
28c0: 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  r, pnHeight);.  
28d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
28e0: 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53 65   void heightOfSe
28f0: 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  lect(Select *p, 
2900: 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a  int *pnHeight){.
2910: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 68    if( p ){.    h
2920: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2930: 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74 29  Where, pnHeight)
2940: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2950: 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20 70  pr(p->pHaving, p
2960: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
2970: 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70 4c  ightOfExpr(p->pL
2980: 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29 3b  imit, pnHeight);
2990: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
29a0: 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70 6e  r(p->pOffset, pn
29b0: 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65 69  Height);.    hei
29c0: 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70 2d  ghtOfExprList(p-
29d0: 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67 68  >pEList, pnHeigh
29e0: 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66  t);.    heightOf
29f0: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f  ExprList(p->pGro
2a00: 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b  upBy, pnHeight);
2a10: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78 70  .    heightOfExp
2a20: 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
2a30: 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20 20  y, pnHeight);.  
2a40: 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74    heightOfSelect
2a50: 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48 65  (p->pPrior, pnHe
2a60: 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ight);.  }.}../*
2a70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
2a80: 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62 6c  .nHeight variabl
2a90: 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  e in the structu
2aa0: 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  re passed as an 
2ab0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41 6e  .** argument. An
2ac0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2ad0: 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45 78   no children, Ex
2ae0: 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a 20  pr.pList or .** 
2af0: 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65 6d  Expr.pSelect mem
2b00: 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68 74  ber has a height
2b10: 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65 72   of 1. Any other
2b20: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 68   expression.** h
2b30: 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75 61  as a height equa
2b40: 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  l to the maximum
2b50: 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20 6f   height of any o
2b60: 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65 6e  ther .** referen
2b70: 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f 6e  ced Expr plus on
2b80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2b90: 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  d exprSetHeight(
2ba0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Expr *p){.  int 
2bb0: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2bc0: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2bd0: 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  Left, &nHeight);
2be0: 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72 28  .  heightOfExpr(
2bf0: 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65 69  p->pRight, &nHei
2c00: 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70 72  ght);.  if( Expr
2c10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
2c20: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
2c30: 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65      heightOfSele
2c40: 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74 2c  ct(p->x.pSelect,
2c50: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d 65   &nHeight);.  }e
2c60: 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74 4f  lse{.    heightO
2c70: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e 70  fExprList(p->x.p
2c80: 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29 3b  List, &nHeight);
2c90: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67 68  .  }.  p->nHeigh
2ca0: 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31 3b  t = nHeight + 1;
2cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2cc0: 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20 76  e Expr.nHeight v
2cd0: 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74 68  ariable using th
2ce0: 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28  e exprSetHeight(
2cf0: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a 2a  ) function. If.*
2d00: 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73 20  * the height is 
2d10: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
2d20: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
2d30: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 74   expression dept
2d40: 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  h,.** leave an e
2d50: 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 0a  rror in pParse..
2d60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2d70: 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61 72  xprSetHeight(Par
2d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2d90: 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74 48   *p){.  exprSetH
2da0: 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c 69  eight(p);.  sqli
2db0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
2dc0: 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e 48  ht(pParse, p->nH
2dd0: 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eight);.}../*.**
2de0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   Return the maxi
2df0: 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e  mum height of an
2e00: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  y expression tre
2e10: 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20  e referenced.** 
2e20: 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73 74  by the select st
2e30: 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
2e40: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  s an argument..*
2e50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2e60: 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53 65  ectExprHeight(Se
2e70: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
2e80: 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 68  nHeight = 0;.  h
2e90: 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70 2c  eightOfSelect(p,
2ea0: 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72 65   &nHeight);.  re
2eb0: 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d 0a  turn nHeight;.}.
2ec0: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2ed0: 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79 29  exprSetHeight(y)
2ee0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ef0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
2f00: 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >0 */../*.** Thi
2f10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
2f20: 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72 20   core allocator 
2f30: 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e 0a  for Expr nodes..
2f40: 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  **.** Construct 
2f50: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2f60: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
2f70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
2f80: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
2f90: 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20 66   this node and f
2fa0: 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61 72  or the pToken ar
2fb0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e 67  gument is a sing
2fc0: 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  le allocation.**
2fd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
2fe0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
2ff0: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
3000: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
3010: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
3020: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
3030: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
3040: 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ts freed..**.** 
3050: 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74 72  If dequote is tr
3060: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  ue, then the tok
3070: 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74 73  en (if it exists
3080: 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a 2a  ) is dequoted..*
3090: 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20  * If dequote is 
30a0: 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f 74  false, no dequot
30b0: 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61 6e  ing is performan
30c0: 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74 65  ce.  The deQuote
30d0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
30e0: 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f 6b   ignored if pTok
30f0: 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  en is NULL or if
3100: 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73 20   the token does 
3110: 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74 6f  not.** appear to
3120: 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66 20   be quoted.  If 
3130: 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65 20  the quotes were 
3140: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e 2e  of the form "...
3150: 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  " (double-quotes
3160: 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45 50  ).** then the EP
3170: 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67 20  _DblQuoted flag 
3180: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65 78  is set on the ex
3190: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a 2a  pression node..*
31a0: 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61 73  *.** Special cas
31b0: 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49 4e  e:  If op==TK_IN
31c0: 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65 6e  TEGER and pToken
31d0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
31e0: 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20  ing that.** can 
31f0: 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e  be translated in
3200: 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  to a 32-bit inte
3210: 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  ger, then the to
3220: 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73 74  ken is not.** st
3230: 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65 6e  ored in u.zToken
3240: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
3250: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 69  integer values i
3260: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
3270: 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20 74  o u.iValue and t
3280: 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 66  he EP_IntValue f
3290: 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f 20  lag is set.  No 
32a0: 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a 2a  extra storage.**
32b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f   is allocated to
32c0: 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67 65   hold the intege
32d0: 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20 64  r text and the d
32e0: 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20 69  equote flag is i
32f0: 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72 20  gnored..*/.Expr 
3300: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f  *sqlite3ExprAllo
3310: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
3320: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
3330: 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69 74  Handle for sqlit
3340: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 29  e3DbMallocZero()
3350: 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20 2a   (may be null) *
3360: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
3380: 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64 65  xpression opcode
3390: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65   */.  const Toke
33a0: 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f 2a  n *pToken,    /*
33b0: 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 2e   Token argument.
33c0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
33d0: 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74 65  */.  int dequote
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f0: 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65 20  True to dequote 
3400: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  */.){.  Expr *pN
3410: 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ew;.  int nExtra
3420: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61 6c   = 0;.  int iVal
3430: 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ue = 0;..  if( p
3440: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  Token ){.    if(
3450: 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52 20   op!=TK_INTEGER 
3460: 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30 0a  || pToken->z==0.
3470: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
3480: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54 6f  ite3GetInt32(pTo
3490: 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65 29  ken->z, &iValue)
34a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45 78  ==0 ){.      nEx
34b0: 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 2b  tra = pToken->n+
34c0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
34d0: 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20 20   iValue>=0 );.  
34e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20 3d    }.  }.  pNew =
34f0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
3500: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
3510: 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a 20  Expr)+nExtra);. 
3520: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
3530: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38 29   pNew->op = (u8)
3540: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41  op;.    pNew->iA
3550: 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28  gg = -1;.    if(
3560: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 20   pToken ){.     
3570: 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20 29   if( nExtra==0 )
3580: 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
3590: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
35a0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
35b0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
35c0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  Value;.      }el
35d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
35e0: 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  c;.        pNew-
35f0: 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61  >u.zToken = (cha
3600: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
3610: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
3620: 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54 6f  ken->z!=0 || pTo
3630: 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  ken->n==0 );.   
3640: 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d       if( pToken-
3650: 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >n ) memcpy(pNew
3660: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f 6b  ->u.zToken, pTok
3670: 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 6e  en->z, pToken->n
3680: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
3690: 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65 6e  >u.zToken[pToken
36a0: 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ->n] = 0;.      
36b0: 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26 26    if( dequote &&
36c0: 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20 20   nExtra>=3 .    
36d0: 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63 20           && ((c 
36e0: 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29 3d  = pToken->z[0])=
36f0: 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
3700: 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d  || c=='[' || c==
3710: 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '`') ){.        
3720: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
3730: 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  (pNew->u.zToken)
3740: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3750: 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e 66  c=='"' ) pNew->f
3760: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51 75  lags |= EP_DblQu
3770: 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  oted;.        }.
3780: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
3790: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
37a0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70 4e  R_DEPTH>0.    pN
37b0: 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b  ew->nHeight = 1;
37c0: 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20 20  .#endif  .  }.  
37d0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
37e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
37f0: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3800: 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72 6f  node from a zero
3810: 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b 65  -terminated toke
3820: 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61 6c  n that has.** al
3830: 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75 6f  ready been dequo
3840: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
3850: 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71 6c  lite3Expr(.  sql
3860: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
3870: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
3880: 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  or sqlite3DbMall
3890: 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62 65  ocZero() (may be
38a0: 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20   null) */.  int 
38b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
38c0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
38d0: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  n opcode */.  co
38e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65 6e  nst char *zToken
38f0: 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20 61        /* Token a
3900: 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74 20  rgument.  Might 
3910: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
3920: 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20 3d  Token x;.  x.z =
3930: 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20 3d   zToken;.  x.n =
3940: 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74 65   zToken ? sqlite
3950: 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65 6e  3Strlen30(zToken
3960: 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
3970: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
3980: 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29 3b  (db, op, &x, 0);
3990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
39a0: 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74 20   subtrees pLeft 
39b0: 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74 68  and pRight to th
39c0: 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f 6f  e Expr node pRoo
39d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f 6f  t..**.** If pRoo
39e0: 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  t==NULL that mea
39f0: 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72 79  ns that a memory
3a00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3a10: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a  r has occurred..
3a20: 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  ** In that case,
3a30: 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62 74   delete the subt
3a40: 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20 70  rees pLeft and p
3a50: 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Right..*/.void s
3a60: 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63 68  qlite3ExprAttach
3a70: 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c 69  Subtrees(.  sqli
3a80: 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72 20  te3 *db,.  Expr 
3a90: 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20 2a  *pRoot,.  Expr *
3aa0: 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a 70  pLeft,.  Expr *p
3ab0: 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20 70  Right.){.  if( p
3ac0: 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  Root==0 ){.    a
3ad0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
3ae0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 73  cFailed );.    s
3af0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3b00: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
3b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
3b20: 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b 0a  te(db, pRight);.
3b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3b40: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20   pRight ){.     
3b50: 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20 3d   pRoot->pRight =
3b60: 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 70   pRight;.      p
3b70: 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Root->flags |= E
3b80: 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69 67  P_Collate & pRig
3b90: 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 7d  ht->flags;.    }
3ba0: 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20 29  .    if( pLeft )
3bb0: 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 70  {.      pRoot->p
3bc0: 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20  Left = pLeft;.  
3bd0: 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67 73      pRoot->flags
3be0: 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20 26   |= EP_Collate &
3bf0: 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a 20   pLeft->flags;. 
3c00: 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65 74     }.    exprSet
3c10: 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a 20  Height(pRoot);. 
3c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
3c30: 63 61 74 65 20 61 6e 20 45 78 70 72 20 6e 6f 64  cate an Expr nod
3c40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3c50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3c60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3c70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3c80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3c90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3cb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3cc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3cd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3ce0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3cf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3d00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3d10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3d20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3d30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3d50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3d60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3d70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3d80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3d90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3da0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3db0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3dc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3dd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3de0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3df0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3e00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3e10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3e20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3e30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3e40: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3e50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3e60: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3e70: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3e80: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3e90: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3ea0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3eb0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ec0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ef0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3f00: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3f10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3f20: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3f30: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3f40: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3f50: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3f70: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3f80: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3f90: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3fa0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
3fb0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
3fc0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
3fd0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
3fe0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
3ff0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
4000: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4010: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
4020: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
4030: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
4040: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
4050: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
4060: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
4070: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
4080: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
4090: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
40a0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
40b0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
40c0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
40d0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
40e0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
40f0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
4100: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
4110: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
4120: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
4130: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
4140: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4150: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4160: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4170: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4180: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4190: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
41a0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
41b0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
41c0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
41d0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
41e0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
41f0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
4200: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4220: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
4230: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4240: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4250: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4260: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
4270: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
4280: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
4290: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
42a0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
42b0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
42c0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
42d0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
42e0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
42f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4300: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
4310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4320: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
4330: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
4340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
4350: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
4360: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
4370: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
4380: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
4390: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
43a0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
43b0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
43c0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
43d0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
43e0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
43f0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
4400: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
4410: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
4420: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
4430: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
4440: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
4450: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
4460: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
4470: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
4480: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
4490: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
44a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
44b0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
44c0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
44d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
44e0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
44f0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
4500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
4510: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
4520: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
4530: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
4540: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
4550: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4560: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4570: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
4580: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4590: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
45a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
45b0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
45c0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
45d0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
45f0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
4600: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4610: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
4620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
4630: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
4640: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
4650: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4660: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
4670: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
4680: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
4690: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
46a0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
46b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
46c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
46d0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
46e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
46f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
4700: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
4710: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
4720: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4730: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4740: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
4750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4760: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
4770: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
4780: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
47a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
47b0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
47c0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
47d0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
47e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
47f0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
4800: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
4810: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4820: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
4830: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
4850: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e  eight(pParse, pN
4860: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
4870: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
4880: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
4890: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
48a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
48b0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
48c0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
48d0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
48e0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
48f0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
4900: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
4910: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
4920: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
4930: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
4940: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
4950: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
4960: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
4970: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
4980: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
4990: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
49a0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
49b0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
49c0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
49d0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
49e0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
49f0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
4a00: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
4a10: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4a20: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
4a30: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
4a40: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
4a50: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
4a60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
4a70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
4a80: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
4a90: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
4aa0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
4ab0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
4ac0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
4ad0: 6e 74 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  ntial variable n
4ae0: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
4af0: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
4b00: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
4b10: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
4b20: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
4b30: 78 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  xpr){.  sqlite3 
4b40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4b50: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4b60: 7a 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  z;..  if( pExpr=
4b70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
4b80: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4b90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4ba0: 50 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65  P_IntValue|EP_Re
4bb0: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
4bc0: 6c 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78  ly) );.  z = pEx
4bd0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
4be0: 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
4bf0: 20 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d    assert( z[0]!=
4c00: 30 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d  0 );.  if( z[1]=
4c10: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =0 ){.    /* Wil
4c20: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
4c30: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
4c40: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
4c50: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61   number */.    a
4c60: 73 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27  ssert( z[0]=='?'
4c70: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   );.    pExpr->i
4c80: 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29  Column = (ynVar)
4c90: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29  (++pParse->nVar)
4ca0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79  ;.  }else{.    y
4cb0: 6e 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20  nVar x = 0;.    
4cc0: 75 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  u32 n = sqlite3S
4cd0: 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
4ce0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b  if( z[0]=='?' ){
4cf0: 0a 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61  .      /* Wildca
4d00: 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rd of the form "
4d10: 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20  ?nnn".  Convert 
4d20: 22 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65  "nnn" to an inte
4d30: 67 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ger and.      **
4d40: 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76   use it as the v
4d50: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
4d60: 2f 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20  /.      i64 i;. 
4d70: 20 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30       int bOk = 0
4d80: 3d 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ==sqlite3Atoi64(
4d90: 26 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20  &z[1], &i, n-1, 
4da0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4db0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4dc0: 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29  mn = x = (ynVar)
4dd0: 69 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  i;.      testcas
4de0: 65 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( i==0 );.     
4df0: 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20   testcase( i==1 
4e00: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4e10: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4e20: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4e30: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31  RIABLE_NUMBER]-1
4e40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4e50: 73 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69  se( i==db->aLimi
4e60: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
4e70: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20  ARIABLE_NUMBER] 
4e80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b  );.      if( bOk
4e90: 3d 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e  ==0 || i<1 || i>
4ea0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
4eb0: 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
4ec0: 5f 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20  _NUMBER] ){.    
4ed0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4ee0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72  Msg(pParse, "var
4ef0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
4f00: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
4f10: 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20  and ?%d",.      
4f20: 20 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74        db->aLimit
4f30: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4f40: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b  RIABLE_NUMBER]);
4f50: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a  .        x = 0;.
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4f70: 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72  ( i>pParse->nVar
4f80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
4f90: 73 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29  se->nVar = (int)
4fa0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
4fb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
4fc0: 69 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a  ildcards like ":
4fd0: 61 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20  aaa", "$aaa" or 
4fe0: 22 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "@aaa".  Reuse t
4ff0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
5000: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
5010: 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70   as the prior ap
5020: 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20  pearance of the 
5030: 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66  same name, or if
5040: 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20   the name.      
5050: 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70  ** has never app
5060: 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65  eared before, re
5070: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
5080: 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20  iable number.   
5090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61     */.      ynVa
50a0: 72 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  r i;.      for(i
50b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a  =0; i<pParse->nz
50c0: 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Var; i++){.     
50d0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61     if( pParse->a
50e0: 7a 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d  zVar[i] && strcm
50f0: 70 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  p(pParse->azVar[
5100: 69 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i],z)==0 ){.    
5110: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
5120: 6c 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61  lumn = x = (ynVa
5130: 72 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  r)i+1;.         
5140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5150: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5160: 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70  if( x==0 ) x = p
5170: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
5180: 28 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65  (ynVar)(++pParse
5190: 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20  ->nVar);.    }. 
51a0: 20 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20     if( x>0 ){.  
51b0: 20 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65      if( x>pParse
51c0: 2d 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20  ->nzVar ){.     
51d0: 20 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20     char **a;.   
51e0: 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33       a = sqlite3
51f0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50  DbRealloc(db, pP
5200: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73  arse->azVar, x*s
5210: 69 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20  izeof(a[0]));.  
5220: 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29        if( a==0 )
5230: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72   return;  /* Err
5240: 6f 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f  or reported thro
5250: 75 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ugh db->mallocFa
5260: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
5270: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20  pParse->azVar = 
5280: 61 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  a;.        memse
5290: 74 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56  t(&a[pParse->nzV
52a0: 61 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73  ar], 0, (x-pPars
52b0: 65 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66  e->nzVar)*sizeof
52c0: 28 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20  (a[0]));.       
52d0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d   pParse->nzVar =
52e0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
52f0: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20    if( z[0]!='?' 
5300: 7c 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  || pParse->azVar
5310: 5b 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [x-1]==0 ){.    
5320: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5330: 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a  e(db, pParse->az
5340: 56 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20  Var[x-1]);.     
5350: 20 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72     pParse->azVar
5360: 5b 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44  [x-1] = sqlite3D
5370: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20  bStrNDup(db, z, 
5380: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
5390: 7d 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50  }.  } .  if( !pP
53a0: 61 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50  arse->nErr && pP
53b0: 61 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61  arse->nVar>db->a
53c0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
53d0: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
53e0: 45 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ER] ){.    sqlit
53f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5400: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c  e, "too many SQL
5410: 20 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20   variables");.  
5420: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  }.}../*.** Recur
5430: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
5440: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5450: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5460: 33 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69  3ExprDelete(sqli
5470: 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
5480: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
5490: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e  return;.  /* San
54a0: 69 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72  ity check: Asser
54b0: 74 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61  t that the IntVa
54c0: 6c 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  lue is non-negat
54d0: 69 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73  ive if it exists
54e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
54f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5500: 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c  , EP_IntValue) |
5510: 7c 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30  | p->u.iValue>=0
5520: 20 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48   );.  if( !ExprH
5530: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5540: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
5550: 20 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78     /* The Expr.x
5560: 20 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20   union is never 
5570: 75 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65  used at the same
5580: 20 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52   time as Expr.pR
5590: 69 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65  ight */.    asse
55a0: 72 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d  rt( p->x.pList==
55b0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d  0 || p->pRight==
55c0: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
55d0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
55e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71  ->pLeft);.    sq
55f0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5600: 64 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  db, p->pRight);.
5610: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
5620: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
5630: 6d 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65  mToken) ) sqlite
5640: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75  3DbFree(db, p->u
5650: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66  .zToken);.    if
5660: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
5670: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
5680: 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  t) ){.      sqli
5690: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
56a0: 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74  db, p->x.pSelect
56b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
56d0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
56e0: 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
56f0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72  .  }.  if( !Expr
5700: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
5710: 50 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20  P_Static) ){.   
5720: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5730: 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
5740: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5750: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
5760: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
5770: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75   expression stru
5780: 63 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64  cture .** passed
5790: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
57a0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  gument. This is 
57b0: 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58  always one of EX
57c0: 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20  PR_FULLSIZE,.** 
57d0: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
57e0: 20 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e   or EXPR_TOKENON
57f0: 4c 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69  LYSIZE..*/.stati
5800: 63 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74  c int exprStruct
5810: 53 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20  Size(Expr *p){. 
5820: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
5830: 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e  erty(p, EP_Token
5840: 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45  Only) ) return E
5850: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
5860: 45 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  E;.  if( ExprHas
5870: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
5880: 65 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e  educed) ) return
5890: 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a   EXPR_REDUCEDSIZ
58a0: 45 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52  E;.  return EXPR
58b0: 5f 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  _FULLSIZE;.}../*
58c0: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
58d0: 72 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65  r*Size() routine
58e0: 73 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68  s each return th
58f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5900: 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
5910: 20 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66   store a copy of
5920: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
5930: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  r expression tre
5940: 65 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20  e.  They differ 
5950: 69 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f  in.** how much o
5960: 66 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65  f the tree is me
5970: 61 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  asured..**.**   
5980: 20 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63    dupedExprStruc
5990: 74 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65  tSize()     Size
59a0: 20 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70   of only the Exp
59b0: 72 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  r structure .** 
59c0: 20 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64      dupedExprNod
59d0: 65 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69  eSize()       Si
59e0: 7a 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61  ze of Expr + spa
59f0: 63 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20  ce for token.** 
5a00: 20 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a      dupedExprSiz
5a10: 65 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78  e()           Ex
5a20: 70 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62  pr + token + sub
5a30: 74 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a  tree components.
5a40: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
5a90: 2a 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78  *.** The dupedEx
5aa0: 70 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66  prStructSize() f
5ab0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5ac0: 74 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64  two values OR-ed
5ad0: 20 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20   together:  .** 
5ae0: 28 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65  (1) the space re
5af0: 71 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70  quired for a cop
5b00: 79 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74  y of the Expr st
5b10: 72 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64  ructure only and
5b20: 20 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f   .** (2) the EP_
5b30: 78 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69  xxx flags that i
5b40: 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65  ndicate what the
5b50: 20 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20   structure size 
5b60: 73 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68  should be..** Th
5b70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  e return values 
5b80: 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66  is always one of
5b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50  :.**.**      EXP
5ba0: 52 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20  R_FULLSIZE.**   
5bb0: 20 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53     EXPR_REDUCEDS
5bc0: 49 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63  IZE   | EP_Reduc
5bd0: 65 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f  ed.**      EXPR_
5be0: 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20  TOKENONLYSIZE | 
5bf0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a  EP_TokenOnly.**.
5c00: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5c10: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  he structure can
5c20: 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73   be found by mas
5c30: 6b 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  king the return 
5c40: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73  value.** of this
5c50: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78   routine with 0x
5c60: 66 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20  fff.  The flags 
5c70: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20  can be found by 
5c80: 6d 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72  masking the.** r
5c90: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68  eturn value with
5ca0: 20 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54   EP_Reduced|EP_T
5cb0: 6f 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  okenOnly..**.** 
5cc0: 4e 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66  Note that with f
5cd0: 6c 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45  lags==EXPRDUP_RE
5ce0: 44 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69  DUCE, this routi
5cf0: 6e 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c  nes works on ful
5d00: 6c 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64  l-size.** (unred
5d10: 75 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63  uced) Expr objec
5d20: 74 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72  ts as they or or
5d30: 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75  iginally constru
5d40: 63 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73  cted by the pars
5d50: 65 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78  er..** During ex
5d60: 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
5d70: 73 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  s, extra informa
5d80: 74 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64  tion is computed
5d90: 20 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a   and moved into.
5da0: 2a 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f  ** later parts o
5db0: 66 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63  f teh Expr objec
5dc0: 74 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61  t and that extra
5dd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67   information mig
5de0: 68 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a  ht get chopped.*
5df0: 2a 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70  * off if the exp
5e00: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63  ression is reduc
5e10: 65 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74  ed.  Note also t
5e20: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
5e30: 77 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  work to.** make 
5e40: 61 6e 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  an EXPRDUP_REDUC
5e50: 45 20 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75  E copy of a redu
5e60: 63 65 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  ced expression. 
5e70: 20 49 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61   It is only lega
5e80: 6c 0a 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61  l.** to reduce a
5e90: 20 70 72 69 73 74 69 6e 65 20 65 78 70 72 65 73   pristine expres
5ea0: 73 69 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74  sion tree from t
5eb0: 68 65 20 70 61 72 73 65 72 2e 20 20 54 68 65 20  he parser.  The 
5ec0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
5ed0: 2a 20 6f 66 20 64 75 70 65 64 45 78 70 72 53 74  * of dupedExprSt
5ee0: 72 75 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61  ructSize() conta
5ef0: 69 6e 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65  in multiple asse
5f00: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
5f10: 74 68 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20  that attempt.** 
5f20: 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
5f30: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
5f40: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
5f50: 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 45 78  xprStructSize(Ex
5f60: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
5f70: 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a  ){.  int nSize;.
5f80: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
5f90: 3d 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20  =EXPRDUP_REDUCE 
5fa0: 7c 7c 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f  || flags==0 ); /
5fb0: 2a 20 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20  * Only one flag 
5fc0: 76 61 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  value allowed */
5fd0: 0a 20 20 61 73 73 65 72 74 28 20 45 58 50 52 5f  .  assert( EXPR_
5fe0: 46 55 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20  FULLSIZE<=0xfff 
5ff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 30 78  );.  assert( (0x
6000: 66 66 66 20 26 20 28 45 50 5f 52 65 64 75 63 65  fff & (EP_Reduce
6010: 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29  d|EP_TokenOnly))
6020: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d  ==0 );.  if( 0==
6030: 28 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52  (flags&EXPRDUP_R
6040: 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53  EDUCE) ){.    nS
6050: 69 7a 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53  ize = EXPR_FULLS
6060: 49 5a 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IZE;.  }else{.  
6070: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
6080: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6090: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
60a0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73  duced) );.    as
60b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
60c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
60d0: 6d 4a 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61  mJoin) ); .    a
60e0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
60f0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65  roperty(p, EP_Me
6100: 6d 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61  mToken) );.    a
6110: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
6120: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f  roperty(p, EP_No
6130: 52 65 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69  Reduce) );.    i
6140: 66 28 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70  f( p->pLeft || p
6150: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
6160: 20 20 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f     nSize = EXPR_
6170: 52 45 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50  REDUCEDSIZE | EP
6180: 5f 52 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65  _Reduced;.    }e
6190: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
61a0: 74 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20  t( p->pRight==0 
61b0: 29 3b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  );.      nSize =
61c0: 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53   EXPR_TOKENONLYS
61d0: 49 5a 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  IZE | EP_TokenOn
61e0: 6c 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ly;.    }.  }.  
61f0: 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a  return nSize;.}.
6200: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6210: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
6220: 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
6230: 72 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72  required to stor
6240: 65 20 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f  e the copy .** o
6250: 66 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63  f the Expr struc
6260: 74 75 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20  ture and a copy 
6270: 6f 66 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54  of the Expr.u.zT
6280: 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20  oken string (if 
6290: 74 68 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69  that.** string i
62a0: 73 20 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73  s defined.).*/.s
62b0: 74 61 74 69 63 20 69 6e 74 20 64 75 70 65 64 45  tatic int dupedE
62c0: 78 70 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72  xprNodeSize(Expr
62d0: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
62e0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64  .  int nByte = d
62f0: 75 70 65 64 45 78 70 72 53 74 72 75 63 74 53 69  upedExprStructSi
6300: 7a 65 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30  ze(p, flags) & 0
6310: 78 66 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70  xfff;.  if( !Exp
6320: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
6330: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
6340: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20  p->u.zToken ){. 
6350: 20 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69     nByte += sqli
6360: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
6370: 2e 7a 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a  .zToken)+1;.  }.
6380: 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
6390: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
63a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
63b0: 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
63c0: 69 72 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  ired to create a
63d0: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
63e0: 65 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  e .** expression
63f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6400: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54  irst argument. T
6410: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6420: 6e 74 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20  nt is a.** mask 
6430: 63 6f 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44  containing EXPRD
6440: 55 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a  UP_XXX flags..**
6450: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
6460: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
6470: 73 70 61 63 65 20 74 6f 20 63 72 65 61 74 65 20  space to create 
6480: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78  a copy of the Ex
6490: 70 72 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73  pr struct.** its
64a0: 65 6c 66 20 61 6e 64 20 74 68 65 20 62 75 66 66  elf and the buff
64b0: 65 72 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  er referred to b
64c0: 79 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c  y Expr.u.zToken,
64d0: 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49   if any..**.** I
64e0: 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52 45  f the EXPRDUP_RE
64f0: 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65 74  DUCE flag is set
6500: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
6510: 6e 20 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73  n value includes
6520: 20 0a 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75   .** space to du
6530: 70 6c 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72  plicate all Expr
6540: 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72   nodes in the tr
6550: 65 65 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70  ee formed by Exp
6560: 72 2e 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20  r.pLeft .** and 
6570: 45 78 70 72 2e 70 52 69 67 68 74 20 76 61 72 69  Expr.pRight vari
6580: 61 62 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66  ables (but not f
6590: 6f 72 20 61 6e 79 20 73 74 72 75 63 74 75 72 65  or any structure
65a0: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20  s pointed to or 
65b0: 0a 2a 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72  .** descended fr
65c0: 6f 6d 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c  om the Expr.x.pL
65d0: 69 73 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53  ist or Expr.x.pS
65e0: 65 6c 65 63 74 20 76 61 72 69 61 62 6c 65 73 29  elect variables)
65f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6600: 64 75 70 65 64 45 78 70 72 53 69 7a 65 28 45 78  dupedExprSize(Ex
6610: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
6620: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
6630: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
6640: 20 20 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64     nByte = duped
6650: 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20  ExprNodeSize(p, 
6660: 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  flags);.    if( 
6670: 66 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45  flags&EXPRDUP_RE
6680: 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42  DUCE ){.      nB
6690: 79 74 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72  yte += dupedExpr
66a0: 53 69 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66  Size(p->pLeft, f
66b0: 6c 61 67 73 29 20 2b 20 64 75 70 65 64 45 78 70  lags) + dupedExp
66c0: 72 53 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c  rSize(p->pRight,
66d0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20   flags);.    }. 
66e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74   }.  return nByt
66f0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
6700: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
6710: 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45  ilar to sqlite3E
6720: 78 70 72 44 75 70 28 29 2c 20 65 78 63 65 70 74  xprDup(), except
6730: 20 74 68 61 74 20 69 66 20 70 7a 42 75 66 66 65   that if pzBuffe
6740: 72 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c  r .** is not NUL
6750: 4c 20 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72  L then *pzBuffer
6760: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
6770: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
6780: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a   large enough .*
6790: 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  * to store the c
67a0: 6f 70 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f  opy of expressio
67b0: 6e 20 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20  n p, the copies 
67c0: 6f 66 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a  of p->u.zToken.*
67d0: 2a 20 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65  * (if applicable
67e0: 29 2c 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65  ), and the copie
67f0: 73 20 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66  s of the p->pLef
6800: 74 20 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20  t and p->pRight 
6810: 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20  expressions,.** 
6820: 69 66 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72  if any. Before r
6830: 65 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66  eturning, *pzBuf
6840: 66 65 72 20 69 73 20 73 65 74 20 74 6f 20 74 68  fer is set to th
6850: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
6860: 74 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  t the.** portion
6870: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6880: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6890: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
68a0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
68b0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
68c0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
68d0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
68e0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
68f0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6920: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6930: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6940: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6960: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6970: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6980: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6990: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
69a0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
69b0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
69c0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
69d0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
69e0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
69f0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6a00: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6a10: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6a20: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6a30: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6a40: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6a50: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6a60: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6a70: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6a80: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6a90: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6aa0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6ab0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6ac0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6ad0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6ae0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6af0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6b00: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6b10: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6b20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6b30: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6b40: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6b50: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6b60: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6b70: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6b80: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6b90: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6ba0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6bb0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6bc0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6bd0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6be0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6bf0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6c00: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6c10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6c20: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6c30: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6c40: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6c50: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6c60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6c70: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6c80: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6c90: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ca0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6cb0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6cc0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6cd0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6cf0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6d00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6d10: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6d20: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6d30: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6d40: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6d50: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d70: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6d90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6da0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6db0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6dc0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6dd0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6de0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6df0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6e00: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6e10: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6e20: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6e30: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6e40: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6e50: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6e60: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6e70: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
6e80: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
6e90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6ea0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6eb0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6ec0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6ed0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6ee0: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6ef0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
6f00: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
6f10: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
6f20: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
6f30: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6f40: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
6f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6f60: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6f70: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6f80: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6f90: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6fa0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6fb0: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6fc0: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6fd0: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6ff0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
7000: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
7010: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
7020: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
7030: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7040: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7050: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
7060: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
7070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
7080: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
7090: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
70a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
70b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
70c0: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
70d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
70e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
70f0: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
7100: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
7120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
7130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
7140: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
7150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7160: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7170: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7180: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
7190: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
71a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20   flags);.       
71b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
71c0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
71d0: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
71e0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
71f0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
7200: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
7210: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
7220: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7230: 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44  ->pRight = exprD
7240: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7250: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
7260: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
7270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7280: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
7290: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
72a0: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
72b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
72c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
72d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
72e0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
72f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7300: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
7310: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7320: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
7330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
7340: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
7350: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
7360: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
7370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
7380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7390: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
73a0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
73b0: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
73c0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
73d0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
73e0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
73f0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
7400: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
7410: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7420: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
7430: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7440: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
7450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7460: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
7470: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
7480: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
7490: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
74a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
74b0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
74c0: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
74d0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
74e0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
74f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7500: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
7510: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
7520: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
7530: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
7540: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
7550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7560: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
7570: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
7580: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7590: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
75a0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
75b0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
75c0: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
75d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
75e0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
75f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
7600: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
7610: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7620: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
7630: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
7640: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7650: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
7660: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
7670: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
7680: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7690: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
76a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
76b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
76c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
76d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
76e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
7700: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
7710: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
7720: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
7730: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
7740: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
7750: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
7760: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
7770: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
7780: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
7790: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
77a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
77b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
77c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
77d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
77e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
77f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
7800: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
7810: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
7820: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
7830: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
7840: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
7850: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
7860: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
7870: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
7880: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
7890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
78a0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
78b0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
78c0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
78d0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
78e0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
78f0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
7900: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
7910: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
7920: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
7930: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
7940: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
7950: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
7960: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
7970: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
7980: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
7990: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
79a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
79b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
79c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
79d0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
79e0: 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  ags){.  return e
79f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
7a00: 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c  ags, 0);.}.ExprL
7a10: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
7a20: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7a30: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
7a40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7a50: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
7a60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7a70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
7a80: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
7a90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ac0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7ad0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7ae0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7af0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
7b00: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
7b10: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
7b20: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
7b30: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
7b40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
7b50: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
7b60: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
7b70: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
7b80: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
7b90: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
7bc0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
7bd0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
7be0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
7bf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
7c00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
7c10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
7c20: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
7c30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
7c40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
7c50: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7c60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
7c70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
7c80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7c90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7ca0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7cb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
7cc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
7cd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ce0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
7cf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7d00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
7d10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
7d20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
7d30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
7d40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
7d50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
7d60: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
7d70: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
7d80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7d90: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
7da0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7db0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7dc0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7dd0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7de0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7df0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7e00: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7e10: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7e20: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7e30: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7e40: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
7e50: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
7e60: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
7e70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
7e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7e90: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7eb0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7ec0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7ed0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7ee0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7ef0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7f00: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7f10: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7f20: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7f40: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
7f50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f60: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
7f70: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
7f80: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
7f90: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
7fa0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7fb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7fc0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7fd0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7ff0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
8000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8020: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
8030: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8040: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8050: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8070: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
8080: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
8090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
80a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
80b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
80c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
80d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
80e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
80f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8100: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
8110: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
8120: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8130: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8140: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
8150: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
8180: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
8190: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
81a0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
81b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
81c0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
81d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
81f0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
8200: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
8220: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
8230: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
8240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43     pNewItem->isC
8250: 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64  orrelated = pOld
8260: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
8270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
8280: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
8290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f   pOldItem->viaCo
82a0: 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65  routine;.    pNe
82b0: 77 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  wItem->isRecursi
82c0: 76 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ve = pOldItem->i
82d0: 73 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  sRecursive;.    
82e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pNewItem->zIndex
82f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8300: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8310: 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e  >zIndex);.    pN
8320: 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ewItem->notIndex
8330: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e  ed = pOldItem->n
8340: 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70  otIndexed;.    p
8350: 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  NewItem->pIndex 
8360: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64  = pOldItem->pInd
8370: 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  ex;.    pTab = p
8380: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
8390: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
83a0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
83b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
83c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
83d0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
83e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
83f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8400: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8410: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8420: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8430: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8440: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
8450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
8460: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
8470: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8480: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
8490: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
84a0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
84b0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
84c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
84d0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
84e0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
84f0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8500: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8520: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8530: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8540: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8550: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8560: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8580: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
8590: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
85a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
85b0: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
85c0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
85d0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
85f0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
8600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8610: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
8620: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
8630: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
8640: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
8650: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
8660: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
8670: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
8680: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
8690: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
86a0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
86b0: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
86c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
86d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
86e0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
86f0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8700: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8710: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8720: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8730: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8740: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
8750: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
8760: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8770: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
8780: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
8790: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
87a0: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
87b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
87c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
87d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
87e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
87f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
8800: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
8810: 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  or;.  if( p==0 )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8830: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8840: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8850: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8860: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8870: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8880: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8890: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
88a0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
88b0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
88c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
88d0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
88e0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
88f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8910: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8920: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8940: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
8950: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8960: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
8970: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8980: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
8990: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
89a0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
89b0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
89c0: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
89d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
89e0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
89f0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
8a00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8a10: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
8a20: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
8a30: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
8a40: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
8a50: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
8a60: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
8a70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a80: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
8a90: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8aa0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
8ab0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ac0: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
8ad0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
8ae0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
8af0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
8b00: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
8b10: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
8b20: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
8b30: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8b40: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
8b50: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8b60: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
8b70: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
8b80: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
8b90: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
8ba0: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
8bb0: 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  h);.  sqlite3Sel
8bc0: 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c  ectSetName(pNew,
8bd0: 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20   p->zSelName);. 
8be0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
8bf0: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
8c00: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 73  lite3SelectDup(s
8c10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65  qlite3 *db, Sele
8c20: 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  ct *p, int flags
8c30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
8c40: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  0 );.  return 0;
8c50: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
8c60: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
8c70: 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ent to the end o
8c80: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
8c90: 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20  list.  If pList 
8ca0: 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20  is.** initially 
8cb0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74  NULL, then creat
8cc0: 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  e a new expressi
8cd0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
8ce0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
8cf0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
8d00: 72 73 2c 20 74 68 65 20 65 6e 74 69 72 65 20 6c  rs, the entire l
8d10: 69 73 74 20 69 73 20 66 72 65 65 64 20 61 6e 64  ist is freed and
8d20: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
8d30: 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e 2d 4e 55  rned.  If non-NU
8d40: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  LL is returned, 
8d50: 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
8d60: 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74 20 74 68  nteed.** that th
8d70: 65 20 6e 65 77 20 65 6e 74 72 79 20 77 61 73 20  e new entry was 
8d80: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 70 70  successfully app
8d90: 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 4c 69  ended..*/.ExprLi
8da0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
8db0: 69 73 74 41 70 70 65 6e 64 28 0a 20 20 50 61 72  istAppend(.  Par
8dc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8dd0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8de0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8df0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
8e00: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
8e10: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
8e20: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
8e30: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
8e50: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
8e60: 61 70 70 65 6e 64 65 64 2e 20 4d 69 67 68 74 20  appended. Might 
8e70: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
8e80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8e90: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8ea0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
8eb0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
8ec0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8ed0: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
8ee0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
8ef0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  t==0 ){.      go
8f00: 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d  to no_mem;.    }
8f10: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
8f20: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
8f30: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 4c  aw(db, sizeof(pL
8f40: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
8f50: 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30   if( pList->a==0
8f60: 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a   ) goto no_mem;.
8f70: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4c 69    }else if( (pLi
8f80: 73 74 2d 3e 6e 45 78 70 72 20 26 20 28 70 4c 69  st->nExpr & (pLi
8f90: 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29 3d 3d 30  st->nExpr-1))==0
8fa0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8fb0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
8fc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
8fd0: 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  st->nExpr>0 );. 
8fe0: 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44 62     a = sqlite3Db
8ff0: 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 4c 69 73  Realloc(db, pLis
9000: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 45 78  t->a, pList->nEx
9010: 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70 4c 69 73  pr*2*sizeof(pLis
9020: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
9030: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( a==0 ){.     
9040: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
9050: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
9060: 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = a;.  }.  asse
9070: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
9080: 29 3b 0a 20 20 69 66 28 20 31 20 29 7b 0a 20 20  );.  if( 1 ){.  
9090: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
90a0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
90b0: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
90c0: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
90d0: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
90e0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
90f0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
9100: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 7d 0a 20  r = pExpr;.  }. 
9110: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 0a   return pList;..
9120: 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a 20 20 2f  no_mem:     .  /
9130: 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20  * Avoid leaking 
9140: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
9150: 20 68 61 73 20 66 61 69 6c 65 64 2e 20 2a 2f 0a   has failed. */.
9160: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9170: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
9180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9190: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
91a0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  t);.  return 0;.
91b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
91c0: 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e   ExprList.a[].zN
91d0: 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ame element of t
91e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
91f0: 20 61 64 64 65 64 20 69 74 65 6d 0a 2a 2a 20 6f   added item.** o
9200: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9210: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69   list..**.** pLi
9220: 73 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  st might be NULL
9230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 4f 4f   following an OO
9240: 4d 20 65 72 72 6f 72 2e 20 20 42 75 74 20 70 4e  M error.  But pN
9250: 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  ame should never
9260: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20 20 49 66   be.** NULL.  If
9270: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9280: 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74 68 65 20  tion fails, the 
9290: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
92a0: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 0a 2a 2a  ocFailed flag.**
92b0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64   is set..*/.void
92c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
92d0: 53 65 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  SetName(.  Parse
92e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
92f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9300: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
9310: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
9320: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
9330: 69 63 68 20 74 6f 20 61 64 64 20 74 68 65 20 73  ich to add the s
9340: 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pan. */.  Token 
9350: 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *pName,         
9360: 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20 62 65 20    /* Name to be 
9370: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  added */.  int d
9380: 65 71 75 6f 74 65 20 20 20 20 20 20 20 20 20 20  equote          
9390: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 63 61     /* True to ca
93a0: 75 73 65 20 74 68 65 20 6e 61 6d 65 20 74 6f 20  use the name to 
93b0: 62 65 20 64 65 71 75 6f 74 65 64 20 2a 2f 0a 29  be dequoted */.)
93c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  {.  assert( pLis
93d0: 74 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t!=0 || pParse->
93e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
93f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  !=0 );.  if( pLi
9400: 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
9410: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9420: 70 49 74 65 6d 3b 0a 20 20 20 20 61 73 73 65 72  pItem;.    asser
9430: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  t( pList->nExpr>
9440: 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 3d  0 );.    pItem =
9450: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
9460: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
9470: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 7a  assert( pItem->z
9480: 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Name==0 );.    p
9490: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
94a0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
94b0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
94c0: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
94d0: 20 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20      if( dequote 
94e0: 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  && pItem->zName 
94f0: 29 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65  ) sqlite3Dequote
9500: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
9510: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
9520: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b   the ExprList.a[
9530: 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65 6e 74 20  ].zSpan element 
9540: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
9550: 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a  ntly added item.
9560: 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ** on the expres
9570: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9580: 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20   pList might be 
9590: 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  NULL following a
95a0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75  n OOM error.  Bu
95b0: 74 20 70 53 70 61 6e 20 73 68 6f 75 6c 64 20 6e  t pSpan should n
95c0: 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e  ever be.** NULL.
95d0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
95e0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
95f0: 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  the pParse->db->
9600: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
9610: 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a  g.** is set..*/.
9620: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
9630: 4c 69 73 74 53 65 74 53 70 61 6e 28 0a 20 20 50  ListSetSpan(.  P
9640: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9650: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9660: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9670: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9680: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
9690: 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74  o which to add t
96a0: 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 45 78  he span. */.  Ex
96b0: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 20 20 20  prSpan *pSpan   
96c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61        /* The spa
96d0: 6e 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  n to be added */
96e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
96f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9700: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
9710: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
9720: 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69  Failed!=0 );.  i
9730: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
9740: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9750: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
9760: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
9770: 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 61 73 73  Expr-1];.    ass
9780: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
9790: 72 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r>0 );.    asser
97a0: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
97b0: 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 45  led || pItem->pE
97c0: 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70 45 78 70  xpr==pSpan->pExp
97d0: 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
97e0: 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
97f0: 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 70 49  ->zSpan);.    pI
9800: 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c  tem->zSpan = sql
9810: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
9820: 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e  , (char*)pSpan->
9830: 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20 20  zStart,.        
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
9860: 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20  )(pSpan->zEnd - 
9870: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b  pSpan->zStart));
9880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
9890: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
98a0: 6c 69 73 74 20 70 45 4c 69 73 74 20 63 6f 6e 74  list pEList cont
98b0: 61 69 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 69  ains more than i
98c0: 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74 73 2c 0a  Limit elements,.
98d0: 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  ** leave an erro
98e0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
98f0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
9900: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
9910: 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61 72 73 65  kLength(.  Parse
9920: 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
9930: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 0a 20 20  List *pEList,.  
9940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 62 6a  const char *zObj
9950: 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20 6d 78 20  ect.){.  int mx 
9960: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c  = pParse->db->aL
9970: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9980: 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20 74 65 73  T_COLUMN];.  tes
9990: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
99a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
99b0: 6d 78 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  mx );.  testcase
99c0: 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
99d0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78 2b 31 20  st->nExpr==mx+1 
99e0: 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  );.  if( pEList 
99f0: 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
9a00: 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >mx ){.    sqlit
9a10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9a20: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
9a30: 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20 7a 4f 62  umns in %s", zOb
9a40: 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ject);.  }.}../*
9a50: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
9a60: 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20  tire expression 
9a70: 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  list..*/.void sq
9a80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9a90: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
9aa0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9ab0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
9ac0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9ad0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
9ae0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
9af0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
9b00: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 70 4c 69  ist->a!=0 || pLi
9b10: 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 3b 0a  st->nExpr==0 );.
9b20: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
9b30: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
9b40: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
9b50: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  db, pItem->pExpr
9b80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9b90: 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
9ba0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
9bb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
9bc0: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 7d  tem->zSpan);.  }
9bd0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
9be0: 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
9bf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9c00: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
9c10: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
9c20: 6e 65 73 20 61 72 65 20 57 61 6c 6b 65 72 20 63  nes are Walker c
9c30: 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61 6c 6b 65  allbacks.  Walke
9c40: 72 2e 75 2e 70 69 20 69 73 20 61 20 70 6f 69 6e  r.u.pi is a poin
9c50: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 69 6e 74  ter.** to an int
9c60: 65 67 65 72 2e 20 20 54 68 65 73 65 20 72 6f 75  eger.  These rou
9c70: 74 69 6e 65 73 20 61 72 65 20 63 68 65 63 6b 69  tines are checki
9c80: 6e 67 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ng an expression
9c90: 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 69 74   to see.** if it
9ca0: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2e 20   is a constant. 
9cb0: 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e 75 2e 70   Set *Walker.u.p
9cc0: 69 20 74 6f 20 30 20 69 66 20 74 68 65 20 65 78  i to 0 if the ex
9cd0: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 6e  pression is.** n
9ce0: 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2a 0a  ot constant..**.
9cf0: 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 62 61 63  ** These callbac
9d00: 6b 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  k routines are u
9d10: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
9d20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
9d30: 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65  **.**     sqlite
9d40: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
9d50: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
9d60: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
9d70: 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20 20 20 73  tJoin().**     s
9d80: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9d90: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 29  tantOrFunction()
9da0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
9db0: 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73  t exprNodeIsCons
9dc0: 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  tant(Walker *pWa
9dd0: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
9de0: 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20 70 57 61  r){..  /* If pWa
9df0: 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20 33 20 74  lker->u.i is 3 t
9e00: 68 65 6e 20 61 6e 79 20 74 65 72 6d 20 6f 66 20  hen any term of 
9e10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
9e20: 68 61 74 20 63 6f 6d 65 73 20 66 72 6f 6d 0a 20  hat comes from. 
9e30: 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   ** the ON or US
9e40: 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20 61  ING clauses of a
9e50: 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c 69 66 69   join disqualifi
9e60: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
9e70: 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62 65 69 6e  n.  ** from bein
9e80: 67 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 6e  g considered con
9e90: 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20  stant. */.  if( 
9ea0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 33 20  pWalker->u.i==3 
9eb0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
9ec0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
9ed0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 57  mJoin) ){.    pW
9ee0: 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b 0a  alker->u.i = 0;.
9ef0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
9f00: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  bort;.  }..  swi
9f10: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
9f20: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65  {.    /* Conside
9f30: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 62  r functions to b
9f40: 65 20 63 6f 6e 73 74 61 6e 74 20 69 66 20 61 6c  e constant if al
9f50: 6c 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e 74  l their argument
9f60: 73 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 0a 20  s are constant. 
9f70: 20 20 20 2a 2a 20 61 6e 64 20 65 69 74 68 65 72     ** and either
9f80: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32   pWalker->u.i==2
9f90: 20 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   or the function
9fa0: 20 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 46   as the SQLITE_F
9fb0: 55 4e 43 5f 43 4f 4e 53 54 0a 20 20 20 20 2a 2a  UNC_CONST.    **
9fc0: 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 63 61   flag. */.    ca
9fd0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
9fe0: 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 6b 65        if( pWalke
9ff0: 72 2d 3e 75 2e 69 3d 3d 32 20 7c 7c 20 45 78 70  r->u.i==2 || Exp
a000: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
a010: 70 72 2c 45 50 5f 43 6f 6e 73 74 61 6e 74 29 20  pr,EP_Constant) 
a020: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
a030: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
a040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
a050: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   Fall through */
a060: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
a070: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
a080: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
a090: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  _AGG_FUNCTION:. 
a0a0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
a0b0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 74 65 73  OLUMN:.      tes
a0c0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a0d0: 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20  ==TK_ID );.     
a0e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
a0f0: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
a100: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a110: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
a120: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
a130: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a140: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
a150: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
a160: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
a170: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
a180: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
a190: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
a1a0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a1b0: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
a1c0: 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65 49  ; /* selectNodeI
a1d0: 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20 64  sConstant will d
a1e0: 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  isallow */.     
a1f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
a200: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
a210: 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f 64 65  ); /* selectNode
a220: 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c 6c 20  IsConstant will 
a230: 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  disallow */.    
a240: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
a250: 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a 73 74 61  tinue;.  }.}.sta
a260: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 4e 6f  tic int selectNo
a270: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c  deIsConstant(Wal
a280: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
a290: 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 29 7b 0a  lect *NotUsed){.
a2a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a2b0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 70  ER(NotUsed);.  p
a2c0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20 30 3b  Walker->u.i = 0;
a2d0: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62  .  return WRC_Ab
a2e0: 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  ort;.}.static in
a2f0: 74 20 65 78 70 72 49 73 43 6f 6e 73 74 28 45 78  t exprIsConst(Ex
a300: 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e 69 74 46  pr *p, int initF
a310: 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  lag){.  Walker w
a320: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
a330: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
a340: 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46 6c 61 67  w.u.i = initFlag
a350: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
a360: 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64 65 49 73  ack = exprNodeIs
a370: 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77 2e 78 53  Constant;.  w.xS
a380: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
a390: 73 65 6c 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73  selectNodeIsCons
a3a0: 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 57  tant;.  sqlite3W
a3b0: 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 29 3b 0a  alkExpr(&w, p);.
a3c0: 20 20 72 65 74 75 72 6e 20 77 2e 75 2e 69 3b 0a    return w.u.i;.
a3d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
a3e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
a3f0: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
a400: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a410: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
a420: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
a430: 73 20 76 61 72 69 61 62 6c 65 73 20 6f 72 20 66  s variables or f
a440: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 2a  unction calls..*
a450: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
a460: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
a470: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
a480: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
a490: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
a4a0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
a4b0: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
a4c0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
a4d0: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
a4e0: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
a4f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a500: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  prIsConstant(Exp
a510: 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  r *p){.  return 
a520: 65 78 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 31  exprIsConst(p, 1
a530: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
a540: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
a550: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
a560: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a570: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
a580: 74 68 61 74 20 64 6f 65 73 20 6e 6f 20 6f 72 69  that does no ori
a590: 67 69 6e 61 74 65 20 66 72 6f 6d 20 74 68 65 20  ginate from the 
a5a0: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
a5b0: 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e 2e 0a 2a  ses of a join..*
a5c0: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74  * Return 0 if it
a5d0: 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62   involves variab
a5e0: 6c 65 73 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20  les or function 
a5f0: 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d 73 20 66  calls or terms f
a600: 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20 6f 72 20  rom.** an ON or 
a610: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2f  USING clause..*/
a620: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
a630: 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
a640: 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  n(Expr *p){.  re
a650: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
a660: 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 3);.}../*.**
a670: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
a680: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
a690: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
a6a0: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
a6b0: 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e 63 74 69  t.** or a functi
a6c0: 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20 63 6f 6e  on call with con
a6d0: 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
a6e0: 20 20 52 65 74 75 72 6e 20 61 6e 64 20 30 20 69    Return and 0 i
a6f0: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
a700: 6e 79 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ny variables..**
a710: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
a720: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
a730: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
a740: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
a750: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
a760: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
a770: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
a780: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a790: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
a7a0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
a7b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
a7c0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
a7d0: 63 74 69 6f 6e 28 45 78 70 72 20 2a 70 29 7b 0a  ction(Expr *p){.
a7e0: 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43    return exprIsC
a7f0: 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d 0a 0a 2f  onst(p, 2);.}../
a800: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
a810: 65 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61  ession p codes a
a820: 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
a830: 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20  r that is small 
a840: 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74  enough.** to fit
a850: 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
a860: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61  eger, return 1 a
a870: 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65  nd put the value
a880: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
a890: 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20  ** in *pValue.  
a8a0: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
a8b0: 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  n is not an inte
a8c0: 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20  ger or if it is 
a8d0: 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69  too big.** to fi
a8e0: 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32  t in a signed 32
a8f0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
a900: 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65  turn 0 and leave
a910: 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67   *pValue unchang
a920: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
a930: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
a940: 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56  Expr *p, int *pV
a950: 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  alue){.  int rc 
a960: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  = 0;..  /* If an
a970: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
a980: 6e 20 69 6e 74 65 67 65 72 20 6c 69 74 65 72 61  n integer litera
a990: 6c 20 74 68 61 74 20 66 69 74 73 20 69 6e 20 61  l that fits in a
a9a0: 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 0a 20   signed 32-bit. 
a9b0: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 74 68 65   ** integer, the
a9c0: 6e 20 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75  n the EP_IntValu
a9d0: 65 20 66 6c 61 67 20 77 69 6c 6c 20 68 61 76 65  e flag will have
a9e0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
a9f0: 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
aa00: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op!=TK_INTEGER
aa10: 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73 20 26 20   || (p->flags & 
aa20: 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 0a  EP_IntValue)!=0.
aa30: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
aa40: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d  lite3GetInt32(p-
aa50: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 63 29 3d  >u.zToken, &rc)=
aa60: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  =0 );..  if( p->
aa70: 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61  flags & EP_IntVa
aa80: 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70 56 61 6c  lue ){.    *pVal
aa90: 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61 6c 75 65  ue = p->u.iValue
aaa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
aab0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 2d    }.  switch( p-
aac0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
aad0: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
aae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 45 78    rc = sqlite3Ex
aaf0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
ab00: 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20  Left, pValue);. 
ab10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
ab30: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
ab40: 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
ab50: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
ab60: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
ab70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
ab80: 65 72 74 28 20 76 21 3d 28 2d 32 31 34 37 34 38  ert( v!=(-214748
ab90: 33 36 34 37 2d 31 29 20 29 3b 0a 20 20 20 20 20  3647-1) );.     
aba0: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
abb0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
abc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
abd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
abe0: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
abf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ac00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ac10: 20 46 41 4c 53 45 20 69 66 20 74 68 65 72 65 20   FALSE if there 
ac20: 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
ac30: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
ac40: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   can be NULL..**
ac50: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
ac60: 73 73 69 6f 6e 20 6d 69 67 68 74 20 62 65 20 4e  ssion might be N
ac70: 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20 65 78  ULL or if the ex
ac80: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 6f 6f 20  pression is too 
ac90: 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f 20 74 65  complex.** to te
aca0: 6c 6c 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20  ll return TRUE. 
acb0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
acc0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 61 73 20  tine is used as 
acd0: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  an optimization,
ace0: 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49 73 4e 75   to skip OP_IsNu
acf0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 77 68  ll opcodes.** wh
ad00: 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  en we know that 
ad10: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
ad20: 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63 65 2c 20  e NULL.  Hence, 
ad30: 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
ad40: 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 54  .** (returning T
ad50: 52 55 45 20 77 68 65 6e 20 69 6e 20 66 61 63 74  RUE when in fact
ad60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
ad70: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 4e 55 4c  can never be NUL
ad80: 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  L) might.** be a
ad90: 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e   small performan
ada0: 63 65 20 68 69 74 20 62 75 74 20 69 73 20 6f 74  ce hit but is ot
adb0: 68 65 72 77 69 73 65 20 68 61 72 6d 6c 65 73 73  herwise harmless
adc0: 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 0a  .  On the other.
add0: 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61 6c 73 65  ** hand, a false
ade0: 20 6e 65 67 61 74 69 76 65 20 28 72 65 74 75 72   negative (retur
adf0: 6e 69 6e 67 20 46 41 4c 53 45 20 77 68 65 6e 20  ning FALSE when 
ae00: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 75 6c 64  the result could
ae10: 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20 77 69 6c   be NULL).** wil
ae20: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
ae30: 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20  in an incorrect 
ae40: 61 6e 73 77 65 72 2e 20 20 53 6f 20 77 68 65 6e  answer.  So when
ae50: 20 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72   in doubt, retur
ae60: 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f 0a 69 6e  n.** TRUE..*/.in
ae70: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e  t sqlite3ExprCan
ae80: 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20 45 78 70  BeNull(const Exp
ae90: 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f 70 3b 0a  r *p){.  u8 op;.
aea0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d    while( p->op==
aeb0: 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f  TK_UPLUS || p->o
aec0: 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20 29 7b 20  p==TK_UMINUS ){ 
aed0: 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a  p = p->pLeft; }.
aee0: 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20    op = p->op;.  
aef0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53  if( op==TK_REGIS
af00: 54 45 52 20 29 20 6f 70 20 3d 20 70 2d 3e 6f 70  TER ) op = p->op
af10: 32 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  2;.  switch( op 
af20: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
af30: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
af40: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
af50: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
af60: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
af70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
af80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
af90: 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  UMN:.      asser
afa0: 74 28 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b  t( p->pTab!=0 );
afb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
afc0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
afd0: 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 2d 3e  ->pTab->aCol[p->
afe0: 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c  iColumn].notNull
aff0: 3d 3d 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  ==0;.    default
b000: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
b010: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
b020: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
b030: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
b040: 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  on is a constant
b050: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 0a   which would be.
b060: 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 62 79 20  ** unchanged by 
b070: 4f 50 5f 41 66 66 69 6e 69 74 79 20 77 69 74 68  OP_Affinity with
b080: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 67 69   the affinity gi
b090: 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
b0a0: 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
b0b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b0c0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
b0d0: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4f 50  ermine if the OP
b0e0: 5f 41 66 66 69 6e 69 74 79 20 6f 70 65 72 61 74  _Affinity operat
b0f0: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 6d  ion.** can be om
b100: 69 74 74 65 64 2e 20 20 57 68 65 6e 20 69 6e 20  itted.  When in 
b110: 64 6f 75 62 74 20 72 65 74 75 72 6e 20 46 41 4c  doubt return FAL
b120: 53 45 2e 20 20 41 20 66 61 6c 73 65 20 6e 65 67  SE.  A false neg
b130: 61 74 69 76 65 0a 2a 2a 20 69 73 20 68 61 72 6d  ative.** is harm
b140: 6c 65 73 73 2e 20 20 41 20 66 61 6c 73 65 20 70  less.  A false p
b150: 6f 73 69 74 69 76 65 2c 20 68 6f 77 65 76 65 72  ositive, however
b160: 2c 20 63 61 6e 20 72 65 73 75 6c 74 20 69 6e 20  , can result in 
b170: 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20 61 6e 73  the wrong.** ans
b180: 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  wer..*/.int sqli
b190: 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f 41 66  te3ExprNeedsNoAf
b1a0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 63 6f 6e  finityChange(con
b1b0: 73 74 20 45 78 70 72 20 2a 70 2c 20 63 68 61 72  st Expr *p, char
b1c0: 20 61 66 66 29 7b 0a 20 20 75 38 20 6f 70 3b 0a   aff){.  u8 op;.
b1d0: 20 20 69 66 28 20 61 66 66 3d 3d 53 51 4c 49 54    if( aff==SQLIT
b1e0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20 72 65 74  E_AFF_NONE ) ret
b1f0: 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  urn 1;.  while( 
b200: 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20  p->op==TK_UPLUS 
b210: 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49  || p->op==TK_UMI
b220: 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c  NUS ){ p = p->pL
b230: 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d  eft; }.  op = p-
b240: 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  >op;.  if( op==T
b250: 4b 5f 52 45 47 49 53 54 45 52 20 29 20 6f 70 20  K_REGISTER ) op 
b260: 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74  = p->op2;.  swit
b270: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
b280: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
b290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66  .      return af
b2a0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
b2b0: 54 45 47 45 52 20 7c 7c 20 61 66 66 3d 3d 53 51  TEGER || aff==SQ
b2c0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
b2d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b2e0: 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20   TK_FLOAT: {.   
b2f0: 20 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53     return aff==S
b300: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 7c  QLITE_AFF_REAL |
b310: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
b320: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d  F_NUMERIC;.    }
b330: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
b340: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  ING: {.      ret
b350: 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f  urn aff==SQLITE_
b360: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 0a  AFF_TEXT;.    }.
b370: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
b380: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b390: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
b3a0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
b3b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b3c0: 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b 20 20 2f  >iTable>=0 );  /
b3d0: 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65 20 70 61  * p cannot be pa
b3e0: 72 74 20 6f 66 20 61 20 43 48 45 43 4b 20 63 6f  rt of a CHECK co
b3f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
b400: 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 43 6f 6c    return p->iCol
b410: 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20  umn<0.          
b420: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
b430: 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61  AFF_INTEGER || a
b440: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
b450: 55 4d 45 52 49 43 29 3b 0a 20 20 20 20 7d 0a 20  UMERIC);.    }. 
b460: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b470: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b480: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b490: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
b4a0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
b4b0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
b4c0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
b4d0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
b4e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
b4f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
b500: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
b510: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b520: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
b530: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
b540: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
b550: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
b560: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
b570: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
b580: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b590: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b5a0: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
b5b0: 74 6f 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  to the IN operat
b5c0: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
b5d0: 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79 20 6f 66  on a.** query of
b5e0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
b5f0: 20 20 20 20 20 20 78 20 49 4e 20 28 53 45 4c 45        x IN (SELE
b600: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 57 68  CT ...).**.** Wh
b610: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  ere the SELECT..
b620: 2e 20 63 6c 61 75 73 65 20 69 73 20 61 73 20 73  . clause is as s
b630: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
b640: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
b650: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  s.** routine..**
b660: 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63 74 20 6f  .** The Select o
b670: 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20  bject passed in 
b680: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b690: 20 70 72 65 70 72 6f 63 65 73 73 65 64 20 61 6e   preprocessed an
b6a0: 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72 73 20 68  d no.** errors h
b6b0: 61 76 65 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a  ave been found..
b6c0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
b6d0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b6e0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 43 61 6e  static int isCan
b6f0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 53  didateForInOpt(S
b700: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
b710: 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 45 78  List *pSrc;.  Ex
b720: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
b730: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
b740: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
b750: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
b760: 20 20 20 20 20 20 20 20 2f 2a 20 72 69 67 68 74          /* right
b770: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
b780: 20 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20   is SELECT */.  
b790: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 20  if( p->pPrior ) 
b7a0: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
b7b0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 20         /* Not a 
b7c0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
b7d0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
b7e0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
b7f0: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
b800: 29 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  ) ){.    testcas
b810: 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  e( (p->selFlags 
b820: 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
b830: 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
b840: 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  F_Distinct );.  
b850: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 2d 3e    testcase( (p->
b860: 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
b870: 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
b880: 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
b890: 67 61 74 65 20 29 3b 0a 20 20 20 20 72 65 74 75  gate );.    retu
b8a0: 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44 49 53 54  rn 0; /* No DIST
b8b0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 61 6e 64  INCT keyword and
b8c0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
b8d0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 0a 20  nctions */.  }. 
b8e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
b8f0: 75 70 42 79 3d 3d 30 20 29 3b 20 20 20 20 20 20  upBy==0 );      
b900: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e          /* Has n
b910: 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
b920: 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4c  e */.  if( p->pL
b930: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b950: 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c   Has no LIMIT cl
b960: 61 75 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ause */.  assert
b970: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
b980: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
b990: 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20 6d 65 61   /* No LIMIT mea
b9a0: 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20 2a 2f 0a  ns no OFFSET */.
b9b0: 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
b9c0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
b9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 20           /* Has 
b9e0: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  no WHERE clause 
b9f0: 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  */.  pSrc = p->p
ba00: 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
ba10: 53 72 63 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Src!=0 );.  if( 
ba20: 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20  pSrc->nSrc!=1 ) 
ba30: 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
ba40: 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 74 65 72     /* Single ter
ba50: 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65  m in FROM clause
ba60: 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e   */.  if( pSrc->
ba70: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 29 20 72  a[0].pSelect ) r
ba80: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20  eturn 0;     /* 
ba90: 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61 20 73 75  FROM is not a su
baa0: 62 71 75 65 72 79 20 6f 72 20 76 69 65 77 20 2a  bquery or view *
bab0: 2f 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d  /.  pTab = pSrc-
bac0: 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 69 66  >a[0].pTab;.  if
bad0: 28 20 4e 45 56 45 52 28 70 54 61 62 3d 3d 30 29  ( NEVER(pTab==0)
bae0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
baf0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 53 65  ssert( pTab->pSe
bb00: 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20 20 20 20  lect==0 );      
bb10: 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
bb20: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 20 76 69  ause is not a vi
bb30: 65 77 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  ew */.  if( IsVi
bb40: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
bb50: 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f  turn 0;        /
bb60: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6e 6f  * FROM clause no
bb70: 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
bb80: 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
bb90: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
bba0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
bbb0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
bbc0: 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d      /* One colum
bbd0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
bbe0: 73 65 74 20 2a 2f 0a 20 20 69 66 28 20 70 45 4c  set */.  if( pEL
bbf0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
bc00: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
bc10: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
bc20: 73 75 6c 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sult is a column
bc30: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
bc40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bc50: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
bc60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
bc70: 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72  an OP_Once instr
bc80: 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f 63  uction and alloc
bc90: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ate space for it
bca0: 73 20 66 6c 61 67 2e 20 52 65 74 75 72 6e 20 74  s flag. Return t
bcb0: 68 65 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  he .** address o
bcc0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
bcd0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
bce0: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 50 61  lite3CodeOnce(Pa
bcf0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
bd00: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
bd10: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
bd20: 3b 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61  ;      /* Virtua
bd30: 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20  l machine being 
bd40: 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65 74 75 72  coded */.  retur
bd50: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
bd60: 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op1(v, OP_Once, 
bd70: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 2b 2b 29  pParse->nOnce++)
bd80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
bd90: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 63 68  ate code that ch
bda0: 65 63 6b 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  ecks the left-mo
bdb0: 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64  st column of ind
bdc0: 65 78 20 74 61 62 6c 65 20 69 43 75 72 20 74 6f  ex table iCur to
bdd0: 20 73 65 65 20 69 66 0a 2a 2a 20 69 74 20 63 6f   see if.** it co
bde0: 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55 4c 4c 20  ntains any NULL 
bdf0: 65 6e 74 72 69 65 73 2e 20 20 43 61 75 73 65 20  entries.  Cause 
be00: 74 68 65 20 72 65 67 69 73 74 65 72 20 61 74 20  the register at 
be10: 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f 20 62 65  regHasNull to be
be20: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e   set.** to a non
be30: 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 66 20 69  -NULL value if i
be40: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  Cur contains no 
be50: 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65 20 72 65  NULLs.  Cause re
be60: 67 69 73 74 65 72 20 72 65 67 48 61 73 4e 75 6c  gister regHasNul
be70: 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65 74 20 74  l.** to be set t
be80: 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75 72 20 63  o NULL if iCur c
be90: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
bea0: 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
beb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bec0: 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75 6c  sqlite3SetHasNul
bed0: 6c 46 6c 61 67 28 56 64 62 65 20 2a 76 2c 20 69  lFlag(Vdbe *v, i
bee0: 6e 74 20 69 43 75 72 2c 20 69 6e 74 20 72 65 67  nt iCur, int reg
bef0: 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69 6e 74 20  HasNull){.  int 
bf00: 6a 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  j1;.  sqlite3Vdb
bf10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
bf20: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 48 61 73  teger, 0, regHas
bf30: 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20 3d 20 73 71  Null);.  j1 = sq
bf40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bf50: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43  v, OP_Rewind, iC
bf60: 75 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ur); VdbeCoverag
bf70: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
bf80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
bf90: 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c 20 30 2c  Column, iCur, 0,
bfa0: 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20   regHasNull);.  
bfb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
bfc0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 54 59  eP5(v, OPFLAG_TY
bfd0: 50 45 4f 46 41 52 47 29 3b 0a 20 20 56 64 62 65  PEOFARG);.  Vdbe
bfe0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 69 72  Comment((v, "fir
bff0: 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25 64 29 22  st_entry_in(%d)"
c000: 2c 20 69 43 75 72 29 29 3b 0a 20 20 73 71 6c 69  , iCur));.  sqli
c010: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
c020: 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  v, j1);.}...#ifn
c030: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c040: 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
c050: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  he argument is a
c060: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69  n IN operator wi
c070: 74 68 20 61 20 6c 69 73 74 20 28 6e 6f 74 20 61  th a list (not a
c080: 20 73 75 62 71 75 65 72 79 29 20 6f 6e 20 74 68   subquery) on th
c090: 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64  e .** right-hand
c0a0: 20 73 69 64 65 2e 20 20 52 65 74 75 72 6e 20 54   side.  Return T
c0b0: 52 55 45 20 69 66 20 74 68 61 74 20 6c 69 73 74  RUE if that list
c0c0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f   is constant..*/
c0d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
c0e0: 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61  te3InRhsIsConsta
c0f0: 6e 74 28 45 78 70 72 20 2a 70 49 6e 29 7b 0a 20  nt(Expr *pIn){. 
c100: 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a 20 20 69   Expr *pLHS;.  i
c110: 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
c120: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
c130: 74 79 28 70 49 6e 2c 20 45 50 5f 78 49 73 53 65  ty(pIn, EP_xIsSe
c140: 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c 48 53 20  lect) );.  pLHS 
c150: 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b 0a 20 20  = pIn->pLeft;.  
c160: 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  pIn->pLeft = 0;.
c170: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 45    res = sqlite3E
c180: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 49  xprIsConstant(pI
c190: 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74  n);.  pIn->pLeft
c1a0: 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65 74 75 72   = pLHS;.  retur
c1b0: 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n res;.}.#endif.
c1c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c1d0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
c1e0: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
c1f0: 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20 28 2e 2e  on of the IN (..
c200: 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .) operator..** 
c210: 54 68 65 20 70 58 20 70 61 72 61 6d 65 74 65 72  The pX parameter
c220: 20 69 73 20 74 68 65 20 65 78 70 72 65 73 73 69   is the expressi
c230: 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66  on on the RHS of
c240: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
c250: 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  , which.** might
c260: 20 62 65 20 65 69 74 68 65 72 20 61 20 6c 69 73   be either a lis
c270: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
c280: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
c290: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
c2a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
c2b0: 20 74 6f 20 66 69 6e 64 20 6f 72 20 63 72 65 61   to find or crea
c2c0: 74 65 20 61 20 62 2d 74 72 65 65 20 6f 62 6a 65  te a b-tree obje
c2d0: 63 74 20 74 68 61 74 20 63 61 6e 0a 2a 2a 20 62  ct that can.** b
c2e0: 65 20 75 73 65 64 20 65 69 74 68 65 72 20 74 6f  e used either to
c2f0: 20 74 65 73 74 20 66 6f 72 20 6d 65 6d 62 65 72   test for member
c300: 73 68 69 70 20 69 6e 20 74 68 65 20 52 48 53 20  ship in the RHS 
c310: 73 65 74 20 6f 72 20 74 6f 20 69 74 65 72 61 74  set or to iterat
c320: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 61 6c 6c  e through.** all
c330: 20 6d 65 6d 62 65 72 73 20 6f 66 20 74 68 65 20   members of the 
c340: 52 48 53 20 73 65 74 2c 20 73 6b 69 70 70 69 6e  RHS set, skippin
c350: 67 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  g duplicates..**
c360: 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20 69 73 20  .** A cursor is 
c370: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 62 2d  opened on the b-
c380: 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74  tree object that
c390: 20 69 73 20 74 68 65 20 52 48 53 20 6f 66 20 74   is the RHS of t
c3a0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
c3b0: 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61 62 6c 65  * and pX->iTable
c3c0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69   is set to the i
c3d0: 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 75 72  ndex of that cur
c3e0: 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sor..**.** The r
c3f0: 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6f 66  eturned value of
c400: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c410: 6e 64 69 63 61 74 65 73 20 74 68 65 20 62 2d 74  ndicates the b-t
c420: 72 65 65 20 74 79 70 65 2c 20 61 73 20 66 6f 6c  ree type, as fol
c430: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 49 4e  lows:.**.**   IN
c440: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 20 20 20  _INDEX_ROWID    
c450: 20 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77    - The cursor w
c460: 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64  as opened on a d
c470: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
c480: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44  *   IN_INDEX_IND
c490: 45 58 5f 41 53 43 20 20 2d 20 54 68 65 20 63 75  EX_ASC  - The cu
c4a0: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
c4b0: 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
c4c0: 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49  index..**   IN_I
c4d0: 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45 53 43 20  NDEX_INDEX_DESC 
c4e0: 2d 20 54 68 65 20 63 75 72 73 6f 72 20 77 61 73  - The cursor was
c4f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 64 65 73   opened on a des
c500: 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a  cending index..*
c510: 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  *   IN_INDEX_EPH
c520: 20 20 20 20 20 20 20 20 2d 20 54 68 65 20 63 75          - The cu
c530: 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  rsor was opened 
c540: 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c 79 20 63  on a specially c
c550: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 20 20  reated and.**   
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
c580: 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 2e  epheremal table.
c590: 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4e  .**   IN_INDEX_N
c5a0: 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e 6f 20 63  OOP       - No c
c5b0: 75 72 73 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61  ursor was alloca
c5c0: 74 65 64 2e 20 20 54 68 65 20 49 4e 20 6f 70 65  ted.  The IN ope
c5d0: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  rator must be.**
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 20 20 69 6d 70 6c 65 6d 65           impleme
c600: 6e 74 65 64 20 61 73 20 61 20 73 65 71 75 65 6e  nted as a sequen
c610: 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ce of comparison
c620: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 73  s..**.** An exis
c630: 74 69 6e 67 20 62 2d 74 72 65 65 20 6d 69 67 68  ting b-tree migh
c640: 74 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65  t be used if the
c650: 20 52 48 53 20 65 78 70 72 65 73 73 69 6f 6e 20   RHS expression 
c660: 70 58 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a  pX is a simple.*
c670: 2a 20 73 75 62 71 75 65 72 79 20 73 75 63 68 20  * subquery such 
c680: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  as:.**.**     SE
c690: 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52  LECT <column> FR
c6a0: 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a 0a 2a 2a  OM <table>.**.**
c6b0: 20 49 66 20 74 68 65 20 52 48 53 20 6f 66 20 74   If the RHS of t
c6c0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
c6d0: 73 20 61 20 6c 69 73 74 20 6f 72 20 61 20 6d 6f  s a list or a mo
c6e0: 72 65 20 63 6f 6d 70 6c 65 78 20 73 75 62 71 75  re complex subqu
c6f0: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  ery, then.** an 
c700: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
c710: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
c720: 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20   generated from 
c730: 74 68 65 20 52 48 53 20 61 6e 64 20 74 68 65 6e  the RHS and then
c740: 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c 65 20 6d  .** pX->iTable m
c750: 61 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ade to point to 
c760: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
c770: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
c780: 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 74 61  n.** existing ta
c790: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ble..**.** The i
c7a0: 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  nFlags parameter
c7b0: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 65 78   must contain ex
c7c0: 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
c7d0: 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45   bits.** IN_INDE
c7e0: 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 6f 72 20  X_MEMBERSHIP or 
c7f0: 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 2e 20 20  IN_INDEX_LOOP.  
c800: 49 66 20 69 6e 46 6c 61 67 73 20 63 6f 6e 74 61  If inFlags conta
c810: 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44 45 58 5f  ins.** IN_INDEX_
c820: 4d 45 4d 42 45 52 53 48 49 50 2c 20 74 68 65 6e  MEMBERSHIP, then
c830: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 74   the generated t
c840: 61 62 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65  able will be use
c850: 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61 73 74 20  d for a.** fast 
c860: 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 2e  membership test.
c870: 20 20 57 68 65 6e 20 74 68 65 20 49 4e 5f 49 4e    When the IN_IN
c880: 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20 69 73 20  DEX_LOOP bit is 
c890: 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49 4e 20 69  set, the.** IN i
c8a0: 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 75 73 65  ndex will be use
c8b0: 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65 72 20 61  d to loop over a
c8c0: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  ll values of the
c8d0: 20 52 48 53 20 6f 66 20 74 68 65 0a 2a 2a 20 49   RHS of the.** I
c8e0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  N operator..**.*
c8f0: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
c900: 4c 4f 4f 50 20 69 73 20 75 73 65 64 20 28 61 6e  LOOP is used (an
c910: 64 20 74 68 65 20 62 2d 74 72 65 65 20 77 69 6c  d the b-tree wil
c920: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
c930: 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20  rate.** through 
c940: 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73 29  the set members)
c950: 20 74 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65   then the b-tree
c960: 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e 74 61 69   must not contai
c970: 6e 20 64 75 70 6c 69 63 61 74 65 73 2e 0a 2a 2a  n duplicates..**
c980: 20 41 6e 20 65 70 68 65 72 65 6d 61 6c 20 74 61   An epheremal ta
c990: 62 6c 65 20 6d 75 73 74 20 62 65 20 75 73 65 64  ble must be used
c9a0: 20 75 6e 6c 65 73 73 20 74 68 65 20 73 65 6c 65   unless the sele
c9b0: 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73  cted <column> is
c9c0: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
c9d0: 6f 20 62 65 20 75 6e 69 71 75 65 20 2d 20 65 69  o be unique - ei
c9e0: 74 68 65 72 20 62 65 63 61 75 73 65 20 69 74 20  ther because it 
c9f0: 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  is an INTEGER PR
ca00: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 69 74 0a  IMARY KEY or it.
ca10: 2a 2a 20 68 61 73 20 61 20 55 4e 49 51 55 45 20  ** has a UNIQUE 
ca20: 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72 20 55 4e  constraint or UN
ca30: 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  IQUE index..**.*
ca40: 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44 45 58 5f  * When IN_INDEX_
ca50: 4d 45 4d 42 45 52 53 48 49 50 20 69 73 20 75 73  MEMBERSHIP is us
ca60: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
ca70: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
ca80: 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20 73 65 74  .** for fast set
ca90: 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73 74   membership test
caa0: 73 29 20 74 68 65 6e 20 61 6e 20 65 70 68 65 72  s) then an epher
cab0: 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20  emal table must 
cac0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 75 6e 6c 65  .** be used unle
cad0: 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69 73 20 61  ss <column> is a
cae0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
caf0: 59 20 4b 45 59 20 6f 72 20 61 6e 20 69 6e 64 65  Y KEY or an inde
cb00: 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20 66 6f 75  x can .** be fou
cb10: 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75 6d 6e 3e  nd with <column>
cb20: 20 61 73 20 69 74 73 20 6c 65 66 74 2d 6d 6f 73   as its left-mos
cb30: 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  t column..**.** 
cb40: 49 66 20 74 68 65 20 49 4e 5f 49 4e 44 45 58 5f  If the IN_INDEX_
cb50: 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49 4e 5f 49  NOOP_OK and IN_I
cb60: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
cb70: 61 72 65 20 62 6f 74 68 20 73 65 74 20 61 6e 64  are both set and
cb80: 0a 2a 2a 20 69 66 20 74 68 65 20 52 48 53 20 6f  .** if the RHS o
cb90: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
cba0: 72 20 69 73 20 61 20 6c 69 73 74 20 28 6e 6f 74  r is a list (not
cbb0: 20 61 20 73 75 62 71 75 65 72 79 29 20 74 68 65   a subquery) the
cbc0: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
cbd0: 65 20 6d 69 67 68 74 20 64 65 63 69 64 65 20 74  e might decide t
cbe0: 68 61 74 20 63 72 65 61 74 69 6e 67 20 61 6e 20  hat creating an 
cbf0: 65 70 68 65 6d 65 72 61 6c 20 62 2d 74 72 65 65  ephemeral b-tree
cc00: 20 66 6f 72 20 6d 65 6d 62 65 72 73 68 69 70 0a   for membership.
cc10: 2a 2a 20 74 65 73 74 69 6e 67 20 69 73 20 74 6f  ** testing is to
cc20: 6f 20 65 78 70 65 6e 73 69 76 65 20 61 6e 64 20  o expensive and 
cc30: 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f  return IN_INDEX_
cc40: 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61 74 20 63  NOOP.  In that c
cc50: 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ase, the.** call
cc60: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  ing routine shou
cc70: 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  ld implement the
cc80: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 75 73 69   IN operator usi
cc90: 6e 67 20 61 20 73 65 71 75 65 6e 63 65 0a 2a 2a  ng a sequence.**
cca0: 20 6f 66 20 45 71 20 6f 72 20 4e 65 20 63 6f 6d   of Eq or Ne com
ccb0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
ccc0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  ns..**.** When t
ccd0: 68 65 20 62 2d 74 72 65 65 20 69 73 20 62 65 69  he b-tree is bei
cce0: 6e 67 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 62  ng used for memb
ccf0: 65 72 73 68 69 70 20 74 65 73 74 73 2c 20 74 68  ership tests, th
cd00: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
cd10: 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e 65 65 64  on.** might need
cd20: 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74 68 65 72   to know whether
cd30: 20 6f 72 20 6e 6f 74 20 74 68 65 20 52 48 53 20   or not the RHS 
cd40: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f  side of the IN o
cd50: 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f 6e 74 61  perator.** conta
cd60: 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20 49 66 20  ins a NULL.  If 
cd70: 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69 73 20  prRhsHasNull is 
cd80: 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  not a NULL point
cd90: 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66 20 74 68  er and .** if th
cda0: 65 72 65 20 69 73 20 61 6e 79 20 63 68 61 6e 63  ere is any chanc
cdb0: 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e 29  e that the (...)
cdc0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
cdd0: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61 74 0a 2a   NULL value at.*
cde0: 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68 65 6e 20  * runtime, then 
cdf0: 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61 6c  a register is al
ce00: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
ce10: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
ce20: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 2a 70  written.** to *p
ce30: 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20 49 66 20  rRhsHasNull. If 
ce40: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
ce50: 63 65 20 74 68 61 74 20 74 68 65 20 28 2e 2e 2e  ce that the (...
ce60: 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20  ) contains a.** 
ce70: 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74 68 65 6e  NULL value, then
ce80: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 69   *prRhsHasNull i
ce90: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
cea0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 67  ..**.** If a reg
ceb0: 69 73 74 65 72 20 69 73 20 61 6c 6c 6f 63 61 74  ister is allocat
cec0: 65 64 20 61 6e 64 20 69 74 73 20 6c 6f 63 61 74  ed and its locat
ced0: 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e 20 2a 70  ion stored in *p
cee0: 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 74 68 65  rRhsHasNull, the
cef0: 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
cf00: 6e 20 74 68 61 74 20 72 65 67 69 73 74 65 72 20  n that register 
cf10: 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20  will be NULL if 
cf20: 74 68 65 20 62 2d 74 72 65 65 20 63 6f 6e 74 61  the b-tree conta
cf30: 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  ins one or more.
cf40: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  ** NULL values, 
cf50: 61 6e 64 20 69 74 20 77 69 6c 6c 20 62 65 20 73  and it will be s
cf60: 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  ome non-NULL val
cf70: 75 65 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  ue if the b-tree
cf80: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
cf90: 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  NULL values..*/.
cfa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cfb0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69 6e 74  MIT_SUBQUERY.int
cfc0: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e   sqlite3FindInIn
cfd0: 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
cfe0: 65 2c 20 45 78 70 72 20 2a 70 58 2c 20 75 33 32  e, Expr *pX, u32
cff0: 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74 20 2a 70   inFlags, int *p
d000: 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b 0a 20 20  rRhsHasNull){.  
d010: 53 65 6c 65 63 74 20 2a 70 3b 20 20 20 20 20 20  Select *p;      
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
d040: 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
d050: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
d060: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 30 3b 20   int eType = 0; 
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
d090: 66 20 52 48 53 20 74 61 62 6c 65 2e 20 49 4e 5f  f RHS table. IN_
d0a0: 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20 69 6e 74  INDEX_* */.  int
d0b0: 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
d0c0: 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20 20 20 20  nTab++;         
d0d0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 66 20     /* Cursor of 
d0e0: 74 68 65 20 52 48 53 20 74 61 62 6c 65 20 2a 2f  the RHS table */
d0f0: 0a 20 20 69 6e 74 20 6d 75 73 74 42 65 55 6e 69  .  int mustBeUni
d100: 71 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  que;            
d110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
d120: 20 69 66 20 52 48 53 20 6d 75 73 74 20 62 65 20   if RHS must be 
d130: 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56 64 62 65  unique */.  Vdbe
d140: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
d150: 56 64 62 65 28 70 50 61 72 73 65 29 3b 20 20 20  Vdbe(pParse);   
d160: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 6d 61 63    /* Virtual mac
d170: 68 69 6e 65 20 62 65 69 6e 67 20 63 6f 64 65 64  hine being coded
d180: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
d190: 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
d1a0: 20 20 6d 75 73 74 42 65 55 6e 69 71 75 65 20 3d    mustBeUnique =
d1b0: 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49   (inFlags & IN_I
d1c0: 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30 3b 0a 0a  NDEX_LOOP)!=0;..
d1d0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
d1e0: 65 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e if an existing
d1f0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
d200: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 0a 20  can be used to. 
d210: 20 2a 2a 20 73 61 74 69 73 66 79 20 74 68 65 20   ** satisfy the 
d220: 71 75 65 72 79 2e 20 20 54 68 69 73 20 69 73 20  query.  This is 
d230: 70 72 65 66 65 72 61 62 6c 65 20 74 6f 20 67 65  preferable to ge
d240: 6e 65 72 61 74 69 6e 67 20 61 20 6e 65 77 20 0a  nerating a new .
d250: 20 20 2a 2a 20 65 70 68 65 6d 65 72 61 6c 20 74    ** ephemeral t
d260: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  able..  */.  p =
d270: 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   (ExprHasPropert
d280: 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pX, EP_xIsSele
d290: 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70 53 65 6c  ct) ? pX->x.pSel
d2a0: 65 63 74 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ect : 0);.  if( 
d2b0: 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e  ALWAYS(pParse->n
d2c0: 45 72 72 3d 3d 30 29 20 26 26 20 69 73 43 61 6e  Err==0) && isCan
d2d0: 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70  didateForInOpt(p
d2e0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
d2f0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d300: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
d310: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
d320: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 61  ection */.    Ta
d330: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 3c 74       /* Table <t
d360: 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 45 78  able>. */.    Ex
d370: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
d3a0: 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  on <column> */. 
d3b0: 20 20 20 69 31 36 20 69 43 6f 6c 3b 20 20 20 20     i16 iCol;    
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
d3e0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 3c 63 6f  ex of column <co
d3f0: 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20 69 31 36  lumn> */.    i16
d400: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
d430: 69 64 78 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  idx for pTab */.
d440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 20 29  .    assert( p )
d450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d460: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
d470: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
d480: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
d490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d4a0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 20 20  pEList!=0 );    
d4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
d4c0: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
d4d0: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
d4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d4f0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
d500: 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42 65 63 61  pr!=0 ); /* Beca
d510: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
d520: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
d530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d540: 70 53 72 63 21 3d 30 20 29 3b 20 20 20 20 20 20  pSrc!=0 );      
d550: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 63 61           /* Beca
d560: 75 73 65 20 6f 66 20 69 73 43 61 6e 64 69 64 61  use of isCandida
d570: 74 65 46 6f 72 49 6e 4f 70 74 28 70 29 20 2a 2f  teForInOpt(p) */
d580: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70  .    pTab = p->p
d590: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a  Src->a[0].pTab;.
d5a0: 20 20 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70      pExpr = p->p
d5b0: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
d5c0: 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 28 69  r;.    iCol = (i
d5d0: 31 36 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  16)pExpr->iColum
d5e0: 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a 20 43 6f  n;.   .    /* Co
d5f0: 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e 73 61 63  de an OP_Transac
d600: 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54 61 62 6c  tion and OP_Tabl
d610: 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61 62 6c 65  eLock for <table
d620: 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20  >. */.    iDb = 
d630: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
d640: 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
d650: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71 6c  Schema);.    sql
d660: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
d670: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
d680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 61  );.    sqlite3Ta
d690: 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
d6a0: 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
d6b0: 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
d6c0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66  ;..    /* This f
d6d0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
d6e0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74 77 6f 20  called from two 
d6f0: 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f 74 68 20  places. In both 
d700: 63 61 73 65 73 20 74 68 65 20 76 64 62 65 0a 20  cases the vdbe. 
d710: 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
d720: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
d730: 2e 20 53 6f 20 61 73 73 75 6d 65 20 73 71 6c 69  . So assume sqli
d740: 74 65 33 47 65 74 56 64 62 65 28 29 20 69 73 20  te3GetVdbe() is 
d750: 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a 20 73 75  always.    ** su
d760: 63 63 65 73 73 66 75 6c 20 68 65 72 65 2e 0a 20  ccessful here.. 
d770: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
d780: 28 76 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  (v);.    if( iCo
d790: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  l<0 ){.      int
d7a0: 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
d7b0: 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29  CodeOnce(pParse)
d7c0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
d7d0: 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20  rage(v);..      
d7e0: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
d7f0: 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69  (pParse, iTab, i
d800: 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65  Db, pTab, OP_Ope
d810: 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20 65 54  nRead);.      eT
d820: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 52  ype = IN_INDEX_R
d830: 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20 73 71 6c  OWID;..      sql
d840: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
d850: 28 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20  (v, iAddr);.    
d860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
d870: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
d8a0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  riable */..     
d8b0: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
d8c0: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  n sequence used 
d8d0: 62 79 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  by the compariso
d8e0: 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65 78 20 69  n. If an index i
d8f0: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65  s to.      ** be
d900: 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f   used in place o
d910: 66 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 2c 20  f a temp-table, 
d920: 69 74 20 6d 75 73 74 20 62 65 20 6f 72 64 65 72  it must be order
d930: 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 20 20 20  ed according.   
d940: 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 63 6f     ** to this co
d950: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d960: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43 6f 6c 6c  .  */.      Coll
d970: 53 65 71 20 2a 70 52 65 71 20 3d 20 73 71 6c 69  Seq *pReq = sqli
d980: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
d990: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
d9a0: 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pX->pLeft, pExpr
d9b0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  );..      /* Che
d9c0: 63 6b 20 74 68 61 74 20 74 68 65 20 61 66 66 69  ck that the affi
d9d0: 6e 69 74 79 20 74 68 61 74 20 77 69 6c 6c 20 62  nity that will b
d9e0: 65 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72  e used to perfor
d9f0: 6d 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  m the .      ** 
da00: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 68  comparison is th
da10: 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 61 66  e same as the af
da20: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 63 6f  finity of the co
da30: 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20 20 20 2a  lumn. If.      *
da40: 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  * it is not, it 
da50: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
da60: 74 6f 20 75 73 65 20 61 6e 79 20 69 6e 64 65 78  to use any index
da70: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
da80: 20 69 6e 74 20 61 66 66 69 6e 69 74 79 5f 6f 6b   int affinity_ok
da90: 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41   = sqlite3IndexA
daa0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 54  ffinityOk(pX, pT
dab0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 61  ab->aCol[iCol].a
dac0: 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20  ffinity);..     
dad0: 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
dae0: 70 49 6e 64 65 78 3b 20 70 49 64 78 20 26 26 20  pIndex; pIdx && 
daf0: 65 54 79 70 65 3d 3d 30 20 26 26 20 61 66 66 69  eType==0 && affi
db00: 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78 3d 70 49  nity_ok; pIdx=pI
db10: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
db20: 20 20 20 20 69 66 28 20 28 70 49 64 78 2d 3e 61      if( (pIdx->a
db30: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 43 6f 6c  iColumn[0]==iCol
db40: 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  ).         && sq
db50: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
db60: 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 70 49  (db, ENC(db), pI
db70: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 2c 20 30  dx->azColl[0], 0
db80: 29 3d 3d 70 52 65 71 0a 20 20 20 20 20 20 20 20  )==pReq.        
db90: 20 26 26 20 28 21 6d 75 73 74 42 65 55 6e 69 71   && (!mustBeUniq
dba0: 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e 4b 65  ue || (pIdx->nKe
dbb0: 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73 55 6e 69  yCol==1 && IsUni
dbc0: 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 29 29  queIndex(pIdx)))
dbd0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
dbe0: 20 20 20 20 20 20 69 6e 74 20 69 41 64 64 72 20        int iAddr 
dbf0: 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63  = sqlite3CodeOnc
dc00: 65 28 70 50 61 72 73 65 29 3b 20 56 64 62 65 43  e(pParse); VdbeC
dc10: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
dc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
dc40: 65 6e 52 65 61 64 2c 20 69 54 61 62 2c 20 70 49  enRead, iTab, pI
dc50: 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  dx->tnum, iDb);.
dc60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
dc70: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
dc80: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
dc90: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
dca0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
dcb0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pIdx->zName));.
dcc0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
dcd0: 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58  ( IN_INDEX_INDEX
dce0: 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49 4e 44 45  _DESC == IN_INDE
dcf0: 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31 20 29 3b  X_INDEX_ASC+1 );
dd00: 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65  .          eType
dd10: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45   = IN_INDEX_INDE
dd20: 58 5f 41 53 43 20 2b 20 70 49 64 78 2d 3e 61 53  X_ASC + pIdx->aS
dd30: 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a 0a 20 20  ortOrder[0];..  
dd40: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 52 68          if( prRh
dd50: 73 48 61 73 4e 75 6c 6c 20 26 26 20 21 70 54 61  sHasNull && !pTa
dd60: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 6e 6f  b->aCol[iCol].no
dd70: 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  tNull ){.       
dd80: 20 20 20 20 20 2a 70 72 52 68 73 48 61 73 4e 75       *prRhsHasNu
dd90: 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ll = ++pParse->n
dda0: 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Mem;.           
ddb0: 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e 75   sqlite3SetHasNu
ddc0: 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61 62 2c 20  llFlag(v, iTab, 
ddd0: 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a  *prRhsHasNull);.
dde0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ddf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
de00: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 69 41 64  eJumpHere(v, iAd
de10: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dr);.        }. 
de20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
de30: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 70 72 65  ..  /* If no pre
de40: 65 78 69 73 74 69 6e 67 20 69 6e 64 65 78 20 69  existing index i
de50: 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
de60: 74 68 65 20 49 4e 20 63 6c 61 75 73 65 0a 20 20  the IN clause.  
de70: 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44 45 58 5f  ** and IN_INDEX_
de80: 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c 6c 6f 77  NOOP is an allow
de90: 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a 20 61 6e  ed reply.  ** an
dea0: 64 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  d the RHS of the
deb0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
dec0: 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61 20 73 75  a list, not a su
ded0: 62 71 75 65 72 79 0a 20 20 2a 2a 20 61 6e 64 20  bquery.  ** and 
dee0: 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 63  the RHS is not c
def0: 6f 6e 74 61 6e 74 20 6f 72 20 68 61 73 20 74 77  ontant or has tw
df00: 6f 20 6f 72 20 66 65 77 65 72 20 74 65 72 6d 73  o or fewer terms
df10: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  ,.  ** then it i
df20: 73 20 6e 6f 74 20 77 6f 72 74 68 20 63 72 65 61  s not worth crea
df30: 74 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ting an ephemera
df40: 6c 20 74 61 62 6c 65 20 74 6f 20 65 76 61 6c 75  l table to evalu
df50: 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 49 4e 20  ate.  ** the IN 
df60: 6f 70 65 72 61 74 6f 72 20 73 6f 20 72 65 74 75  operator so retu
df70: 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  rn IN_INDEX_NOOP
df80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
df90: 70 65 3d 3d 30 0a 20 20 20 26 26 20 28 69 6e 46  pe==0.   && (inF
dfa0: 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
dfb0: 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26 26 20 21  NOOP_OK).   && !
dfc0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
dfd0: 70 58 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pX, EP_xIsSelect
dfe0: 29 0a 20 20 20 26 26 20 28 21 73 71 6c 69 74 65  ).   && (!sqlite
dff0: 33 49 6e 52 68 73 49 73 43 6f 6e 73 74 61 6e 74  3InRhsIsConstant
e000: 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78 2e 70 4c  (pX) || pX->x.pL
e010: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32 29 0a 20  ist->nExpr<=2). 
e020: 20 29 7b 0a 20 20 20 20 65 54 79 70 65 20 3d 20   ){.    eType = 
e030: 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 3b 0a 20  IN_INDEX_NOOP;. 
e040: 20 7d 0a 20 20 20 20 20 0a 0a 20 20 69 66 28 20   }.     ..  if( 
e050: 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
e060: 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  /* Could not fin
e070: 64 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61  d an existing ta
e080: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
e090: 75 73 65 20 61 73 20 74 68 65 20 52 48 53 20 62  use as the RHS b
e0a0: 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a 20 57 65  -tree..    ** We
e0b0: 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 67 65   will have to ge
e0c0: 6e 65 72 61 74 65 20 61 6e 20 65 70 68 65 6d 65  nerate an epheme
e0d0: 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 64 6f 20  ral table to do 
e0e0: 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20 2a 2f 0a  the job..    */.
e0f0: 20 20 20 20 75 33 32 20 73 61 76 65 64 4e 51 75      u32 savedNQu
e100: 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65  eryLoop = pParse
e110: 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  ->nQueryLoop;.  
e120: 20 20 69 6e 74 20 72 4d 61 79 48 61 76 65 4e 75    int rMayHaveNu
e130: 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65 54 79 70  ll = 0;.    eTyp
e140: 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 45 50 48  e = IN_INDEX_EPH
e150: 3b 0a 20 20 20 20 69 66 28 20 69 6e 46 6c 61 67  ;.    if( inFlag
e160: 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f  s & IN_INDEX_LOO
e170: 50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  P ){.      pPars
e180: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
e190: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d  0;.      if( pX-
e1a0: 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c  >pLeft->iColumn<
e1b0: 30 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f  0 && !ExprHasPro
e1c0: 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73  perty(pX, EP_xIs
e1d0: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
e1e0: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
e1f0: 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  DEX_ROWID;.     
e200: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
e210: 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 29 7b   prRhsHasNull ){
e220: 0a 20 20 20 20 20 20 2a 70 72 52 68 73 48 61 73  .      *prRhsHas
e230: 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61 76 65 4e  Null = rMayHaveN
e240: 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ull = ++pParse->
e250: 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nMem;.    }.    
e260: 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65  sqlite3CodeSubse
e270: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58 2c  lect(pParse, pX,
e280: 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c 2c 20 65   rMayHaveNull, e
e290: 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
e2a0: 4f 57 49 44 29 3b 0a 20 20 20 20 70 50 61 72 73  OWID);.    pPars
e2b0: 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  e->nQueryLoop = 
e2c0: 73 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b  savedNQueryLoop;
e2d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 58  .  }else{.    pX
e2e0: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
e2f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 54  .  }.  return eT
e300: 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ype;.}.#endif../
e310: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
e320: 64 65 20 66 6f 72 20 73 63 61 6c 61 72 20 73 75  de for scalar su
e330: 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73  bqueries used as
e340: 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
e350: 65 73 73 69 6f 6e 2c 20 45 58 49 53 54 53 2c 0a  ession, EXISTS,.
e360: 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f  ** or IN operato
e370: 72 73 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  rs.  Examples:.*
e380: 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c 45 43 54  *.**     (SELECT
e390: 20 61 20 46 52 4f 4d 20 62 29 20 20 20 20 20 20   a FROM b)      
e3a0: 20 20 20 20 2d 2d 20 73 75 62 71 75 65 72 79 0a      -- subquery.
e3b0: 2a 2a 20 20 20 20 20 45 58 49 53 54 53 20 28 53  **     EXISTS (S
e3c0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20  ELECT a FROM b) 
e3d0: 20 20 2d 2d 20 45 58 49 53 54 53 20 73 75 62 71    -- EXISTS subq
e3e0: 75 65 72 79 0a 2a 2a 20 20 20 20 20 78 20 49 4e  uery.**     x IN
e3f0: 20 28 34 2c 35 2c 31 31 29 20 20 20 20 20 20 20   (4,5,11)       
e400: 20 20 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65         -- IN ope
e410: 72 61 74 6f 72 20 77 69 74 68 20 6c 69 73 74 20  rator with list 
e420: 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
e430: 64 65 0a 2a 2a 20 20 20 20 20 78 20 49 4e 20 28  de.**     x IN (
e440: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62 29  SELECT a FROM b)
e450: 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70 65 72 61       -- IN opera
e460: 74 6f 72 20 77 69 74 68 20 73 75 62 71 75 65 72  tor with subquer
e470: 79 20 6f 6e 20 74 68 65 20 72 69 67 68 74 0a 2a  y on the right.*
e480: 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70 72 20 70  *.** The pExpr p
e490: 61 72 61 6d 65 74 65 72 20 64 65 73 63 72 69 62  arameter describ
e4a0: 65 73 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  es the expressio
e4b0: 6e 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  n that contains 
e4c0: 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65 72 61 74  the IN.** operat
e4d0: 6f 72 20 6f 72 20 73 75 62 71 75 65 72 79 2e 0a  or or subquery..
e4e0: 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
e4f0: 65 72 20 69 73 52 6f 77 69 64 20 69 73 20 6e 6f  er isRowid is no
e500: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 65 78 70  n-zero, then exp
e510: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 73  ression pExpr is
e520: 20 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74   guaranteed.** t
e530: 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
e540: 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20 28 3f 2c   "<rowid> IN (?,
e550: 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72 65 20 3c   ?, ?)", where <
e560: 72 6f 77 69 64 3e 20 69 73 20 61 20 72 65 66 65  rowid> is a refe
e570: 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73 6f 6d 65  rence.** to some
e580: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 63 6f 6c   integer key col
e590: 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c 65 20 42  umn of a table B
e5a0: 2d 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -Tree. In this c
e5b0: 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a 2a 20 69  ase, use an.** i
e5c0: 6e 74 6b 65 79 20 42 2d 54 72 65 65 20 74 6f 20  ntkey B-Tree to 
e5d0: 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
e5e0: 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75 65 73 20   IN(...) values 
e5f0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
e600: 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77 65 72 29  sual.** (slower)
e610: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
e620: 20 6b 65 79 73 20 42 2d 54 72 65 65 2e 0a 2a 2a   keys B-Tree..**
e630: 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61 76 65 4e  .** If rMayHaveN
e640: 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ull is non-zero,
e650: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
e660: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
e670: 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e 6f 74 20  s an IN.** (not 
e680: 61 20 53 45 4c 45 43 54 20 6f 72 20 45 58 49 53  a SELECT or EXIS
e690: 54 53 29 20 61 6e 64 20 74 68 61 74 20 74 68 65  TS) and that the
e6a0: 20 52 48 53 20 6d 69 67 68 74 20 63 6f 6e 74 61   RHS might conta
e6b0: 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a 20 41 6c  ins NULLs..** Al
e6c0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64  l this routine d
e6d0: 6f 65 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  oes is initializ
e6e0: 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20 67  e the register g
e6f0: 69 76 65 6e 20 62 79 20 72 4d 61 79 48 61 76 65  iven by rMayHave
e700: 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55 4c 4c 2e  Null.** to NULL.
e710: 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e    Calling routin
e720: 65 73 20 77 69 6c 6c 20 74 61 6b 65 20 63 61 72  es will take car
e730: 65 20 6f 66 20 63 68 61 6e 67 69 6e 67 20 74 68  e of changing th
e740: 69 73 20 72 65 67 69 73 74 65 72 0a 2a 2a 20 76  is register.** v
e750: 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e 55 4c 4c  alue to non-NULL
e760: 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
e770: 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  ULL-free..**.** 
e780: 46 6f 72 20 61 20 53 45 4c 45 43 54 20 6f 72 20  For a SELECT or 
e790: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2c  EXISTS operator,
e7a0: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 67 69   return the regi
e7b0: 73 74 65 72 20 74 68 61 74 20 68 6f 6c 64 73 20  ster that holds 
e7c0: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 20  the.** result.  
e7d0: 46 6f 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  For IN operators
e7e0: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
e7f0: 6f 63 63 75 72 73 2c 20 74 68 65 20 72 65 74 75  occurs, the retu
e800: 72 6e 20 76 61 6c 75 65 20 69 73 20 30 2e 0a 2a  rn value is 0..*
e810: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e820: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 69  _OMIT_SUBQUERY.i
e830: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75  nt sqlite3CodeSu
e840: 62 73 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  bselect(.  Parse
e850: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e860: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e870: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20  ntext */.  Expr 
e880: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
e890: 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c 20 53 45     /* The IN, SE
e8a0: 4c 45 43 54 2c 20 6f 72 20 45 58 49 53 54 53 20  LECT, or EXISTS 
e8b0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  operator */.  in
e8c0: 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 2c 20  t rHasNullFlag, 
e8d0: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
e8e0: 72 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 77  r that records w
e8f0: 68 65 74 68 65 72 20 4e 55 4c 4c 73 20 65 78 69  hether NULLs exi
e900: 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a 20 20 69  st in RHS */.  i
e910: 6e 74 20 69 73 52 6f 77 69 64 20 20 20 20 20 20  nt isRowid      
e920: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
e930: 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20 6f 70 65  e, LHS of IN ope
e940: 72 61 74 6f 72 20 69 73 20 61 20 72 6f 77 69 64  rator is a rowid
e950: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 6d 70   */.){.  int jmp
e960: 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d 31 3b 20  IfDynamic = -1; 
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e980: 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74 69 6d 65       /* One-time
e990: 20 74 65 73 74 20 61 64 64 72 65 73 73 20 2a 2f   test address */
e9a0: 0a 20 20 69 6e 74 20 72 52 65 67 20 3d 20 30 3b  .  int rReg = 0;
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e9d0: 67 69 73 74 65 72 20 73 74 6f 72 69 6e 67 20 72  gister storing r
e9e0: 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20 20 56 64  esulting */.  Vd
e9f0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
ea00: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ea10: 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d 30    if( NEVER(v==0
ea20: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
ea30: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ea40: 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 0a 20  Push(pParse);.. 
ea50: 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 6d 75   /* This code mu
ea60: 73 74 20 62 65 20 72 75 6e 20 69 6e 20 69 74 73  st be run in its
ea70: 20 65 6e 74 69 72 65 74 79 20 65 76 65 72 79 20   entirety every 
ea80: 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
ea90: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69 66 20 61  ntered.  ** if a
eaa0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
eab0: 69 6e 67 20 69 73 20 74 72 75 65 3a 0a 20 20 2a  ing is true:.  *
eac0: 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65  *.  **    *  The
ead0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
eae0: 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
eaf0: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 20   subquery.  **  
eb00: 20 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68    *  The right-h
eb10: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6e 20 65  and side is an e
eb20: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63  xpression list c
eb30: 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72 69 61 62  ontaining variab
eb40: 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a 20 20 57  les.  **    *  W
eb50: 65 20 61 72 65 20 69 6e 73 69 64 65 20 61 20 74  e are inside a t
eb60: 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  rigger.  **.  **
eb70: 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
eb80: 62 6f 76 65 20 61 72 65 20 66 61 6c 73 65 2c 20  bove are false, 
eb90: 74 68 65 6e 20 77 65 20 63 61 6e 20 72 75 6e 20  then we can run 
eba0: 74 68 69 73 20 63 6f 64 65 20 6a 75 73 74 20 6f  this code just o
ebb0: 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65 20 74 68  nce.  ** save th
ebc0: 65 20 72 65 73 75 6c 74 73 2c 20 61 6e 64 20 72  e results, and r
ebd0: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 65  euse the same re
ebe0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
ebf0: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 0a  nt invocations..
ec00: 20 20 2a 2f 0a 20 20 69 66 28 20 21 45 78 70 72    */.  if( !Expr
ec10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
ec20: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
ec30: 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66 44 79 6e   ){.    jmpIfDyn
ec40: 61 6d 69 63 20 3d 20 73 71 6c 69 74 65 33 43 6f  amic = sqlite3Co
ec50: 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20  deOnce(pParse); 
ec60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ec70: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
ec80: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
ec90: 4e 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  N.  if( pParse->
eca0: 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
ecb0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
ecc0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
ecd0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
ece0: 62 2c 20 22 45 58 45 43 55 54 45 20 25 73 25 73  b, "EXECUTE %s%s
ecf0: 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20 6a   SUBQUERY %d", j
ed00: 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 3f 22  mpIfDynamic>=0?"
ed10: 22 3a 22 43 4f 52 52 45 4c 41 54 45 44 20 22 2c  ":"CORRELATED ",
ed20: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
ed30: 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49 53 54 22  op==TK_IN?"LIST"
ed40: 3a 22 53 43 41 4c 41 52 22 2c 20 70 50 61 72 73  :"SCALAR", pPars
ed50: 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
ed60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
ed70: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
ed80: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
ed90: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
eda0: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
edb0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 23 65 6e  YNAMIC);.  }.#en
edc0: 64 69 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70  dif..  switch( p
edd0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
ede0: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
edf0: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
ee00: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
ee10: 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f 66 20 74  /* Affinity of t
ee20: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49 4e  he LHS of the IN
ee30: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
ee40: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
ee50: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ee60: 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   of OP_OpenEphem
ee70: 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
ee80: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
ee90: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
eea0: 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20 4c 48 53  Left; /* the LHS
eeb0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
eec0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 4b 65 79  tor */.      Key
eed0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
eee0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b 65 79 20   0;      /* Key 
eef0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a  information */..
ef00: 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d        affinity =
ef10: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
ef20: 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a 0a 20 20  nity(pLeft);..  
ef30: 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74      /* Whether t
ef40: 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28  his is an 'x IN(
ef50: 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61  SELECT...)' or a
ef60: 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73  n 'x IN(<exprlis
ef70: 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78  t>)'.      ** ex
ef80: 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68  pression it is h
ef90: 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20  andled the same 
efa0: 77 61 79 2e 20 20 41 6e 20 65 70 68 65 6d 65 72  way.  An ephemer
efb0: 61 6c 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  al table is .   
efc0: 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
efd0: 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69  h single-field i
efe0: 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73  ndex keys repres
eff0: 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  enting the resul
f000: 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ts.      ** from
f010: 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74   the SELECT or t
f020: 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
f030: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
f040: 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
f050: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
f060: 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
f070: 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
f080: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
f090: 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
f0a0: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
f0b0: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
f0c0: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
f0d0: 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
f0e0: 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
f0f0: 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
f100: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
f110: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
f120: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
f130: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
f140: 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
f150: 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
f160: 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
f170: 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
f180: 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
f190: 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
f1a0: 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
f1b0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
f1c0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
f1d0: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
f1e0: 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
f1f0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f200: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
f210: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f220: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
f230: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f240: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
f250: 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  al, pExpr->iTabl
f260: 65 2c 20 21 69 73 52 6f 77 69 64 29 3b 0a 20 20  e, !isRowid);.  
f270: 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 69      pKeyInfo = i
f280: 73 52 6f 77 69 64 20 3f 20 30 20 3a 20 73 71 6c  sRowid ? 0 : sql
f290: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
f2a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 31 2c 20  (pParse->db, 1, 
f2b0: 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 45  1);..      if( E
f2c0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
f2d0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
f2e0: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ct) ){.        /
f2f0: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
f300: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
f310: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
f320: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
f330: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
f340: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
f350: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
f360: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
f370: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
f380: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
f390: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
f3a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c    */.        Sel
f3b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 70  ect *pSelect = p
f3c0: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b  Expr->x.pSelect;
f3d0: 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
f3e0: 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  est dest;.      
f3f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
f400: 73 74 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  st;..        ass
f410: 65 72 74 28 20 21 69 73 52 6f 77 69 64 20 29 3b  ert( !isRowid );
f420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f430: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
f440: 64 65 73 74 2c 20 53 52 54 5f 53 65 74 2c 20 70  dest, SRT_Set, p
f450: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
f460: 20 20 20 20 20 20 20 64 65 73 74 2e 61 66 66 53         dest.affS
f470: 64 73 74 20 3d 20 28 75 38 29 61 66 66 69 6e 69  dst = (u8)affini
f480: 74 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ty;.        asse
f490: 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62  rt( (pExpr->iTab
f4a0: 6c 65 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d  le&0x0000FFFF)==
f4b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
f4c0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65 63 74  .        pSelect
f4d0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
f4e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f4f0: 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67  pSelect->selFlag
f500: 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
f510: 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 65  );.        pSele
f520: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  ct->selFlags &= 
f530: 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
f540: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f550: 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 3b 20 2f  pKeyInfo==0 ); /
f560: 2a 20 43 61 75 73 65 64 20 62 79 20 4f 4f 4d 20  * Caused by OOM 
f570: 69 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  in sqlite3KeyInf
f580: 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 20 20  oAlloc() */.    
f590: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
f5a0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
f5b0: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 20 29 7b  elect, &dest) ){
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f5d0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
f5e0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  KeyInfo);.      
f5f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f610: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
f620: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
f630: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
f640: 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f 4f 4d 20  fo!=0 ); /* OOM 
f650: 77 69 6c 6c 20 63 61 75 73 65 20 65 78 69 74 20  will cause exit 
f660: 61 66 74 65 72 20 73 71 6c 69 74 65 33 53 65 6c  after sqlite3Sel
f670: 65 63 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20  ect() */.       
f680: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
f690: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
f6a0: 73 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45  sert( pEList->nE
f6b0: 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  xpr>0 );.       
f6c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f6d0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
f6e0: 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
f6f0: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
f700: 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c  ->aColl[0] = sql
f710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
f720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
f730: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20   pExpr->pLeft,. 
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
f780: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
f790: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
f7a0: 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  AYS(pExpr->x.pLi
f7b0: 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  st!=0) ){.      
f7c0: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
f7d0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
f7e0: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st).        **. 
f7f0: 20 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 65 61         ** For ea
f800: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62  ch expression, b
f810: 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65  uild an index ke
f820: 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75  y from the evalu
f830: 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20  ation and.      
f840: 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e    ** store it in
f850: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
f860: 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20  able. If <expr> 
f870: 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  is a column, the
f880: 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  n use.        **
f890: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66   that columns af
f8a0: 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c  finity when buil
f8b0: 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e  ding index keys.
f8c0: 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f   If <expr> is no
f8d0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  t.        ** a c
f8e0: 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72  olumn, use numer
f8f0: 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  ic affinity..   
f900: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f910: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45  int i;.        E
f920: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
f930: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
f940: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
f950: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
f960: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Item;.        in
f970: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 0a 20  t r1, r2, r3;.. 
f980: 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66 69         if( !affi
f990: 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nity ){.        
f9a0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c    affinity = SQL
f9b0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
f9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f9d0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
f9e0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
f9f0: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
fa00: 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
fa10: 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20  Info) );.       
fa20: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f     pKeyInfo->aCo
fa30: 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 45  ll[0] = sqlite3E
fa40: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
fa50: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
fa60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
fa70: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
fa80: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
fa90: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
faa0: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  t>. */.        r
fab0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
fac0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
fad0: 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
fae0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
faf0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
fb00: 66 28 20 69 73 52 6f 77 69 64 20 29 20 73 71 6c  f( isRowid ) sql
fb10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fb20: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 32  , OP_Null, 0, r2
fb30: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
fb40: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
fb50: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
fb60: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
fb70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
fb80: 72 20 2a 70 45 32 20 3d 20 70 49 74 65 6d 2d 3e  r *pE2 = pItem->
fb90: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
fba0: 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e 73 3b 0a   int iValToIns;.
fbb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
fbc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fbd0: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 20  is not constant 
fbe0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 65  then we will nee
fbf0: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  d to.          *
fc00: 2a 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65  * disable the te
fc10: 73 74 20 74 68 61 74 20 77 61 73 20 67 65 6e 65  st that was gene
fc20: 72 61 74 65 64 20 61 62 6f 76 65 20 74 68 61 74  rated above that
fc30: 20 6d 61 6b 65 73 20 73 75 72 65 0a 20 20 20 20   makes sure.    
fc40: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
fc50: 64 65 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 73  de only executes
fc60: 20 6f 6e 63 65 2e 20 20 42 65 63 61 75 73 65 20   once.  Because 
fc70: 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e 73 74 61  for a non-consta
fc80: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
fc90: 65 78 70 72 65 73 73 69 6f 6e 20 77 65 20 6e 65  expression we ne
fca0: 65 64 20 74 6f 20 72 65 72 75 6e 20 74 68 69 73  ed to rerun this
fcb0: 20 63 6f 64 65 20 65 61 63 68 20 74 69 6d 65 2e   code each time.
fcc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
fcd0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 6d 70 49          if( jmpI
fce0: 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26 26 20 21  fDynamic>=0 && !
fcf0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
fd00: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
fd10: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fd20: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
fd30: 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  p(v, jmpIfDynami
fd40: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
fd50: 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
fd60: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
fd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
fd80: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
fd90: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
fda0: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
fdb0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
fdc0: 20 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20      if( isRowid 
fdd0: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
fde0: 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 56  Integer(pE2, &iV
fdf0: 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20 20 20 20  alToIns) ){.    
fe00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fe10: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
fe20: 49 6e 73 65 72 74 49 6e 74 2c 20 70 45 78 70 72  InsertInt, pExpr
fe30: 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c 20 69 56  ->iTable, r2, iV
fe40: 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20 20 20 20  alToIns);.      
fe50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe60: 20 20 20 20 20 20 20 72 33 20 3d 20 73 71 6c 69         r3 = sqli
fe70: 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
fe80: 74 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 72  t(pParse, pE2, r
fe90: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
fea0: 69 66 28 20 69 73 52 6f 77 69 64 20 29 7b 0a 20  if( isRowid ){. 
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
fec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fed0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
fee0: 72 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r3,.            
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
ff10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
ff20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ff30: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ff40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ff50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
ff60: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
ff70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32  Expr->iTable, r2
ff80: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 20  , r3);.         
ff90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ffa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ffb0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
ffc0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 33 2c 20  MakeRecord, r3, 
ffd0: 31 2c 20 72 32 2c 20 26 61 66 66 69 6e 69 74 79  1, r2, &affinity
ffe0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
fff0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
10000 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
10010 67 65 28 70 50 61 72 73 65 2c 20 72 33 2c 20 31  ge(pParse, r3, 1
10020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
10030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10040 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
10050 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt, pExpr->iTabl
10060 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  e, r2);.        
10070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10080 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
10090 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
100a0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
100b0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
100c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
100d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
100e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
100f0 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
10100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10110 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61  dbeChangeP4(v, a
10120 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 70 4b 65  ddr, (void *)pKe
10130 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
10140 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
10150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
10160 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
10170 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
10180 53 45 4c 45 43 54 3a 0a 20 20 20 20 64 65 66 61  SELECT:.    defa
10190 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
101a0 49 66 20 74 68 69 73 20 68 61 73 20 74 6f 20 62  If this has to b
101b0 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43  e a scalar SELEC
101c0 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64  T.  Generate cod
101d0 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20  e to put the.   
101e0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74     ** value of t
101f0 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20  his select in a 
10200 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
10210 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  record the numbe
10220 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  r.      ** of th
10230 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e  e memory cell in
10240 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66 20 74 68   iColumn.  If th
10250 69 73 20 69 73 20 61 6e 20 45 58 49 53 54 53 2c  is is an EXISTS,
10260 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
10270 61 6e 20 69 6e 74 65 67 65 72 20 30 20 28 6e 6f  an integer 0 (no
10280 74 20 65 78 69 73 74 73 29 20 6f 72 20 31 20 28  t exists) or 1 (
10290 65 78 69 73 74 73 29 20 69 6e 74 6f 20 61 20 6d  exists) into a m
102a0 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20 20 20 20  emory cell.     
102b0 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72 64 20 74   ** and record t
102c0 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
102d0 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20  in iColumn..    
102e0 20 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63    */.      Selec
102f0 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 20 20 20  t *pSel;        
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
10320 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64 65 20 2a  ment to encode *
10330 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  /.      SelectDe
10340 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 20 20  st dest;        
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10360 20 48 6f 77 20 74 6f 20 64 65 61 6c 20 77 69 74   How to deal wit
10370 68 20 53 45 4c 45 43 74 20 72 65 73 75 6c 74 20  h SELECt result 
10380 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61  */..      testca
10390 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
103a0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
103b0 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
103c0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
103d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
103e0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
103f0 45 58 49 53 54 53 20 7c 7c 20 70 45 78 70 72 2d  EXISTS || pExpr-
10400 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
10410 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
10420 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
10430 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
10440 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 70  lect) );.      p
10450 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  Sel = pExpr->x.p
10460 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 73 71  Select;.      sq
10470 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
10480 6e 69 74 28 26 64 65 73 74 2c 20 30 2c 20 2b 2b  nit(&dest, 0, ++
10490 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29 3b 0a 20  pParse->nMem);. 
104a0 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
104b0 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
104c0 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44  .        dest.eD
104d0 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20  est = SRT_Mem;. 
104e0 20 20 20 20 20 20 20 64 65 73 74 2e 69 53 64 73         dest.iSds
104f0 74 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  t = dest.iSDParm
10500 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10510 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10520 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65 73 74 2e  P_Null, 0, dest.
10530 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
10540 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10550 2c 20 22 49 6e 69 74 20 73 75 62 71 75 65 72 79  , "Init subquery
10560 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
10570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10580 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
10590 54 5f 45 78 69 73 74 73 3b 0a 20 20 20 20 20 20  T_Exists;.      
105a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
105b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
105c0 72 2c 20 30 2c 20 64 65 73 74 2e 69 53 44 50 61  r, 0, dest.iSDPa
105d0 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rm);.        Vdb
105e0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 49 6e  eComment((v, "In
105f0 69 74 20 45 58 49 53 54 53 20 72 65 73 75 6c 74  it EXISTS result
10600 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
10610 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
10620 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
10630 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74 29 3b 0a   pSel->pLimit);.
10640 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 4c 69 6d        pSel->pLim
10650 69 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  it = sqlite3PExp
10660 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54  r(pParse, TK_INT
10670 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20 20 20 20  EGER, 0, 0,.    
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
106a0 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
106b0 31 5d 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d  1]);.      pSel-
106c0 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
106d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
106e0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
106f0 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a 20 20 20  l, &dest) ){.   
10700 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
10710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 52 65       }.      rRe
10720 67 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d  g = dest.iSDParm
10730 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 56  ;.      ExprSetV
10740 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
10750 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
10760 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10770 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 48   }.  }..  if( rH
10780 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b 0a 20 20  asNullFlag ){.  
10790 20 20 73 71 6c 69 74 65 33 53 65 74 48 61 73 4e    sqlite3SetHasN
107a0 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45 78 70 72  ullFlag(v, pExpr
107b0 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61 73 4e 75  ->iTable, rHasNu
107c0 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a 0a 20 20  llFlag);.  }..  
107d0 69 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  if( jmpIfDynamic
107e0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
107f0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10800 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 29 3b  , jmpIfDynamic);
10810 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
10820 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
10830 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 52  e);..  return rR
10840 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  eg;.}.#endif /* 
10850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
10860 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  UERY */..#ifndef
10870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
10880 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
10890 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
108a0 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a   IN expression..
108b0 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20  **.**      x IN 
108c0 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 20  (SELECT ...).** 
108d0 20 20 20 20 20 78 20 49 4e 20 28 76 61 6c 75 65       x IN (value
108e0 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 0a 2a 2a  , value, ...).**
108f0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 68 61 6e  .** The left-han
10900 64 20 73 69 64 65 20 28 4c 48 53 29 20 69 73 20  d side (LHS) is 
10910 61 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73  a scalar express
10920 69 6f 6e 2e 20 20 54 68 65 20 72 69 67 68 74 2d  ion.  The right-
10930 68 61 6e 64 20 73 69 64 65 20 28 52 48 53 29 0a  hand side (RHS).
10940 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
10950 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 76  f zero or more v
10960 61 6c 75 65 73 2e 20 20 54 68 65 20 65 78 70 72  alues.  The expr
10970 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 69  ession is true i
10980 66 20 74 68 65 20 4c 48 53 20 69 73 0a 2a 2a 20  f the LHS is.** 
10990 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
109a0 20 74 68 65 20 52 48 53 2e 20 20 54 68 65 20 76   the RHS.  The v
109b0 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70 72  alue of the expr
109c0 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b 6e 6f 77  ession is unknow
109d0 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69 66 20 74  n (NULL).** if t
109e0 68 65 20 4c 48 53 20 69 73 20 4e 55 4c 4c 20 6f  he LHS is NULL o
109f0 72 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20  r if the LHS is 
10a00 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  not contained wi
10a10 74 68 69 6e 20 74 68 65 20 52 48 53 20 61 6e 64  thin the RHS and
10a20 20 74 68 65 0a 2a 2a 20 52 48 53 20 63 6f 6e 74   the.** RHS cont
10a30 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
10a40 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 2a 2a   NULL values..**
10a50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10a60 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
10a70 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20 64 65  that jumps to de
10a80 73 74 49 66 46 61 6c 73 65 20 69 66 20 74 68 65  stIfFalse if the
10a90 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a 2a 2a 20   LHS is not .** 
10aa0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
10ab0 20 74 68 65 20 52 48 53 2e 20 20 49 66 20 64 75   the RHS.  If du
10ac0 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65 20 63 61  e to NULLs we ca
10ad0 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e 65 20 69  nnot determine i
10ae0 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20 69 73 20  f the LHS.** is 
10af0 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
10b00 20 52 48 53 20 74 68 65 6e 20 6a 75 6d 70 20 74   RHS then jump t
10b10 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e 20 20 49  o destIfNull.  I
10b20 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
10b30 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  tained.** within
10b40 20 74 68 65 20 52 48 53 20 74 68 65 6e 20 66 61   the RHS then fa
10b50 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 73  ll through..*/.s
10b60 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
10b70 65 33 45 78 70 72 43 6f 64 65 49 4e 28 0a 20 20  e3ExprCodeIN(.  
10b80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10b90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
10ba0 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
10bb0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
10bc0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
10bd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49          /* The I
10be0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
10bf0 20 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73    int destIfFals
10c00 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  e,      /* Jump 
10c10 68 65 72 65 20 69 66 20 4c 48 53 20 69 73 20 6e  here if LHS is n
10c20 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ot contained in 
10c30 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74  the RHS */.  int
10c40 20 64 65 73 74 49 66 4e 75 6c 6c 20 20 20 20 20   destIfNull     
10c50 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
10c60 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
10c70 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75 65 20 74  re unknown due t
10c80 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b 0a 20 20  o NULLs */.){.  
10c90 69 6e 74 20 72 52 68 73 48 61 73 4e 75 6c 6c 20  int rRhsHasNull 
10ca0 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69 73 74 65  = 0;  /* Registe
10cb0 72 20 74 68 61 74 20 69 73 20 74 72 75 65 20 69  r that is true i
10cc0 66 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  f RHS contains N
10cd0 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ULL values */.  
10ce0 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 20 20  char affinity;  
10cf0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
10d00 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 74 6f 20  son affinity to 
10d10 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  use */.  int eTy
10d20 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
10d30 2a 20 54 79 70 65 20 6f 66 20 74 68 65 20 52 48  * Type of the RH
10d40 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31 3b 20 20  S */.  int r1;  
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d60 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
10d70 67 69 73 74 65 72 20 2a 2f 0a 20 20 56 64 62 65  gister */.  Vdbe
10d80 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
10d90 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75    /* Statement u
10da0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
10db0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  n */..  /* Compu
10dc0 74 65 20 74 68 65 20 52 48 53 2e 20 20 20 41 66  te the RHS.   Af
10dd0 74 65 72 20 74 68 69 73 20 73 74 65 70 2c 20 74  ter this step, t
10de0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 63 75  he table with cu
10df0 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78 70 72 2d  rsor.  ** pExpr-
10e00 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20 63 6f 6e  >iTable will con
10e10 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73  tains the values
10e20 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
10e30 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20 20 76 20  e RHS..  */.  v 
10e40 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
10e50 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10e60 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 4f 4d 20  );       /* OOM 
10e70 64 65 74 65 63 74 65 64 20 70 72 69 6f 72 20 74  detected prior t
10e80 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  o this routine *
10e90 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
10ea0 65 6e 74 28 28 76 2c 20 22 62 65 67 69 6e 20 49  ent((v, "begin I
10eb0 4e 20 65 78 70 72 22 29 29 3b 0a 20 20 65 54 79  N expr"));.  eTy
10ec0 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
10ed0 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
10ee0 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d      IN_INDEX_MEM
10f10 42 45 52 53 48 49 50 20 7c 20 49 4e 5f 49 4e 44  BERSHIP | IN_IND
10f20 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20 20 20 20  EX_NOOP_OK,.    
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 20 20 20 20 20 20 20 64 65 73 74 49 66 46           destIfF
10f50 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e 75 6c 6c  alse==destIfNull
10f60 20 3f 20 30 20 3a 20 26 72 52 68 73 48 61 73 4e   ? 0 : &rRhsHasN
10f70 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ull);..  /* Figu
10f80 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
10f90 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
10fa0 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
10fb0 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
10fc0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
10fd0 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20  on. affinityStr 
10fe0 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20  stores a static 
10ff0 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20  string suitable 
11000 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f 66 20 4f  for.  ** P4 of O
11010 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20  P_MakeRecord..  
11020 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79 20 3d 20  */.  affinity = 
11030 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
11040 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  ty(pExpr);..  /*
11050 20 43 6f 64 65 20 74 68 65 20 4c 48 53 2c 20 74   Code the LHS, t
11060 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22  he <expr> from "
11070 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
11080 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
11090 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
110a0 61 72 73 65 29 3b 0a 20 20 72 31 20 3d 20 73 71  arse);.  r1 = sq
110b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
110c0 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
110d0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
110e0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
110f0 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 73   r1);..  /* If s
11100 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65  qlite3FindInInde
11110 78 28 29 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  x() did not find
11120 20 6f 72 20 63 72 65 61 74 65 20 61 6e 20 69 6e   or create an in
11130 64 65 78 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  dex that is.  **
11140 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 65 76   suitable for ev
11150 61 6c 75 61 74 69 6e 67 20 74 68 65 20 49 4e 20  aluating the IN 
11160 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 65  operator, then e
11170 76 61 6c 75 61 74 65 20 75 73 69 6e 67 20 61 0a  valuate using a.
11180 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f 66    ** sequence of
11190 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 20 20   comparisons..  
111a0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
111b0 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 20 29 7b  IN_INDEX_NOOP ){
111c0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
111d0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
111e0 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f 6c 6c 53  pList;.    CollS
111f0 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
11200 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
11210 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
11220 65 66 74 29 3b 0a 20 20 20 20 69 6e 74 20 6c 61  eft);.    int la
11230 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74 65 33 56  belOk = sqlite3V
11240 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11250 0a 20 20 20 20 69 6e 74 20 72 32 2c 20 72 65 67  .    int r2, reg
11260 54 6f 46 72 65 65 3b 0a 20 20 20 20 69 6e 74 20  ToFree;.    int 
11270 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30 3b 0a 20  regCkNull = 0;. 
11280 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 61     int ii;.    a
11290 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
112a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
112b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
112c0 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
112d0 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll!=destIfFalse 
112e0 29 7b 0a 20 20 20 20 20 20 72 65 67 43 6b 4e 75  ){.      regCkNu
112f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ll = sqlite3GetT
11300 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
11310 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11320 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 42 69  eAddOp3(v, OP_Bi
11330 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c 20 72 65  tAnd, r1, r1, re
11340 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  gCkNull);.    }.
11350 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
11360 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
11370 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  i++){.      r2 =
11380 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11390 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 69  Temp(pParse, pLi
113a0 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c  st->a[ii].pExpr,
113b0 20 26 72 65 67 54 6f 46 72 65 65 29 3b 0a 20 20   &regToFree);.  
113c0 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75 6c      if( regCkNul
113d0 6c 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72  l && sqlite3Expr
113e0 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69 73 74 2d  CanBeNull(pList-
113f0 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b  >a[ii].pExpr) ){
11400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11410 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11420 5f 42 69 74 41 6e 64 2c 20 72 65 67 43 6b 4e 75  _BitAnd, regCkNu
11430 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b 4e 75 6c  ll, r2, regCkNul
11440 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
11450 20 20 69 66 28 20 69 69 3c 70 4c 69 73 74 2d 3e    if( ii<pList->
11460 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65 73 74 49  nExpr-1 || destI
11470 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
11480 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  se ){.        sq
11490 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
114a0 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c 20 6c 61  v, OP_Eq, r1, la
114b0 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20 20 20 20  belOk, r2,.     
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
114e0 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
114f0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
11500 72 61 67 65 49 66 28 76 2c 20 69 69 3c 70 4c 69  rageIf(v, ii<pLi
11510 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20  st->nExpr-1);.  
11520 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
11530 67 65 49 66 28 76 2c 20 69 69 3d 3d 70 4c 69 73  geIf(v, ii==pLis
11540 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 20 20 20  t->nExpr-1);.   
11550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11560 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66 69  ChangeP5(v, affi
11570 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  nity);.      }el
11580 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
11590 72 74 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  rt( destIfNull==
115a0 64 65 73 74 49 66 46 61 6c 73 65 20 29 3b 0a 20  destIfFalse );. 
115b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
115c0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4e  beAddOp4(v, OP_N
115d0 65 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c  e, r1, destIfFal
115e0 73 65 2c 20 72 32 2c 0a 20 20 20 20 20 20 20 20  se, r2,.        
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c 6c 2c 20    (void*)pColl, 
11610 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20 56 64 62  P4_COLLSEQ); Vdb
11620 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11640 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61 66 66  eChangeP5(v, aff
11650 69 6e 69 74 79 20 7c 20 53 51 4c 49 54 45 5f 4a  inity | SQLITE_J
11660 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
11670 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11680 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11690 70 50 61 72 73 65 2c 20 72 65 67 54 6f 46 72 65  pParse, regToFre
116a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
116b0 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29 7b 0a 20  ( regCkNull ){. 
116c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
116d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
116e0 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c 6c 2c 20  ull, regCkNull, 
116f0 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62  destIfNull); Vdb
11700 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
11710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11720 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
11730 2c 20 30 2c 20 64 65 73 74 49 66 46 61 6c 73 65  , 0, destIfFalse
11740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
11750 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11760 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 4f 6b 29  abel(v, labelOk)
11770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
11780 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11790 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a  se, regCkNull);.
117a0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
117b0 2f 2a 20 49 66 20 74 68 65 20 4c 48 53 20 69 73  /* If the LHS is
117c0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
117d0 72 65 73 75 6c 74 20 69 73 20 65 69 74 68 65 72  result is either
117e0 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c 4c 20 64   false or NULL d
117f0 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
11800 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 20 52  on whether the R
11810 48 53 20 69 73 20 65 6d 70 74 79 20 6f 72 20 6e  HS is empty or n
11820 6f 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  ot, respectively
11830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11840 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 6e 42   sqlite3ExprCanB
11850 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e 70 4c 65  eNull(pExpr->pLe
11860 66 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ft) ){.      if(
11870 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d 64 65 73   destIfNull==des
11880 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20  tIfFalse ){.    
11890 20 20 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20      /* Shortcut 
118a0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
118b0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 66 61  ase where the fa
118c0 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20 6f 75 74  lse and NULL out
118d0 63 6f 6d 65 73 20 61 72 65 0a 20 20 20 20 20 20  comes are.      
118e0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 2a    ** the same. *
118f0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
11900 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11910 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 64 65  P_IsNull, r1, de
11920 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64 62 65 43  stIfNull); VdbeC
11930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
11940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11950 20 69 6e 74 20 61 64 64 72 31 20 3d 20 73 71 6c   int addr1 = sql
11960 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11970 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 72 31  , OP_NotNull, r1
11980 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
11990 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
119a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
119b0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 45 78 70   OP_Rewind, pExp
119c0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
119d0 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
119e0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
119f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11a00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11a10 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
11a20 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  fNull);.        
11a30 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11a40 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
11a50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
11a60 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
11a70 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
11a80 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
11a90 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
11aa0 69 73 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  is the ROWID of 
11ab0 74 61 62 6c 65 20 62 2d 74 72 65 65 0a 20 20 20  table b-tree.   
11ac0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
11ad0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ae0 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
11af0 31 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b  1, destIfFalse);
11b00 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11b10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11b20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11b30 4e 6f 74 45 78 69 73 74 73 2c 20 70 45 78 70 72  NotExists, pExpr
11b40 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49 66  ->iTable, destIf
11b50 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  False, r1);.    
11b60 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11b70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11b80 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
11b90 61 73 65 2c 20 74 68 65 20 52 48 53 20 69 73 20  ase, the RHS is 
11ba0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
11bb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11bd0 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e 69 74 79  4(v, OP_Affinity
11be0 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26 61 66 66  , r1, 1, 0, &aff
11bf0 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 0a 20 20  inity, 1);.  .  
11c00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
11c10 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  t membership tes
11c20 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  t fails, then th
11c30 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
11c40 0a 20 20 20 20 20 20 2a 2a 20 22 78 20 49 4e 20  .      ** "x IN 
11c50 28 2e 2e 2e 29 22 20 65 78 70 72 65 73 73 69 6f  (...)" expressio
11c60 6e 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  n must be either
11c70 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49 66 20 74   0 or NULL. If t
11c80 68 65 20 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  he set.      ** 
11c90 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e 55 4c 4c  contains no NULL
11ca0 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
11cb0 65 20 72 65 73 75 6c 74 20 69 73 20 30 2e 20 49  e result is 0. I
11cc0 66 20 74 68 65 20 73 65 74 20 0a 20 20 20 20 20  f the set .     
11cd0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65   ** contains one
11ce0 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
11cf0 6c 75 65 73 2c 20 74 68 65 6e 20 74 68 65 20 72  lues, then the r
11d00 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 20  esult of the.   
11d10 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
11d20 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 20   is also NULL.. 
11d30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
11d40 73 65 72 74 28 20 64 65 73 74 49 66 46 61 6c 73  sert( destIfFals
11d50 65 21 3d 64 65 73 74 49 66 4e 75 6c 6c 20 7c 7c  e!=destIfNull ||
11d60 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20   rRhsHasNull==0 
11d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 52 68  );.      if( rRh
11d80 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  sHasNull==0 ){. 
11d90 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
11da0 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 69 74  ranch runs if it
11db0 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20 63 6f 6d   is known at com
11dc0 70 69 6c 65 20 74 69 6d 65 20 74 68 61 74 20 74  pile time that t
11dd0 68 65 20 52 48 53 0a 20 20 20 20 20 20 20 20 2a  he RHS.        *
11de0 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 61 69 6e  * cannot contain
11df0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 54 68   NULL values. Th
11e00 69 73 20 68 61 70 70 65 6e 73 20 61 73 20 74 68  is happens as th
11e10 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20  e result.       
11e20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54 20 4e 55   ** of a "NOT NU
11e30 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  LL" constraint i
11e40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
11e50 63 68 65 6d 61 2e 0a 20 20 20 20 20 20 20 20 2a  chema..        *
11e60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 6c 73  *.        ** Als
11e70 6f 20 72 75 6e 20 74 68 69 73 20 62 72 61 6e 63  o run this branc
11e80 68 20 69 66 20 4e 55 4c 4c 20 69 73 20 65 71 75  h if NULL is equ
11e90 69 76 61 6c 65 6e 74 20 74 6f 20 46 41 4c 53 45  ivalent to FALSE
11ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
11eb0 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  this particular 
11ec0 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20  IN operator..   
11ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11ee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11ef0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
11f00 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
11f10 6c 65 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  le, destIfFalse,
11f20 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20   r1, 1);.       
11f30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
11f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11f50 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
11f60 73 20 62 72 61 6e 63 68 2c 20 74 68 65 20 52 48  s branch, the RH
11f70 53 20 6f 66 20 74 68 65 20 49 4e 20 6d 69 67 68  S of the IN migh
11f80 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e 55 4c 4c  t contain a NULL
11f90 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
11fa0 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
11fb0 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65 20 52 48  a NULL on the RH
11fc0 53 20 6d 61 6b 65 73 20 61 20 64 69 66 66 65 72  S makes a differ
11fd0 65 6e 63 65 20 69 6e 20 74 68 65 0a 20 20 20 20  ence in the.    
11fe0 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d 65 2e 0a      ** outcome..
11ff0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12000 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 0a 20 20     int j1;.  .  
12010 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
12020 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
12030 68 65 20 4c 48 53 20 69 73 20 63 6f 6e 74 61 69  he LHS is contai
12040 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2e 20  ned in the RHS. 
12050 20 49 66 20 73 6f 2c 0a 20 20 20 20 20 20 20 20   If so,.        
12060 2a 2a 20 74 68 65 6e 20 74 68 65 20 61 6e 73 77  ** then the answ
12070 65 72 20 69 73 20 54 52 55 45 20 74 68 65 20 70  er is TRUE the p
12080 72 65 73 65 6e 63 65 20 6f 66 20 4e 55 4c 4c 73  resence of NULLs
12090 20 69 6e 20 74 68 65 20 52 48 53 20 64 6f 65 73   in the RHS does
120a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
120b0 6d 61 74 74 65 72 2e 20 20 49 66 20 74 68 65 20  matter.  If the 
120c0 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
120d0 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 2c  ined in the RHS,
120e0 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
120f0 20 20 2a 2a 20 61 6e 73 77 65 72 20 69 73 20 4e    ** answer is N
12100 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 63  ULL if the RHS c
12110 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 20 61 6e  ontains NULLs an
12120 64 20 74 68 65 20 61 6e 73 77 65 72 20 69 73 0a  d the answer is.
12130 20 20 20 20 20 20 20 20 2a 2a 20 46 41 4c 53 45          ** FALSE
12140 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20 4e   if the RHS is N
12150 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20 20 20 20  ULL-free..      
12160 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6a 31 20    */.        j1 
12170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12180 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
12190 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
121a0 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b 0a 20 20  e, 0, r1, 1);.  
121b0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
121c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
121d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
121e0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
121f0 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64 65 73 74  RhsHasNull, dest
12200 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
12210 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12230 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12240 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49  P_Goto, 0, destI
12250 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20  fFalse);.       
12260 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
12270 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
12280 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
12290 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
122a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
122b0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  1);.  sqlite3Exp
122c0 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65  rCachePop(pParse
122d0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
122e0 28 28 76 2c 20 22 65 6e 64 20 49 4e 20 65 78 70  ((v, "end IN exp
122f0 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  r"));.}.#endif /
12300 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
12310 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
12320 20 44 75 70 6c 69 63 61 74 65 20 61 6e 20 38 2d   Duplicate an 8-
12330 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74  byte value.*/.st
12340 61 74 69 63 20 63 68 61 72 20 2a 64 75 70 38 62  atic char *dup8b
12350 79 74 65 73 28 56 64 62 65 20 2a 76 2c 20 63 6f  ytes(Vdbe *v, co
12360 6e 73 74 20 63 68 61 72 20 2a 69 6e 29 7b 0a 20  nst char *in){. 
12370 20 63 68 61 72 20 2a 6f 75 74 20 3d 20 73 71 6c   char *out = sql
12380 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
12390 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29  sqlite3VdbeDb(v)
123a0 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  , 8);.  if( out 
123b0 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 6f 75  ){.    memcpy(ou
123c0 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20 7d 0a 20  t, in, 8);.  }. 
123d0 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a   return out;.}..
123e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
123f0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
12400 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  NT./*.** Generat
12410 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
12420 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
12430 68 65 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  he floating poin
12440 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65 73 63 72  t.** value descr
12450 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e 6e 2d 31  ibed by z[0..n-1
12460 5d 20 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20  ] into register 
12470 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iMem..**.** The 
12480 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69 6c 6c 20  z[] string will 
12490 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 62 65 20  probably not be 
124a0 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e  zero-terminated.
124b0 20 20 42 75 74 20 74 68 65 20 0a 2a 2a 20 7a 5b    But the .** z[
124c0 6e 5d 20 63 68 61 72 61 63 74 65 72 20 69 73 20  n] character is 
124d0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
124e0 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
124f0 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b 0a 2a 2a  does not look.**
12500 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e 74 69 6e   like the contin
12510 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 75  uation of the nu
12520 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
12530 76 6f 69 64 20 63 6f 64 65 52 65 61 6c 28 56 64  void codeReal(Vd
12540 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61  be *v, const cha
12550 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67 61 74 65  r *z, int negate
12560 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65 6d 29 7b  Flag, int iMem){
12570 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 7a 21  .  if( ALWAYS(z!
12580 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  =0) ){.    doubl
12590 65 20 76 61 6c 75 65 3b 0a 20 20 20 20 63 68 61  e value;.    cha
125a0 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71 6c 69 74  r *zV;.    sqlit
125b0 65 33 41 74 6f 46 28 7a 2c 20 26 76 61 6c 75 65  e3AtoF(z, &value
125c0 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
125d0 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
125e0 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  8);.    assert( 
125f0 21 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 76 61  !sqlite3IsNaN(va
12600 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68 65 20 6e  lue) ); /* The n
12610 65 77 20 41 74 6f 46 20 6e 65 76 65 72 20 72 65  ew AtoF never re
12620 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a 20 20 20  turns NaN */.   
12630 20 69 66 28 20 6e 65 67 61 74 65 46 6c 61 67 20   if( negateFlag 
12640 29 20 76 61 6c 75 65 20 3d 20 2d 76 61 6c 75 65  ) value = -value
12650 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75 70 38 62  ;.    zV = dup8b
12660 79 74 65 73 28 76 2c 20 28 63 68 61 72 2a 29 26  ytes(v, (char*)&
12670 76 61 6c 75 65 29 3b 0a 20 20 20 20 73 71 6c 69  value);.    sqli
12680 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12690 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 69 4d 65   OP_Real, 0, iMe
126a0 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 52 45 41  m, 0, zV, P4_REA
126b0 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  L);.  }.}.#endif
126c0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
126d0 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
126e0 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
126f0 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
12700 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
12710 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
12720 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
12730 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e  ** Expr.u.zToken
12740 20 69 73 20 61 6c 77 61 79 73 20 55 54 46 38 20   is always UTF8 
12750 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61  and zero-termina
12760 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
12770 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
12780 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
12790 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
127a0 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  negFlag, int iMe
127b0 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  m){.  Vdbe *v = 
127c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
127d0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
127e0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
127f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 70  ){.    int i = p
12800 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 3b 0a  Expr->u.iValue;.
12810 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
12820 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 67 46   );.    if( negF
12830 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b 0a 20 20  lag ) i = -i;.  
12840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12850 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
12860 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a 20 20 7d  r, i, iMem);.  }
12870 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
12880 0a 20 20 20 20 69 36 34 20 76 61 6c 75 65 3b 0a  .    i64 value;.
12890 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
128a0 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  z = pExpr->u.zTo
128b0 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ken;.    assert(
128c0 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20 63 20 3d   z!=0 );.    c =
128d0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
128e0 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c 75 65 29  ToI64(z, &value)
128f0 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 7c  ;.    if( c==0 |
12900 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65 67 46 6c  | (c==2 && negFl
12910 61 67 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ag) ){.      cha
12920 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20 69 66 28  r *zV;.      if(
12930 20 6e 65 67 46 6c 61 67 20 29 7b 20 76 61 6c 75   negFlag ){ valu
12940 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d 41 4c 4c  e = c==2 ? SMALL
12950 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d 76 61 6c  EST_INT64 : -val
12960 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a 56 20 3d  ue; }.      zV =
12970 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28 63   dup8bytes(v, (c
12980 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20  har*)&value);.  
12990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
129a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49 6e 74 36  ddOp4(v, OP_Int6
129b0 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a  4, 0, iMem, 0, z
129c0 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20  V, P4_INT64);.  
129d0 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
129e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
129f0 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20  TING_POINT.     
12a00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12a10 28 70 50 61 72 73 65 2c 20 22 6f 76 65 72 73 69  (pParse, "oversi
12a20 7a 65 64 20 69 6e 74 65 67 65 72 3a 20 25 73 25  zed integer: %s%
12a30 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f 20 22 2d  s", negFlag ? "-
12a40 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23 65 6c 73  " : "", z);.#els
12a50 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  e.#ifndef SQLITE
12a60 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54 45 47 45  _OMIT_HEX_INTEGE
12a70 52 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  R.      if( sqli
12a80 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 22  te3_strnicmp(z,"
12a90 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  0x",2)==0 ){.   
12aa0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
12ab0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 68 65  rMsg(pParse, "he
12ac0 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f 20 62 69  x literal too bi
12ad0 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  g: %s", z);.    
12ae0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
12af0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63       {.        c
12b00 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c 20 6e 65  odeReal(v, z, ne
12b10 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b 0a 20 20  gFlag, iMem);.  
12b20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12b30 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12b40 43 6c 65 61 72 20 61 20 63 61 63 68 65 20 65 6e  Clear a cache en
12b50 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  try..*/.static v
12b60 6f 69 64 20 63 61 63 68 65 45 6e 74 72 79 43 6c  oid cacheEntryCl
12b70 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
12b80 65 2c 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61  e, struct yColCa
12b90 63 68 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  che *p){.  if( p
12ba0 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a 20 20 20  ->tempReg ){.   
12bb0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65   if( pParse->nTe
12bc0 6d 70 52 65 67 3c 41 72 72 61 79 53 69 7a 65 28  mpReg<ArraySize(
12bd0 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67  pParse->aTempReg
12be0 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  ) ){.      pPars
12bf0 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72  e->aTempReg[pPar
12c00 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20  se->nTempReg++] 
12c10 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d  = p->iReg;.    }
12c20 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
12c30 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
12c40 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  ** Record in the
12c50 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 74 68   column cache th
12c60 61 74 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  at a particular 
12c70 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 0a 2a 2a  column from a.**
12c80 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
12c90 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
12ca0 20 70 61 72 74 69 63 75 6c 61 72 20 72 65 67 69   particular regi
12cb0 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ster..*/.void sq
12cc0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
12cd0 6f 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ore(Parse *pPars
12ce0 65 2c 20 69 6e 74 20 69 54 61 62 2c 20 69 6e 74  e, int iTab, int
12cf0 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52 65 67 29   iCol, int iReg)
12d00 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
12d10 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e 74 20 69   minLru;.  int i
12d20 64 78 4c 72 75 3b 0a 20 20 73 74 72 75 63 74 20  dxLru;.  struct 
12d30 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
12d40 20 61 73 73 65 72 74 28 20 69 52 65 67 3e 30 20   assert( iReg>0 
12d50 29 3b 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  );  /* Register 
12d60 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 77 61  numbers are alwa
12d70 79 73 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  ys positive */. 
12d80 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 2d   assert( iCol>=-
12d90 31 20 26 26 20 69 43 6f 6c 3c 33 32 37 36 38 20  1 && iCol<32768 
12da0 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65 20 63 6f  );  /* Finite co
12db0 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a  lumn numbers */.
12dc0 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45  .  /* The SQLITE
12dd0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 66 6c 61  _ColumnCache fla
12de0 67 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63  g disables the c
12df0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20 20 54 68  olumn cache.  Th
12e00 69 73 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20  is is used.  ** 
12e10 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
12e20 20 2d 20 74 6f 20 76 65 72 69 66 79 20 74 68 61   - to verify tha
12e30 74 20 53 51 4c 69 74 65 20 61 6c 77 61 79 73 20  t SQLite always 
12e40 67 65 74 73 20 74 68 65 20 73 61 6d 65 20 61 6e  gets the same an
12e50 73 77 65 72 0a 20 20 2a 2a 20 77 69 74 68 20 61  swer.  ** with a
12e60 6e 64 20 77 69 74 68 6f 75 74 20 74 68 65 20 63  nd without the c
12e70 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a  olumn cache..  *
12e80 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
12e90 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 70 50 61  tionDisabled(pPa
12ea0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
12eb0 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20 29 20 72  ColumnCache) ) r
12ec0 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 72  eturn;..  /* Fir
12ed0 73 74 20 72 65 70 6c 61 63 65 20 61 6e 79 20 65  st replace any e
12ee0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 2e 0a 20  xisting entry.. 
12ef0 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
12f00 79 2c 20 74 68 65 20 77 61 79 20 74 68 65 20 63  y, the way the c
12f10 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69 73 20 63  olumn cache is c
12f20 75 72 72 65 6e 74 6c 79 20 75 73 65 64 2c 20 77  urrently used, w
12f30 65 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  e are guaranteed
12f40 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f  .  ** that the o
12f50 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65 76 65 72  bject will never
12f60 20 61 6c 72 65 61 64 79 20 62 65 20 69 6e 20 63   already be in c
12f70 61 63 68 65 2e 20 20 56 65 72 69 66 79 20 74 68  ache.  Verify th
12f80 69 73 20 67 75 61 72 61 6e 74 65 65 2e 0a 20 20  is guarantee..  
12f90 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
12fa0 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  G.  for(i=0, p=p
12fb0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
12fc0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
12fd0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
12fe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
12ff0 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  >iReg==0 || p->i
13000 54 61 62 6c 65 21 3d 69 54 61 62 20 7c 7c 20 70  Table!=iTab || p
13010 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 20  ->iColumn!=iCol 
13020 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13030 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65 6d 70 74   /* Find an empt
13040 79 20 73 6c 6f 74 20 61 6e 64 20 72 65 70 6c 61  y slot and repla
13050 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f 72 28 69  ce it */.  for(i
13060 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13070 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
13080 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
13090 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
130a0 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29 7b 0a 20   p->iReg==0 ){. 
130b0 20 20 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d       p->iLevel =
130c0 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
130d0 65 76 65 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 69  evel;.      p->i
130e0 54 61 62 6c 65 20 3d 20 69 54 61 62 3b 0a 20 20  Table = iTab;.  
130f0 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
13100 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e   iCol;.      p->
13110 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 20  iReg = iReg;.   
13120 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20     p->tempReg = 
13130 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c 72 75 20  0;.      p->lru 
13140 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
13150 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Cnt++;.      ret
13160 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
13170 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
13180 20 6c 61 73 74 20 72 65 63 65 6e 74 6c 79 20 75   last recently u
13190 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c 72 75 20  sed */.  minLru 
131a0 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
131b0 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a 20 20 66  idxLru = -1;.  f
131c0 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
131d0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
131e0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
131f0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13200 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d 69 6e 4c   if( p->lru<minL
13210 72 75 20 29 7b 0a 20 20 20 20 20 20 69 64 78 4c  ru ){.      idxL
13220 72 75 20 3d 20 69 3b 0a 20 20 20 20 20 20 6d 69  ru = i;.      mi
13230 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75 3b 0a 20  nLru = p->lru;. 
13240 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 41     }.  }.  if( A
13250 4c 57 41 59 53 28 69 64 78 4c 72 75 3e 3d 30 29  LWAYS(idxLru>=0)
13260 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61   ){.    p = &pPa
13270 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 5b 69  rse->aColCache[i
13280 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70 2d 3e 69  dxLru];.    p->i
13290 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
132a0 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
132b0 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61   p->iTable = iTa
132c0 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  b;.    p->iColum
132d0 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = iCol;.    p-
132e0 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  >iReg = iReg;.  
132f0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
13300 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70  ;.    p->lru = p
13310 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
13320 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
13330 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64    }.}../*.** Ind
13340 69 63 61 74 65 20 74 68 61 74 20 72 65 67 69 73  icate that regis
13350 74 65 72 73 20 62 65 74 77 65 65 6e 20 69 52 65  ters between iRe
13360 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d 31 20 61  g..iReg+nReg-1 a
13370 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  re being overwri
13380 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67 65 20 74  tten..** Purge t
13390 68 65 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69  he range of regi
133a0 73 74 65 72 73 20 66 72 6f 6d 20 74 68 65 20 63  sters from the c
133b0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2f 0a  olumn cache..*/.
133c0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
133d0 43 61 63 68 65 52 65 6d 6f 76 65 28 50 61 72 73  CacheRemove(Pars
133e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
133f0 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  Reg, int nReg){.
13400 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
13410 4c 61 73 74 20 3d 20 69 52 65 67 20 2b 20 6e 52  Last = iReg + nR
13420 65 67 20 2d 20 31 3b 0a 20 20 73 74 72 75 63 74  eg - 1;.  struct
13430 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20   yColCache *p;. 
13440 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
13450 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
13460 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
13470 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
13480 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52     int r = p->iR
13490 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69  eg;.    if( r>=i
134a0 52 65 67 20 26 26 20 72 3c 3d 69 4c 61 73 74 20  Reg && r<=iLast 
134b0 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e  ){.      cacheEn
134c0 74 72 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c  tryClear(pParse,
134d0 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52   p);.      p->iR
134e0 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  eg = 0;.    }.  
134f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  }.}../*.** Remem
13500 62 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ber the current 
13510 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 63 6f 6e  column cache con
13520 74 65 78 74 2e 20 20 41 6e 79 20 6e 65 77 20 65  text.  Any new e
13530 6e 74 72 69 65 73 20 61 64 64 65 64 0a 2a 2a 20  ntries added.** 
13540 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 6f 6c  added to the col
13550 75 6d 6e 20 63 61 63 68 65 20 61 66 74 65 72 20  umn cache after 
13560 74 68 69 73 20 63 61 6c 6c 20 61 72 65 20 72 65  this call are re
13570 6d 6f 76 65 64 20 77 68 65 6e 20 74 68 65 0a 2a  moved when the.*
13580 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
13590 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  pop occurs..*/.v
135a0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
135b0 61 63 68 65 50 75 73 68 28 50 61 72 73 65 20 2a  achePush(Parse *
135c0 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
135d0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2b 2b  e->iCacheLevel++
135e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
135f0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
13600 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
13610 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
13620 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
13630 6e 74 66 28 22 50 55 53 48 20 74 6f 20 25 64 5c  ntf("PUSH to %d\
13640 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61 63  n", pParse->iCac
13650 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23 65  heLevel);.  }.#e
13660 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
13670 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  move from the co
13680 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e 79 20 65  lumn cache any e
13690 6e 74 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ntries that were
136a0 20 61 64 64 65 64 20 73 69 6e 63 65 20 74 68 65   added since the
136b0 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73  .** the previous
136c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
136d0 65 50 75 73 68 20 6f 70 65 72 61 74 69 6f 6e 2e  ePush operation.
136e0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
136f0 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20 74 68 65  , restore.** the
13700 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 73 74   cache to the st
13710 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 70 72  ate it was in pr
13720 69 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ior the most rec
13730 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a 76 6f 69  ent Push..*/.voi
13740 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63  d sqlite3ExprCac
13750 68 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61  hePop(Parse *pPa
13760 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rse){.  int i;. 
13770 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13780 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  e *p;.  assert( 
13790 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
137a0 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70 50 61 72  vel>=1 );.  pPar
137b0 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 2d  se->iCacheLevel-
137c0 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  -;.#ifdef SQLITE
137d0 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61  _DEBUG.  if( pPa
137e0 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
137f0 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
13800 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72  pTrace ){.    pr
13810 69 6e 74 66 28 22 50 4f 50 20 20 74 6f 20 25 64  intf("POP  to %d
13820 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69 43 61  \n", pParse->iCa
13830 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 23  cheLevel);.  }.#
13840 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 2c  endif.  for(i=0,
13850 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13860 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13870 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13880 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  p++){.    if( p-
13890 3e 69 52 65 67 20 26 26 20 70 2d 3e 69 4c 65 76  >iReg && p->iLev
138a0 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
138b0 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20  eLevel ){.      
138c0 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
138d0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
138e0 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
138f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13900 2a 20 57 68 65 6e 20 61 20 63 61 63 68 65 64 20  * When a cached 
13910 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75 73 65 64  column is reused
13920 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
13930 20 69 74 73 20 72 65 67 69 73 74 65 72 20 69 73   its register is
13940 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 76  .** no longer av
13950 61 69 6c 61 62 6c 65 20 61 73 20 61 20 74 65 6d  ailable as a tem
13960 70 20 72 65 67 69 73 74 65 72 2e 20 20 74 69 63  p register.  tic
13970 6b 65 74 20 23 33 38 37 39 3a 20 20 74 68 61 74  ket #3879:  that
13980 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69 73 74 65   same.** registe
13990 72 20 6d 69 67 68 74 20 62 65 20 69 6e 20 74 68  r might be in th
139a0 65 20 63 61 63 68 65 20 69 6e 20 6d 75 6c 74 69  e cache in multi
139b0 70 6c 65 20 70 6c 61 63 65 73 2c 20 73 6f 20 62  ple places, so b
139c0 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20 67 65 74  e sure to.** get
139d0 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f 0a 73 74   them all..*/.st
139e0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
139f0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
13a00 69 73 74 65 72 28 50 61 72 73 65 20 2a 70 50 61  ister(Parse *pPa
13a10 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
13a20 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
13a30 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
13a40 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
13a50 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
13a60 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
13a70 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
13a80 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
13a90 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20 70  =iReg ){.      p
13aa0 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  ->tempReg = 0;. 
13ab0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13ac0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
13ad0 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
13ae0 61 6c 75 65 20 6f 66 20 74 68 65 20 69 43 6f 6c  alue of the iCol
13af0 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  -th column of a 
13b00 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
13b10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
13b20 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 0a  tColumnOfTable(.
13b30 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
13b40 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 75 6e    /* The VDBE un
13b50 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
13b60 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
13b70 62 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62  b,    /* The tab
13b80 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
13b90 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
13ba0 20 69 54 61 62 43 75 72 2c 20 20 20 20 2f 2a 20   iTabCur,    /* 
13bb0 54 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72  The table cursor
13bc0 2e 20 20 4f 72 20 74 68 65 20 50 4b 20 63 75 72  .  Or the PK cur
13bd0 73 6f 72 20 66 6f 72 20 57 49 54 48 4f 55 54 20  sor for WITHOUT 
13be0 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e 74 20 69  ROWID */.  int i
13bf0 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e  Col,       /* In
13c00 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
13c10 6e 20 74 6f 20 65 78 74 72 61 63 74 20 2a 2f 0a  n to extract */.
13c20 20 20 69 6e 74 20 72 65 67 4f 75 74 20 20 20 20    int regOut    
13c30 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
13c40 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 69 73   value into this
13c50 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a   register */.){.
13c60 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
13c70 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
13c80 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
13c90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13ca0 5f 52 6f 77 69 64 2c 20 69 54 61 62 43 75 72 2c  _Rowid, iTabCur,
13cb0 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 65 6c 73   regOut);.  }els
13cc0 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  e{.    int op = 
13cd0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
13ce0 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20 3a 20 4f  ? OP_VColumn : O
13cf0 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e  P_Column;.    in
13d00 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  t x = iCol;.    
13d10 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
13d20 61 62 29 20 29 7b 0a 20 20 20 20 20 20 78 20 3d  ab) ){.      x =
13d30 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
13d40 49 6e 64 65 78 28 73 71 6c 69 74 65 33 50 72 69  Index(sqlite3Pri
13d50 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
13d60 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d  b), iCol);.    }
13d70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13d80 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 54  AddOp3(v, op, iT
13d90 61 62 43 75 72 2c 20 78 2c 20 72 65 67 4f 75 74  abCur, x, regOut
13da0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
13db0 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  l>=0 ){.    sqli
13dc0 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61 75 6c 74  te3ColumnDefault
13dd0 28 76 2c 20 70 54 61 62 2c 20 69 43 6f 6c 2c 20  (v, pTab, iCol, 
13de0 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  regOut);.  }.}..
13df0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
13e00 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 78  ode that will ex
13e10 74 72 61 63 74 20 74 68 65 20 69 43 6f 6c 75 6d  tract the iColum
13e20 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  n-th column from
13e30 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61 62 20 61  .** table pTab a
13e40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c  nd store the col
13e50 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 61 20 72  umn value in a r
13e60 65 67 69 73 74 65 72 2e 20 20 41 6e 20 65 66 66  egister.  An eff
13e70 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  ort.** is made t
13e80 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6c 75  o store the colu
13e90 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72 65 67 69  mn value in regi
13ea0 73 74 65 72 20 69 52 65 67 2c 20 62 75 74 20 74  ster iReg, but t
13eb0 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74 20 67 75  his is.** not gu
13ec0 61 72 61 6e 74 65 65 64 2e 20 20 54 68 65 20 6c  aranteed.  The l
13ed0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ocation of the c
13ee0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 72  olumn value is r
13ef0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
13f00 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
13f10 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 6f 20 70  open cursor to p
13f20 54 61 62 20 69 6e 20 69 54 61 62 6c 65 20 77 68  Tab in iTable wh
13f30 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
13f40 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  ** is called.  I
13f50 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74 68 65 6e  f iColumn<0 then
13f60 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
13f70 65 64 20 74 68 61 74 20 65 78 74 72 61 63 74 73  ed that extracts
13f80 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69   the rowid..*/.i
13f90 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
13fa0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a 20 20 50  deGetColumn(.  P
13fb0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13fc0 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
13fd0 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
13fe0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
13ff0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
14000 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
14010 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
14020 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 2a 2f 0a  reading from */.
14030 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
14040 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
14050 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  he table column 
14060 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
14080 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
14090 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  the table */.  i
140a0 6e 74 20 69 52 65 67 2c 20 20 20 20 20 20 20 20  nt iReg,        
140b0 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73  /* Store results
140c0 20 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 70 35   here */.  u8 p5
140d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
140e0 35 20 76 61 6c 75 65 20 66 6f 72 20 4f 50 5f 43  5 value for OP_C
140f0 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64  olumn */.){.  Vd
14100 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
14110 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
14120 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
14130 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  he *p;..  for(i=
14140 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f  0, p=pParse->aCo
14150 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45  lCache; i<SQLITE
14160 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b  _N_COLCACHE; i++
14170 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , p++){.    if( 
14180 70 2d 3e 69 52 65 67 3e 30 20 26 26 20 70 2d 3e  p->iReg>0 && p->
14190 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
141a0 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 69 43  & p->iColumn==iC
141b0 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70  olumn ){.      p
141c0 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e  ->lru = pParse->
141d0 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20  iCacheCnt++;.   
141e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
141f0 63 68 65 50 69 6e 52 65 67 69 73 74 65 72 28 70  chePinRegister(p
14200 50 61 72 73 65 2c 20 70 2d 3e 69 52 65 67 29 3b  Parse, p->iReg);
14210 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
14220 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  >iReg;.    }.  }
14230 20 20 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d    .  assert( v!=
14240 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
14250 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f  prCodeGetColumnO
14260 66 54 61 62 6c 65 28 76 2c 20 70 54 61 62 2c 20  fTable(v, pTab, 
14270 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d 6e 2c  iTable, iColumn,
14280 20 69 52 65 67 29 3b 0a 20 20 69 66 28 20 70 35   iReg);.  if( p5
14290 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
142a0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
142b0 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 20 0a  5);.  }else{   .
142c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
142d0 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
142e0 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75 6d  , iTable, iColum
142f0 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d 0a 20 20  n, iReg);.  }.  
14300 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
14310 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20  /*.** Clear all 
14320 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 65 6e 74  column cache ent
14330 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ries..*/.void sq
14340 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
14350 65 61 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  ear(Parse *pPars
14360 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  e){.  int i;.  s
14370 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20  truct yColCache 
14380 2a 70 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p;..#if SQLITE_
14390 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 72  DEBUG.  if( pPar
143a0 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
143b0 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
143c0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
143d0 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22 29 3b 0a  ntf("CLEAR\n");.
143e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
143f0 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14400 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14410 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
14420 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
14430 66 28 20 70 2d 3e 69 52 65 67 20 29 7b 0a 20 20  f( p->iReg ){.  
14440 20 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c      cacheEntryCl
14450 65 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ear(pParse, p);.
14460 20 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20        p->iReg = 
14470 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
14480 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
14490 20 66 61 63 74 20 74 68 61 74 20 61 6e 20 61 66   fact that an af
144a0 66 69 6e 69 74 79 20 63 68 61 6e 67 65 20 68 61  finity change ha
144b0 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 69 43  s occurred on iC
144c0 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73 74 65 72  ount.** register
144d0 73 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  s starting with 
144e0 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20  iStart..*/.void 
144f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14500 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 50  AffinityChange(P
14510 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14520 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 43  t iStart, int iC
14530 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  ount){.  sqlite3
14540 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
14550 70 50 61 72 73 65 2c 20 69 53 74 61 72 74 2c 20  pParse, iStart, 
14560 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCount);.}../*.*
14570 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14580 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65 6e 74 20  to move content 
14590 66 72 6f 6d 20 72 65 67 69 73 74 65 72 73 20 69  from registers i
145a0 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b 6e 52 65  From...iFrom+nRe
145b0 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74 6f 20 69  g-1.** over to i
145c0 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d 31 2e 20  To..iTo+nReg-1. 
145d0 4b 65 65 70 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Keep the column 
145e0 63 61 63 68 65 20 75 70 2d 74 6f 2d 64 61 74 65  cache up-to-date
145f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14600 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 50 61  3ExprCodeMove(Pa
14610 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14620 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 2c   iFrom, int iTo,
14630 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20 20 61 73   int nReg){.  as
14640 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d 69 54 6f  sert( iFrom>=iTo
14650 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f 6d 2b 6e  +nReg || iFrom+n
14660 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20 20 73 71  Reg<=iTo );.  sq
14670 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14680 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
14690 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d 2c 20 69  P_Move, iFrom, i
146a0 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20 73 71 6c  To, nReg);.  sql
146b0 69 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d  ite3ExprCacheRem
146c0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 46 72 6f  ove(pParse, iFro
146d0 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a 23 69 66  m, nReg);.}..#if
146e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
146f0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
14700 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
14710 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
14720 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
14730 20 72 65 67 69 73 74 65 72 20 69 6e 20 74 68 65   register in the
14740 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e 2e 69 54   range iFrom..iT
14750 6f 20 28 69 6e 63 6c 75 73 69 76 65 29 0a 2a 2a  o (inclusive).**
14760 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
14770 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   of the column c
14780 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
14790 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
147a0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
147b0 20 61 6e 64 20 74 65 73 74 63 61 73 65 28 29 20   and testcase() 
147c0 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a 2a 20 61  macros only.** a
147d0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61 70 70 65  nd does not appe
147e0 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20 62  ar in a normal b
147f0 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
14800 69 6e 74 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e  int usedAsColumn
14810 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50 61  Cache(Parse *pPa
14820 72 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  rse, int iFrom, 
14830 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69 6e 74 20  int iTo){.  int 
14840 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
14850 43 61 63 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28  Cache *p;.  for(
14860 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61  i=0, p=pParse->a
14870 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49  ColCache; i<SQLI
14880 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69  TE_N_COLCACHE; i
14890 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  ++, p++){.    in
148a0 74 20 72 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20  t r = p->iReg;. 
148b0 20 20 20 69 66 28 20 72 3e 3d 69 46 72 6f 6d 20     if( r>=iFrom 
148c0 26 26 20 72 3c 3d 69 54 6f 20 29 20 72 65 74 75  && r<=iTo ) retu
148d0 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f 5f 54 45  rn 1;    /*NO_TE
148e0 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ST*/.  }.  retur
148f0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
14900 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 7c 7c   SQLITE_DEBUG ||
14910 20 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45   SQLITE_COVERAGE
14920 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _TEST */../*.** 
14930 43 6f 6e 76 65 72 74 20 61 6e 20 65 78 70 72 65  Convert an expre
14940 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f 20 61 20  ssion node to a 
14950 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a 2f 0a 73  TK_REGISTER.*/.s
14960 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 54  tatic void exprT
14970 6f 52 65 67 69 73 74 65 72 28 45 78 70 72 20 2a  oRegister(Expr *
14980 70 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  p, int iReg){.  
14990 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f 70 3b 0a  p->op2 = p->op;.
149a0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47    p->op = TK_REG
149b0 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69 54 61 62  ISTER;.  p->iTab
149c0 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20 45 78 70  le = iReg;.  Exp
149d0 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
149e0 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d 0a 0a 2f  , EP_Skip);.}../
149f0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14a00 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
14a10 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
14a20 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
14a30 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 41  * expression.  A
14a40 74 74 65 6d 70 74 20 74 6f 20 73 74 6f 72 65 20  ttempt to store 
14a50 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 72  the results in r
14a60 65 67 69 73 74 65 72 20 22 74 61 72 67 65 74 22  egister "target"
14a70 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
14a80 72 65 67 69 73 74 65 72 20 77 68 65 72 65 20 72  register where r
14a90 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
14aa0 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68  d..**.** With th
14ab0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 72  is routine, ther
14ac0 65 20 69 73 20 6e 6f 20 67 75 61 72 61 6e 74 65  e is no guarante
14ad0 65 20 74 68 61 74 20 72 65 73 75 6c 74 73 20 77  e that results w
14ae0 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f 72 65 64  ill.** be stored
14af0 20 69 6e 20 74 61 72 67 65 74 2e 20 20 54 68 65   in target.  The
14b00 20 72 65 73 75 6c 74 20 6d 69 67 68 74 20 62 65   result might be
14b10 20 73 74 6f 72 65 64 20 69 6e 20 73 6f 6d 65 20   stored in some 
14b20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69 73 74 65  other.** registe
14b30 72 20 69 66 20 69 74 20 69 73 20 63 6f 6e 76 65  r if it is conve
14b40 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73 6f 2e 20  nient to do so. 
14b50 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
14b60 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 63 68  ction.** must ch
14b70 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 63  eck the return c
14b80 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ode and move the
14b90 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
14ba0 64 65 73 69 72 65 64 0a 2a 2a 20 72 65 67 69 73  desired.** regis
14bb0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
14bc0 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65  te3ExprCodeTarge
14bd0 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
14be0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
14bf0 74 20 74 61 72 67 65 74 29 7b 0a 20 20 56 64 62  t target){.  Vdb
14c00 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
14c10 56 64 62 65 3b 20 20 2f 2a 20 54 68 65 20 56 4d  Vdbe;  /* The VM
14c20 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14c30 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ion */.  int op;
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
14c60 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
14c70 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 74 61    int inReg = ta
14c80 72 67 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  rget;       /* R
14c90 65 73 75 6c 74 73 20 73 74 6f 72 65 64 20 69 6e  esults stored in
14ca0 20 72 65 67 69 73 74 65 72 20 69 6e 52 65 67 20   register inReg 
14cb0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  */.  int regFree
14cc0 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  1 = 0;         /
14cd0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72  * If non-zero fr
14ce0 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  ee this temporar
14cf0 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  y register */.  
14d00 69 6e 74 20 72 65 67 46 72 65 65 32 20 3d 20 30  int regFree2 = 0
14d10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ;         /* If 
14d20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65 20 74 68  non-zero free th
14d30 69 73 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  is temporary reg
14d40 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
14d50 31 2c 20 72 32 2c 20 72 33 2c 20 72 34 3b 20 20  1, r2, r3, r4;  
14d60 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
14d70 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
14d80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
14d90 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
14da0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
14db0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14dc0 45 78 70 72 20 74 65 6d 70 58 3b 20 20 20 20 20  Expr tempX;     
14dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
14de0 70 6f 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  porary expressio
14df0 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n node */..  ass
14e00 65 72 74 28 20 74 61 72 67 65 74 3e 30 20 26 26  ert( target>0 &&
14e10 20 74 61 72 67 65 74 3c 3d 70 50 61 72 73 65 2d   target<=pParse-
14e20 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66 28 20 76  >nMem );.  if( v
14e30 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
14e40 74 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  t( pParse->db->m
14e50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
14e60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14e70 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ..  if( pExpr==0
14e80 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54 4b 5f   ){.    op = TK_
14e90 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NULL;.  }else{. 
14ea0 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f     op = pExpr->o
14eb0 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  p;.  }.  switch(
14ec0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
14ed0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 20 7b  TK_AGG_COLUMN: {
14ee0 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20 2a  .      AggInfo *
14ef0 70 41 67 67 49 6e 66 6f 20 3d 20 70 45 78 70 72  pAggInfo = pExpr
14f00 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  ->pAggInfo;.    
14f10 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
14f20 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 70 41  _col *pCol = &pA
14f30 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 70 45 78  ggInfo->aCol[pEx
14f40 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20 20 20 20  pr->iAgg];.     
14f50 20 69 66 28 20 21 70 41 67 67 49 6e 66 6f 2d 3e   if( !pAggInfo->
14f60 64 69 72 65 63 74 4d 6f 64 65 20 29 7b 0a 20 20  directMode ){.  
14f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
14f80 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b 0a 20 20  ol->iMem>0 );.  
14f90 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 43        inReg = pC
14fa0 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  ol->iMem;.      
14fb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14fc0 65 6c 73 65 20 69 66 28 20 70 41 67 67 49 6e 66  else if( pAggInf
14fd0 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  o->useSortingIdx
14fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14ff0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15000 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 41 67 67   OP_Column, pAgg
15010 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67 49 64 78  Info->sortingIdx
15020 50 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  PTab,.          
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
15050 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29  rColumn, target)
15060 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
15080 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61 6c  * Otherwise, fal
15090 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
150a0 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73 65 20 2a  TK_COLUMN case *
150b0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
150c0 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
150d0 20 20 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70      int iTab = p
150e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
150f0 20 20 20 20 69 66 28 20 69 54 61 62 3c 30 20 29      if( iTab<0 )
15100 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
15110 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e 30 20 29  arse->ckBase>0 )
15120 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  {.          /* G
15130 65 6e 65 72 61 74 69 6e 67 20 43 48 45 43 4b 20  enerating CHECK 
15140 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 69  constraints or i
15150 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 70 61  nserting into pa
15160 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 20  rtial index */. 
15170 20 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d           inReg =
15180 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
15190 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65  + pParse->ckBase
151a0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
151b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
151c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
151d0 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20 61 20 70  eleting from a p
151e0 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a 2f 0a  artial index */.
151f0 20 20 20 20 20 20 20 20 20 20 69 54 61 62 20 3d            iTab =
15200 20 70 50 61 72 73 65 2d 3e 69 50 61 72 74 49 64   pParse->iPartId
15210 78 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xTab;.        }.
15220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 6e        }.      in
15230 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
15240 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70  rCodeGetColumn(p
15250 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 54  Parse, pExpr->pT
15260 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab,.            
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
15290 6e 2c 20 69 54 61 62 2c 20 74 61 72 67 65 74 2c  n, iTab, target,
152a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a 20 20 20  pExpr->op2);.   
152d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
152e0 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
152f0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f 64  GER: {.      cod
15300 65 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2c  eInteger(pParse,
15310 20 70 45 78 70 72 2c 20 30 2c 20 74 61 72 67 65   pExpr, 0, targe
15320 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
15330 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
15340 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
15350 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
15360 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
15370 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
15380 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15390 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
153a0 29 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 52  ) );.      codeR
153b0 65 61 6c 28 76 2c 20 70 45 78 70 72 2d 3e 75 2e  eal(v, pExpr->u.
153c0 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61 72 67 65  zToken, 0, targe
153d0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
153e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
153f0 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
15400 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
15410 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
15420 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74  ty(pExpr, EP_Int
15430 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
15440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15450 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(v, OP_String8,
15460 20 30 2c 20 74 61 72 67 65 74 2c 20 30 2c 20 70   0, target, 0, p
15470 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
15480 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
15490 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
154a0 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
154b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
154c0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
154d0 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
154e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
154f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15500 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20  T_BLOB_LITERAL. 
15510 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
15520 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a   {.      int n;.
15530 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15540 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   *z;.      char 
15550 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20 20 61 73  *zBlob;.      as
15560 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
15570 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
15580 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
15590 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
155a0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  r->u.zToken[0]==
155b0 27 78 27 20 7c 7c 20 70 45 78 70 72 2d 3e 75 2e  'x' || pExpr->u.
155c0 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58 27 20 29  zToken[0]=='X' )
155d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
155e0 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
155f0 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  1]=='\'' );.    
15600 20 20 7a 20 3d 20 26 70 45 78 70 72 2d 3e 75 2e    z = &pExpr->u.
15610 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20 20 20 20  zToken[2];.     
15620 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
15630 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a 20 20 20  en30(z) - 1;.   
15640 20 20 20 61 73 73 65 72 74 28 20 7a 5b 6e 5d 3d     assert( z[n]=
15650 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20 20 20 7a  ='\'' );.      z
15660 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 48 65  Blob = sqlite3He
15670 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74 65 33 56  xToBlob(sqlite3V
15680 64 62 65 44 62 28 76 29 2c 20 7a 2c 20 6e 29 3b  dbeDb(v), z, n);
15690 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
156a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42  beAddOp4(v, OP_B
156b0 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72 67 65 74  lob, n/2, target
156c0 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50 34 5f 44  , 0, zBlob, P4_D
156d0 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 62  YNAMIC);.      b
156e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
156f0 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56  if.    case TK_V
15700 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
15710 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15720 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15730 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
15740 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15750 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
15760 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
15770 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
15780 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  en[0]!=0 );.    
15790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
157a0 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72 69 61 62  Op2(v, OP_Variab
157b0 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
157c0 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  mn, target);.   
157d0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 75 2e     if( pExpr->u.
157e0 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20 29 7b 0a  zToken[1]!=0 ){.
157f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15800 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  pExpr->u.zToken[
15810 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20 20 20 20  0]=='?' .       
15820 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
15830 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
15840 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70   pParse->azVar[p
15850 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d  Expr->iColumn-1]
15860 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
15870 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
15880 65 50 34 28 76 2c 20 2d 31 2c 20 70 50 61 72 73  eP4(v, -1, pPars
15890 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e  e->azVar[pExpr->
158a0 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50 34 5f 53  iColumn-1], P4_S
158b0 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7d 0a  TATIC);.      }.
158c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
158d0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
158e0 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
158f0 20 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e   inReg = pExpr->
15900 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 62 72  iTable;.      br
15910 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
15920 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20  ase TK_AS: {.   
15930 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
15940 65 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74  e3ExprCodeTarget
15950 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15960 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a  pLeft, target);.
15970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15980 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
15990 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20  E_OMIT_CAST.    
159a0 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a  case TK_CAST: {.
159b0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
159c0 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ions of the form
159d0 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41  :   CAST(pLeft A
159e0 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20  S token) */.    
159f0 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65    inReg = sqlite
15a00 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
15a10 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
15a20 4c 65 66 74 2c 20 74 61 72 67 65 74 29 3b 0a 20  Left, target);. 
15a30 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d       if( inReg!=
15a40 74 61 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20  target ){.      
15a50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15a60 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
15a70 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29 3b   inReg, target);
15a80 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
15a90 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 7d   target;.      }
15aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15ab0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
15ac0 61 73 74 2c 20 74 61 72 67 65 74 2c 0a 20 20 20  ast, target,.   
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 20 20 73 71 6c 69 74 65 33 41 66 66 69       sqlite3Affi
15af0 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e  nityType(pExpr->
15b00 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20  u.zToken, 0));. 
15b10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 75       testcase( u
15b20 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
15b30 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20  (pParse, inReg, 
15b40 69 6e 52 65 67 29 20 29 3b 0a 20 20 20 20 20 20  inReg) );.      
15b50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15b60 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
15b70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c 20 31 29  Parse, inReg, 1)
15b80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15b90 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
15ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 20  QLITE_OMIT_CAST 
15bb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  */.    case TK_L
15bc0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
15bd0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
15be0 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
15bf0 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
15c00 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
15c10 51 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  Q: {.      r1 = 
15c20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
15c30 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
15c40 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
15c50 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
15c60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15c70 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
15c80 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
15c90 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
15ca0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
15cb0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
15cc0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
15cd0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
15ce0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52       r1, r2, inR
15cf0 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  eg, SQLITE_STORE
15d00 50 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  P2);.      asser
15d10 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b  t(TK_LT==OP_Lt);
15d20 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
15d30 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Lt); VdbeCovera
15d40 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74  geIf(v,op==OP_Lt
15d50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15d60 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74  TK_LE==OP_Le); t
15d70 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
15d80 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
15d90 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b  If(v,op==OP_Le);
15da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
15db0 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73  _GT==OP_Gt); tes
15dc0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29  tcase(op==OP_Gt)
15dd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
15de0 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20  (v,op==OP_Gt);. 
15df0 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
15e00 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63  E==OP_Ge); testc
15e10 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20  ase(op==OP_Ge); 
15e20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
15e30 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20  ,op==OP_Ge);.   
15e40 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d     assert(TK_EQ=
15e50 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73  =OP_Eq); testcas
15e60 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64  e(op==OP_Eq); Vd
15e70 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
15e80 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20  p==OP_Eq);.     
15e90 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f   assert(TK_NE==O
15ea0 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Ne); testcase(
15eb0 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65  op==OP_Ne); Vdbe
15ec0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
15ed0 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74  =OP_Ne);.      t
15ee0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
15ef0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
15f00 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
15f10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
15f20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15f30 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
15f40 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
15f50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15f60 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
15f70 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
15f80 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20  TK_ISNOT );.    
15f90 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
15fa0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
15fb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15fc0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
15fd0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
15fe0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15ff0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
16000 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
16010 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54       op = (op==T
16020 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20  K_IS) ? TK_EQ : 
16030 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64  TK_NE;.      cod
16040 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
16050 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
16060 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
16070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16080 20 20 20 20 72 31 2c 20 72 32 2c 20 69 6e 52 65      r1, r2, inRe
16090 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50  g, SQLITE_STOREP
160a0 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45  2 | SQLITE_NULLE
160b0 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
160c0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
160d0 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64  TK_EQ);.      Vd
160e0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
160f0 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20  op==TK_NE);.    
16100 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16110 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16120 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16130 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
16140 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16150 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
16160 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
16170 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
16180 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
16190 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
161a0 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
161b0 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
161c0 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
161d0 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
161e0 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
161f0 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
16200 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
16210 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
16220 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
16230 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16240 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 20 20  AND==OP_And );  
16250 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16260 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  se( op==TK_AND )
16270 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16280 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 20  TK_OR==OP_Or ); 
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
162a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4f 52  tcase( op==TK_OR
162b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
162c0 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64  ( TK_PLUS==OP_Ad
162d0 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 74  d );           t
162e0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
162f0 50 4c 55 53 20 29 3b 0a 20 20 20 20 20 20 61 73  PLUS );.      as
16300 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
16310 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 20 20  OP_Subtract );  
16320 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
16330 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a 20 20 20  =TK_MINUS );.   
16340 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45     assert( TK_RE
16350 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20  M==OP_Remainder 
16360 29 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65  );      testcase
16370 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20 29 3b 0a  ( op==TK_REM );.
16380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16390 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41  _BITAND==OP_BitA
163a0 6e 64 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  nd );      testc
163b0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 41  ase( op==TK_BITA
163c0 4e 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ND );.      asse
163d0 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50  rt( TK_BITOR==OP
163e0 5f 42 69 74 4f 72 20 29 3b 20 20 20 20 20 20 20  _BitOr );       
163f0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16400 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20 20 20 20  K_BITOR );.     
16410 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
16420 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 20  H==OP_Divide ); 
16430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16440 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20 29 3b 0a  op==TK_SLASH );.
16450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16460 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
16470 74 4c 65 66 74 20 29 3b 20 20 20 74 65 73 74 63  tLeft );   testc
16480 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c 53 48 49  ase( op==TK_LSHI
16490 46 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  FT );.      asse
164a0 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f  rt( TK_RSHIFT==O
164b0 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 20  P_ShiftRight ); 
164c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
164d0 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20 20 20 20  K_RSHIFT );.    
164e0 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
164f0 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
16500 3b 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  ;      testcase(
16510 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41 54 20 29   op==TK_CONCAT )
16520 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
16530 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16540 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
16550 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
16560 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
16570 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16580 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
16590 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
165a0 65 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e2);.      sqlit
165b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
165c0 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67  op, r2, r1, targ
165d0 65 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  et);.      testc
165e0 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30  ase( regFree1==0
165f0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
16600 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20  se( regFree2==0 
16610 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16620 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16630 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
16640 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
16650 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
16660 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
16670 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
16680 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
16690 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
166a0 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
166b0 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c 20 74 61  se, pLeft, 1, ta
166c0 72 67 65 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  rget);.#ifndef S
166d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
166e0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20  ING_POINT.      
166f0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 2d  }else if( pLeft-
16700 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
16710 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16720 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
16730 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
16740 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
16750 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 4c 65   codeReal(v, pLe
16760 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 31 2c  ft->u.zToken, 1,
16770 20 74 61 72 67 65 74 29 3b 0a 23 65 6e 64 69 66   target);.#endif
16780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16790 20 20 20 20 20 20 74 65 6d 70 58 2e 6f 70 20 3d        tempX.op =
167a0 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20   TK_INTEGER;.   
167b0 20 20 20 20 20 74 65 6d 70 58 2e 66 6c 61 67 73       tempX.flags
167c0 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 7c 45   = EP_IntValue|E
167d0 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a 20 20 20  P_TokenOnly;.   
167e0 20 20 20 20 20 74 65 6d 70 58 2e 75 2e 69 56 61       tempX.u.iVa
167f0 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lue = 0;.       
16800 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
16810 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16820 2c 20 26 74 65 6d 70 58 2c 20 26 72 65 67 46 72  , &tempX, &regFr
16830 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 32  ee1);.        r2
16840 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
16850 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
16860 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
16870 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 20  gFree2);.       
16880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16890 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63  p3(v, OP_Subtrac
168a0 74 2c 20 72 32 2c 20 72 31 2c 20 74 61 72 67 65  t, r2, r1, targe
168b0 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
168c0 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
168d0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
168e0 20 20 20 69 6e 52 65 67 20 3d 20 74 61 72 67 65     inReg = targe
168f0 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
16900 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16910 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
16920 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
16930 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
16940 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
16950 29 3b 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  );   testcase( o
16960 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20 29 3b 0a  p==TK_BITNOT );.
16970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16980 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 20  _NOT==OP_Not ); 
16990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
169a0 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20 29 3b 0a  ( op==TK_NOT );.
169b0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
169c0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
169d0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
169e0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
169f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16a00 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16a10 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
16a20 72 67 65 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  rget;.      sqli
16a30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16a40 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65 67 29 3b   op, r1, inReg);
16a50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16a60 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
16a70 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
16a80 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
16a90 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
16aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16ab0 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
16ac0 6c 20 29 3b 20 20 20 74 65 73 74 63 61 73 65 28  l );   testcase(
16ad0 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
16ae0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16af0 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e  TK_NOTNULL==OP_N
16b00 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73 74 63 61  otNull ); testca
16b10 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  se( op==TK_NOTNU
16b20 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
16b30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16b40 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
16b50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 72  target);.      r
16b60 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
16b70 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
16b80 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
16b90 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
16ba0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
16bb0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  e1==0 );.      a
16bc0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
16bd0 65 41 64 64 4f 70 31 28 76 2c 20 6f 70 2c 20 72  eAddOp1(v, op, r
16be0 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
16bf0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
16c00 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20 20 20  TK_ISNULL);.    
16c10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
16c20 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55  (v, op==TK_NOTNU
16c30 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  LL);.      sqlit
16c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16c50 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 74  OP_Integer, 0, t
16c60 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71  arget);.      sq
16c70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16c80 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
16c90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16ca0 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
16cb0 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
16cc0 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 20   AggInfo *pInfo 
16cd0 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
16ce0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  o;.      if( pIn
16cf0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
16d00 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
16d10 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
16d20 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
16d30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16d40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d50 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
16d60 65 67 61 74 65 3a 20 25 73 28 29 22 2c 20 70 45  egate: %s()", pE
16d70 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
16d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16d90 20 20 20 20 20 69 6e 52 65 67 20 3d 20 70 49 6e       inReg = pIn
16da0 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78 70 72 2d  fo->aFunc[pExpr-
16db0 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a 20 20 20  >iAgg].iMem;.   
16dc0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
16dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16de0 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
16df0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
16e00 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20  pFarg;       /* 
16e10 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e  List of function
16e20 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
16e30 20 20 20 20 69 6e 74 20 6e 46 61 72 67 3b 20 20      int nFarg;  
16e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16e50 6d 62 65 72 20 6f 66 20 66 75 6e 63 74 69 6f 6e  mber of function
16e60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
16e70 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
16e80 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  f;         /* Th
16e90 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  e function defin
16ea0 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ition object */.
16eb0 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ed0 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 66 75  Length of the fu
16ee0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 20 62  nction name in b
16ef0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ytes */.      co
16f00 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
16f10 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
16f20 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
16f30 20 20 20 75 33 32 20 63 6f 6e 73 74 4d 61 73 6b     u32 constMask
16f40 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4d 61 73   = 0;     /* Mas
16f50 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  k of function ar
16f60 67 75 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  guments that are
16f70 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a 20 20 20   constant */.   
16f80 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
16f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
16fa0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
16fb0 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28     u8 enc = ENC(
16fc0 64 62 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  db);      /* The
16fd0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 75   text encoding u
16fe0 73 65 64 20 62 79 20 74 68 69 73 20 64 61 74 61  sed by this data
16ff0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 6f  base */.      Co
17000 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
17010 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c 6c 61 74  ;    /* A collat
17020 69 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ing sequence */.
17030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17040 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17050 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
17060 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
17070 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
17080 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
17090 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
170a0 20 20 70 46 61 72 67 20 3d 20 30 3b 0a 20 20 20    pFarg = 0;.   
170b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
170c0 20 20 70 46 61 72 67 20 3d 20 70 45 78 70 72 2d    pFarg = pExpr-
170d0 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
170e0 7d 0a 20 20 20 20 20 20 6e 46 61 72 67 20 3d 20  }.      nFarg = 
170f0 70 46 61 72 67 20 3f 20 70 46 61 72 67 2d 3e 6e  pFarg ? pFarg->n
17100 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
17110 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
17120 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
17130 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
17140 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
17150 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
17160 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33     nId = sqlite3
17170 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20  Strlen30(zId);. 
17180 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
17190 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
171a0 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 46  db, zId, nId, nF
171b0 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  arg, enc, 0);.  
171c0 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
171d0 7c 7c 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d  || pDef->xFunc==
171e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
171f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17200 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 66 75  rse, "unknown fu
17210 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28 29 22 2c  nction: %.*s()",
17220 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
17230 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
17240 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 74 74   }..      /* Att
17250 65 6d 70 74 20 61 20 64 69 72 65 63 74 20 69 6d  empt a direct im
17260 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
17270 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 43 4f 41  the built-in COA
17280 4c 45 53 43 45 28 29 20 61 6e 64 0a 20 20 20 20  LESCE() and.    
17290 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29 20 66 75    ** IFNULL() fu
172a0 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 61  nctions.  This a
172b0 76 6f 69 64 73 20 75 6e 6e 65 63 65 73 73 61 72  voids unnecessar
172c0 79 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 0a  y evaluation of.
172d0 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e        ** argumen
172e0 74 73 20 70 61 73 74 20 74 68 65 20 66 69 72 73  ts past the firs
172f0 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d  t non-NULL argum
17300 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
17310 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75      if( pDef->fu
17320 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
17330 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43 45 20 29  _FUNC_COALESCE )
17340 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 6e  {.        int en
17350 64 43 6f 61 6c 65 73 63 65 20 3d 20 73 71 6c 69  dCoalesce = sqli
17360 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
17370 28 76 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (v);.        ass
17380 65 72 74 28 20 6e 46 61 72 67 3e 3d 32 20 29 3b  ert( nFarg>=2 );
17390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
173a0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
173b0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
173c0 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20  pr, target);.   
173d0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
173e0 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFarg; i++){.   
173f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
17410 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65 74 2c 20  otNull, target, 
17420 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20  endCoalesce);.  
17430 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
17440 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
17450 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
17460 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
17470 2c 20 74 61 72 67 65 74 2c 20 31 29 3b 0a 20 20  , target, 1);.  
17480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17490 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
174a0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
174b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
174c0 70 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61  pParse, pFarg->a
174d0 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65  [i].pExpr, targe
174e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
174f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
17500 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  p(pParse);.     
17510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
17520 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17530 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f 61 6c 65  abel(v, endCoale
17540 73 63 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  sce);.        br
17550 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
17560 20 20 20 20 2f 2a 20 54 68 65 20 55 4e 4c 49 4b      /* The UNLIK
17570 45 4c 59 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ELY() function i
17580 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54 68 65 20  s a no-op.  The 
17590 72 65 73 75 6c 74 20 69 73 20 74 68 65 20 76 61  result is the va
175a0 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  lue.      ** of 
175b0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
175c0 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
175d0 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
175e0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
175f0 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
17600 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17610 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a 20 20 20   nFarg>=1 );.   
17620 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17630 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46 61  Code(pParse, pFa
17640 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  rg->a[0].pExpr, 
17650 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
17660 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17670 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
17680 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a 20  i<nFarg; i++){. 
17690 20 20 20 20 20 20 20 69 66 28 20 69 3c 33 32 20         if( i<32 
176a0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
176b0 43 6f 6e 73 74 61 6e 74 28 70 46 61 72 67 2d 3e  Constant(pFarg->
176c0 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
176d0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
176e0 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20 20 20 20  e( i==31 );.    
176f0 20 20 20 20 20 20 63 6f 6e 73 74 4d 61 73 6b 20        constMask 
17700 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28 69 29 3b  |= MASKBIT32(i);
17710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17720 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
17730 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
17740 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 29 21  _FUNC_NEEDCOLL)!
17750 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  =0 && !pColl ){.
17760 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
17770 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
17780 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 46 61  lSeq(pParse, pFa
17790 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  rg->a[i].pExpr);
177a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
177b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 46 61   }.      if( pFa
177c0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rg ){.        if
177d0 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29 7b 0a 20  ( constMask ){. 
177e0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 50           r1 = pP
177f0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
17800 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
17810 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67 3b 0a 20  nMem += nFarg;. 
17820 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
17830 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
17840 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
17850 28 70 50 61 72 73 65 2c 20 6e 46 61 72 67 29 3b  (pParse, nFarg);
17860 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17870 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65 6e 67 74      /* For lengt
17880 68 28 29 20 61 6e 64 20 74 79 70 65 6f 66 28 29  h() and typeof()
17890 20 66 75 6e 63 74 69 6f 6e 73 20 77 69 74 68 20   functions with 
178a0 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75 6d 65 6e  a column argumen
178b0 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  t,.        ** se
178c0 74 20 74 68 65 20 50 35 20 70 61 72 61 6d 65 74  t the P5 paramet
178d0 65 72 20 74 6f 20 74 68 65 20 4f 50 5f 43 6f 6c  er to the OP_Col
178e0 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f 20 4f 50  umn opcode to OP
178f0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 0a 20  FLAG_LENGTHARG. 
17900 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 4f 50 46         ** or OPF
17910 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 72 65  LAG_TYPEOFARG re
17920 73 70 65 63 74 69 76 65 6c 79 2c 20 74 6f 20 61  spectively, to a
17930 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
17940 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 2a 2a   data.        **
17950 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   loading..      
17960 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
17970 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
17980 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
17990 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54 45 5f 46  _LENGTH|SQLITE_F
179a0 55 4e 43 5f 54 59 50 45 4f 46 29 29 21 3d 30 20  UNC_TYPEOF))!=0 
179b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
179c0 65 78 70 72 4f 70 3b 0a 20 20 20 20 20 20 20 20  exprOp;.        
179d0 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67 3d    assert( nFarg=
179e0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
179f0 61 73 73 65 72 74 28 20 70 46 61 72 67 2d 3e 61  assert( pFarg->a
17a00 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 0a  [0].pExpr!=0 );.
17a10 20 20 20 20 20 20 20 20 20 20 65 78 70 72 4f 70            exprOp
17a20 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70   = pFarg->a[0].p
17a30 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
17a40 20 20 20 20 69 66 28 20 65 78 70 72 4f 70 3d 3d      if( exprOp==
17a50 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 65 78 70  TK_COLUMN || exp
17a60 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  rOp==TK_AGG_COLU
17a70 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
17a80 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
17a90 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d 3d 4f 50  _FUNC_LENGTH==OP
17aa0 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29  FLAG_LENGTHARG )
17ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
17ac0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e  sert( SQLITE_FUN
17ad0 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46 4c 41 47  C_TYPEOF==OPFLAG
17ae0 5f 54 59 50 45 4f 46 41 52 47 20 29 3b 0a 20 20  _TYPEOFARG );.  
17af0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
17b00 73 65 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  se( pDef->funcFl
17b10 61 67 73 20 26 20 4f 50 46 4c 41 47 5f 4c 45 4e  ags & OPFLAG_LEN
17b20 47 54 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20  GTHARG );.      
17b30 20 20 20 20 20 20 70 46 61 72 67 2d 3e 61 5b 30        pFarg->a[0
17b40 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 0a  ].pExpr->op2 = .
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67    pDef->funcFlag
17b70 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c 45 4e 47  s & (OPFLAG_LENG
17b80 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f 54 59 50  THARG|OPFLAG_TYP
17b90 45 4f 46 41 52 47 29 3b 0a 20 20 20 20 20 20 20  EOFARG);.       
17ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
17bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17bc0 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
17bd0 72 73 65 29 3b 20 20 20 20 20 2f 2a 20 54 69 63  rse);     /* Tic
17be0 6b 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65  ket 2ea2425d34be
17bf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
17c00 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
17c10 69 73 74 28 70 50 61 72 73 65 2c 20 70 46 61 72  ist(pParse, pFar
17c20 67 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20  g, r1,.         
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43         SQLITE_EC
17c50 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45 5f 45 43  EL_DUP|SQLITE_EC
17c60 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20 20 20 20  EL_FACTOR);.    
17c70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17c80 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
17c90 20 20 20 20 20 20 2f 2a 20 54 69 63 6b 65 74 20        /* Ticket 
17ca0 32 65 61 32 34 32 35 64 33 34 62 65 20 2a 2f 0a  2ea2425d34be */.
17cb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17cc0 20 20 20 20 20 72 31 20 3d 20 30 3b 0a 20 20 20       r1 = 0;.   
17cd0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
17ce0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
17cf0 54 41 42 4c 45 0a 20 20 20 20 20 20 2f 2a 20 50  TABLE.      /* P
17d00 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c 6f 61 64  ossibly overload
17d10 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 66   the function if
17d20 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
17d30 65 6e 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ent is.      ** 
17d40 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
17d50 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2a  column..      **
17d60 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 69 6e  .      ** For in
17d70 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20 28 4c  fix functions (L
17d80 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45 47 45 58  IKE, GLOB, REGEX
17d90 50 2c 20 61 6e 64 20 4d 41 54 43 48 29 20 75 73  P, and MATCH) us
17da0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73  e the.      ** s
17db0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
17dc0 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2c 20 61  not the first, a
17dd0 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  s the argument t
17de0 6f 20 74 65 73 74 20 74 6f 0a 20 20 20 20 20 20  o test to.      
17df0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
17e00 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 76 69  a column in a vi
17e10 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68  rtual table.  Th
17e20 69 73 20 69 73 20 64 6f 6e 65 20 62 65 63 61 75  is is done becau
17e30 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  se.      ** the 
17e40 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  left operand of 
17e50 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73 20  infix functions 
17e60 28 74 68 65 20 6f 70 65 72 61 6e 64 20 77 65 20  (the operand we 
17e70 77 61 6e 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a  want to.      **
17e80 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72 6c 6f 61   control overloa
17e90 64 69 6e 67 29 20 65 6e 64 73 20 75 70 20 61 73  ding) ends up as
17ea0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17eb0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20  ment to the.    
17ec0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20    ** function.  
17ed0 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
17ee0 41 20 67 6c 6f 62 20 42 22 20 69 73 20 65 71 75  A glob B" is equ
17ef0 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20 20 20 20  ivalent to .    
17f00 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c 41 29 2e    ** "glob(B,A).
17f10 20 20 57 65 20 77 61 6e 74 20 74 6f 20 75 73 65    We want to use
17f20 20 74 68 65 20 41 20 69 6e 20 22 41 20 67 6c 6f   the A in "A glo
17f30 62 20 42 22 20 74 6f 20 74 65 73 74 0a 20 20 20  b B" to test.   
17f40 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e 63 74 69     ** for functi
17f50 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e 67 2e 20  on overloading. 
17f60 20 42 75 74 20 77 65 20 75 73 65 20 74 68 65 20   But we use the 
17f70 42 20 74 65 72 6d 20 69 6e 20 22 67 6c 6f 62 28  B term in "glob(
17f80 42 2c 41 29 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  B,A)"..      */.
17f90 20 20 20 20 20 20 69 66 28 20 6e 46 61 72 67 3e        if( nFarg>
17fa0 3d 32 20 26 26 20 28 70 45 78 70 72 2d 3e 66 6c  =2 && (pExpr->fl
17fb0 61 67 73 20 26 20 45 50 5f 49 6e 66 69 78 46 75  ags & EP_InfixFu
17fc0 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  nc) ){.        p
17fd0 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61  Def = sqlite3Vta
17fe0 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f  bOverloadFunctio
17ff0 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72  n(db, pDef, nFar
18000 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31 5d 2e 70  g, pFarg->a[1].p
18010 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
18020 73 65 20 69 66 28 20 6e 46 61 72 67 3e 30 20 29  se if( nFarg>0 )
18030 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
18040 20 73 71 6c 69 74 65 33 56 74 61 62 4f 76 65 72   sqlite3VtabOver
18050 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  loadFunction(db,
18060 20 70 44 65 66 2c 20 6e 46 61 72 67 2c 20 70 46   pDef, nFarg, pF
18070 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  arg->a[0].pExpr)
18080 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
18090 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
180a0 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
180b0 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
180c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  L ){.        if(
180d0 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
180e0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
180f0 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
18100 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18110 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c  P_CollSeq, 0, 0,
18120 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
18130 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
18140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
18150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18160 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
18170 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31 2c 20 74  constMask, r1, t
18180 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20 20  arget,.         
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
181a0 63 68 61 72 2a 29 70 44 65 66 2c 20 50 34 5f 46  char*)pDef, P4_F
181b0 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73  UNCDEF);.      s
181c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
181d0 50 35 28 76 2c 20 28 75 38 29 6e 46 61 72 67 29  P5(v, (u8)nFarg)
181e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61 72  ;.      if( nFar
181f0 67 20 26 26 20 63 6f 6e 73 74 4d 61 73 6b 3d 3d  g && constMask==
18200 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
18210 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
18220 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
18230 20 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   nFarg);.      }
18240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18250 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
18260 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18270 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
18280 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
18290 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
182a0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
182b0 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20 20 20 20  K_EXISTS );.    
182c0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
182d0 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20  TK_SELECT );.   
182e0 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74     inReg = sqlit
182f0 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
18300 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
18310 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
18320 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18330 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
18340 20 69 6e 74 20 64 65 73 74 49 66 46 61 6c 73 65   int destIfFalse
18350 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18360 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
18370 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c    int destIfNull
18380 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
18390 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
183a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
183b0 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
183c0 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
183d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
183e0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
183f0 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20  r, destIfFalse, 
18400 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  destIfNull);.   
18410 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18420 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18430 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
18440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18450 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
18460 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a 20   destIfFalse);. 
18470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18480 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
18490 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  Imm, target, 0);
184a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
184b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
184c0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
184d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
184e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
184f0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
18500 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20   */...    /*.   
18510 20 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e   **    x BETWEEN
18520 20 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a   y AND z.    **.
18530 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65      ** This is e
18540 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20  quivalent to.   
18550 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e   **.    **    x>
18560 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20  =y AND x<=z.    
18570 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73  **.    ** X is s
18580 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e  tored in pExpr->
18590 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20  pLeft..    ** Y 
185a0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
185b0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
185c0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20  pExpr..    ** Z 
185d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78  is stored in pEx
185e0 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
185f0 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  pExpr..    */.  
18600 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
18610 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  N: {.      Expr 
18620 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
18630 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72  pLeft;.      str
18640 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
18650 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70  m *pLItem = pExp
18660 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 3b 0a 20  r->x.pList->a;. 
18670 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
18680 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
18690 72 3b 0a 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r;..      r1 = s
186a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
186b0 6d 70 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  mp(pParse, pLeft
186c0 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
186d0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
186e0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
186f0 72 73 65 2c 20 70 52 69 67 68 74 2c 20 26 72 65  rse, pRight, &re
18700 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 74  gFree2);.      t
18710 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
18720 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  1==0 );.      te
18730 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32  stcase( regFree2
18740 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 33 20  ==0 );.      r3 
18750 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
18760 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
18770 20 20 20 72 34 20 3d 20 73 71 6c 69 74 65 33 47     r4 = sqlite3G
18780 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18790 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
187a0 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
187b0 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
187c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
187d0 20 20 20 20 20 72 31 2c 20 72 32 2c 20 72 33 2c       r1, r2, r3,
187e0 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 29   SQLITE_STOREP2)
187f0 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ;  VdbeCoverage(
18800 76 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  v);.      pLItem
18810 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
18820 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
18830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
18840 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18850 61 72 73 65 2c 20 72 65 67 46 72 65 65 32 29 3b  arse, regFree2);
18860 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
18870 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18880 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
18890 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
188a0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
188b0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
188c0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
188d0 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
188e0 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31 2c 20 72  ht, OP_Le, r1, r
188f0 32 2c 20 72 34 2c 20 53 51 4c 49 54 45 5f 53 54  2, r4, SQLITE_ST
18900 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 56 64  OREP2);.      Vd
18910 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
18920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18930 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 6e 64  AddOp3(v, OP_And
18940 2c 20 72 33 2c 20 72 34 2c 20 74 61 72 67 65 74  , r3, r4, target
18950 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18960 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
18970 50 61 72 73 65 2c 20 72 33 29 3b 0a 20 20 20 20  Parse, r3);.    
18980 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
18990 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
189a0 72 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r4);.      break
189b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
189c0 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 0a 20 20   TK_COLLATE: .  
189d0 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
189e0 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d   {.      inReg =
189f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
18a00 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
18a10 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
18a20 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  get);.      brea
18a30 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
18a40 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
18a50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
18a60 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
18a70 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
18a80 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
18a90 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
18aa0 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
18ab0 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
18ac0 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
18ad0 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
18ae0 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
18af0 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
18b00 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
18b10 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
18b20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
18b30 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
18b40 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
18b50 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
18b60 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
18b70 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
18b80 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
18b90 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
18ba0 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
18bb0 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
18bc0 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
18bd0 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
18be0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65  *.      ** The e
18bf0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 6d 70  xpression is imp
18c00 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 61  lemented using a
18c10 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70 63 6f 64  n OP_Param opcod
18c20 65 2e 20 54 68 65 20 70 31 0a 20 20 20 20 20 20  e. The p1.      
18c30 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
18c40 73 65 74 20 74 6f 20 30 20 66 6f 72 20 61 6e 20  set to 0 for an 
18c50 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66 65 72 65  old.rowid refere
18c60 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69 2b 31 29  nce, or to (i+1)
18c70 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 66  .      ** to ref
18c80 65 72 65 6e 63 65 20 61 6e 6f 74 68 65 72 20 63  erence another c
18c90 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 6f 6c 64  olumn of the old
18ca0 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2c  .* pseudo-table,
18cb0 20 77 68 65 72 65 20 0a 20 20 20 20 20 20 2a 2a   where .      **
18cc0 20 69 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   i is the index 
18cd0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 46  of the column. F
18ce0 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69 64 20 72  or a new.rowid r
18cf0 65 66 65 72 65 6e 63 65 2c 20 70 31 20 69 73 0a  eference, p1 is.
18d00 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
18d10 28 6e 2b 31 29 2c 20 77 68 65 72 65 20 6e 20 69  (n+1), where n i
18d20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18d30 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61 63 68 20  columns in each 
18d40 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e 0a 20 20  pseudo-table..  
18d50 20 20 20 20 2a 2a 20 46 6f 72 20 61 20 72 65 66      ** For a ref
18d60 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 6f 74  erence to any ot
18d70 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  her column in th
18d80 65 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74  e new.* pseudo-t
18d90 61 62 6c 65 2c 20 70 31 0a 20 20 20 20 20 20 2a  able, p1.      *
18da0 2a 20 69 73 20 73 65 74 20 74 6f 20 28 6e 2b 32  * is set to (n+2
18db0 2b 69 29 2c 20 77 68 65 72 65 20 6e 20 61 6e 64  +i), where n and
18dc0 20 69 20 61 72 65 20 61 73 20 64 65 66 69 6e 65   i are as define
18dd0 64 20 70 72 65 76 69 6f 75 73 6c 79 2e 20 46 6f  d previously. Fo
18de0 72 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70  r.      ** examp
18df0 6c 65 2c 20 69 66 20 74 68 65 20 74 61 62 6c 65  le, if the table
18e00 20 6f 6e 20 77 68 69 63 68 20 74 72 69 67 67 65   on which trigge
18e10 72 73 20 61 72 65 20 62 65 69 6e 67 20 66 69 72  rs are being fir
18e20 65 64 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ed is.      ** d
18e30 65 63 6c 61 72 65 64 20 61 73 3a 0a 20 20 20 20  eclared as:.    
18e40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
18e50 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
18e60 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 2a 2a 0a  a, b);.      **.
18e70 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 70 31        ** Then p1
18e80 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
18e90 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
18ea0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
18eb0 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==0   ->    ol
18ec0 64 2e 72 6f 77 69 64 20 20 20 20 20 70 31 3d 3d  d.rowid     p1==
18ed0 33 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 72 6f  3   ->    new.ro
18ee0 77 69 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 70  wid.      **   p
18ef0 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20 6f 6c 64  1==1   ->    old
18f00 2e 61 20 20 20 20 20 20 20 20 20 70 31 3d 3d 34  .a         p1==4
18f10 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 61 0a 20     ->    new.a. 
18f20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d 3d 32 20       **   p1==2 
18f30 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62 20 20 20    ->    old.b   
18f40 20 20 20 20 20 20 70 31 3d 3d 35 20 20 20 2d 3e        p1==5   ->
18f50 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 20 20      new.b       
18f60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18f70 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 45  Table *pTab = pE
18f80 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
18f90 20 69 6e 74 20 70 31 20 3d 20 70 45 78 70 72 2d   int p1 = pExpr-
18fa0 3e 69 54 61 62 6c 65 20 2a 20 28 70 54 61 62 2d  >iTable * (pTab-
18fb0 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20 2b 20 70  >nCol+1) + 1 + p
18fc0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 0a  Expr->iColumn;..
18fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
18fe0 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 7c  xpr->iTable==0 |
18ff0 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  | pExpr->iTable=
19000 3d 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =1 );.      asse
19010 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
19020 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78 70 72 2d  mn>=-1 && pExpr-
19030 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62 2d 3e 6e  >iColumn<pTab->n
19040 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Col );.      ass
19050 65 72 74 28 20 70 54 61 62 2d 3e 69 50 4b 65 79  ert( pTab->iPKey
19060 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 43 6f  <0 || pExpr->iCo
19070 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69 50 4b 65  lumn!=pTab->iPKe
19080 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
19090 74 28 20 70 31 3e 3d 30 20 26 26 20 70 31 3c 28  t( p1>=0 && p1<(
190a0 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b 32 29 20  pTab->nCol*2+2) 
190b0 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
190c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
190d0 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20 74 61 72  P_Param, p1, tar
190e0 67 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  get);.      Vdbe
190f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 2e  Comment((v, "%s.
19100 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20 20 20 20  %s -> $%d",.    
19110 20 20 20 20 28 70 45 78 70 72 2d 3e 69 54 61 62      (pExpr->iTab
19120 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20 22 6f 6c  le ? "new" : "ol
19130 64 22 29 2c 0a 20 20 20 20 20 20 20 20 28 70 45  d"),.        (pE
19140 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 3f  xpr->iColumn<0 ?
19150 20 22 72 6f 77 69 64 22 20 3a 20 70 45 78 70 72   "rowid" : pExpr
19160 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78  ->pTab->aCol[pEx
19170 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 7a 4e 61  pr->iColumn].zNa
19180 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 74 61 72  me),.        tar
19190 67 65 74 0a 20 20 20 20 20 20 29 29 3b 0a 0a 23  get.      ));..#
191a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
191b0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
191c0 54 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  T.      /* If th
191d0 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 52 45 41  e column has REA
191e0 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20 6d  L affinity, it m
191f0 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
19200 73 74 6f 72 65 64 20 61 73 20 61 6e 0a 20 20 20  stored as an.   
19210 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 55     ** integer. U
19220 73 65 20 4f 50 5f 52 65 61 6c 41 66 66 69 6e 69  se OP_RealAffini
19230 74 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ty to make sure 
19240 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 61  it is really rea
19250 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  l.  */.      if(
19260 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
19270 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70 54  =0 .       && pT
19280 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e  ab->aCol[pExpr->
19290 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
192a0 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
192b0 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  AL.      ){.    
192c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
192d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 61 6c  ddOp1(v, OP_Real
192e0 41 66 66 69 6e 69 74 79 2c 20 74 61 72 67 65 74  Affinity, target
192f0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
19300 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
19310 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20     }...    /*.  
19320 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a 20 20 20    ** Form A:.   
19330 20 2a 2a 20 20 20 43 41 53 45 20 78 20 57 48 45   **   CASE x WHE
19340 4e 20 65 31 20 54 48 45 4e 20 72 31 20 57 48 45  N e1 THEN r1 WHE
19350 4e 20 65 32 20 54 48 45 4e 20 72 32 20 2e 2e 2e  N e2 THEN r2 ...
19360 20 57 48 45 4e 20 65 4e 20 54 48 45 4e 20 72 4e   WHEN eN THEN rN
19370 20 45 4c 53 45 20 79 20 45 4e 44 0a 20 20 20 20   ELSE y END.    
19380 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 42  **.    ** Form B
19390 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20  :.    **   CASE 
193a0 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
193b0 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
193c0 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
193d0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
193e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
193f0 6d 20 41 20 69 73 20 63 61 6e 20 62 65 20 74 72  m A is can be tr
19400 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 20 74  ansformed into t
19410 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f  he equivalent fo
19420 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  rm B as follows:
19430 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 57  .    **   CASE W
19440 48 45 4e 20 78 3d 65 31 20 54 48 45 4e 20 72 31  HEN x=e1 THEN r1
19450 20 57 48 45 4e 20 78 3d 65 32 20 54 48 45 4e 20   WHEN x=e2 THEN 
19460 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 20  r2 ....    **   
19470 20 20 20 20 20 57 48 45 4e 20 78 3d 65 4e 20 54       WHEN x=eN T
19480 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
19490 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
194a0 58 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29  X (if it exists)
194b0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
194c0 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73  eft..    ** Y is
194d0 20 69 6e 20 74 68 65 20 6c 61 73 74 20 65 6c 65   in the last ele
194e0 6d 65 6e 74 20 6f 66 20 70 45 78 70 72 2d 3e 78  ment of pExpr->x
194f0 2e 70 4c 69 73 74 20 69 66 20 70 45 78 70 72 2d  .pList if pExpr-
19500 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  >x.pList->nExpr 
19510 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64 2e 20 20  is.    ** odd.  
19520 54 68 65 20 59 20 69 73 20 61 6c 73 6f 20 6f 70  The Y is also op
19530 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74 68 65 20  tional.  If the 
19540 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
19550 74 73 20 69 6e 20 78 2e 70 4c 69 73 74 0a 20 20  ts in x.pList.  
19560 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c 20 74 68    ** is even, th
19570 65 6e 20 59 20 69 73 20 6f 6d 69 74 74 65 64 20  en Y is omitted 
19580 61 6e 64 20 74 68 65 20 22 6f 74 68 65 72 77 69  and the "otherwi
19590 73 65 22 20 72 65 73 75 6c 74 20 69 73 20 4e 55  se" result is NU
195a0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69 20 69 73  LL..    ** Ei is
195b0 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74   in pExpr->pList
195c0 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20 52 69 20  ->a[i*2] and Ri 
195d0 69 73 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  is pExpr->pList-
195e0 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20 20 20 2a  >a[i*2+1]..    *
195f0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  *.    ** The res
19600 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ult of the expre
19610 73 73 69 6f 6e 20 69 73 20 74 68 65 20 52 69 20  ssion is the Ri 
19620 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  for the first ma
19630 74 63 68 69 6e 67 20 45 69 2c 0a 20 20 20 20 2a  tching Ei,.    *
19640 2a 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  * or if there is
19650 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 45 69 2c   no matching Ei,
19660 20 74 68 65 20 45 4c 53 45 20 74 65 72 6d 20 59   the ELSE term Y
19670 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  , or if there is
19680 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c 53 45 20  .    ** no ELSE 
19690 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20 20 20 20  term, NULL..    
196a0 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  */.    default: 
196b0 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 43  assert( op==TK_C
196c0 41 53 45 20 29 3b 20 7b 0a 20 20 20 20 20 20 69  ASE ); {.      i
196d0 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20 20 20 20  nt endLabel;    
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66   /* GOTO label f
19700 6f 72 20 65 6e 64 20 6f 66 20 43 41 53 45 20 73  or end of CASE s
19710 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tmt */.      int
19720 20 6e 65 78 74 43 61 73 65 3b 20 20 20 20 20 20   nextCase;      
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19740 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20 66 6f 72  * GOTO label for
19750 20 6e 65 78 74 20 57 48 45 4e 20 63 6c 61 75 73   next WHEN claus
19760 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
19770 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
19780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19790 32 78 20 6e 75 6d 62 65 72 20 6f 66 20 57 48 45  2x number of WHE
197a0 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20  N terms */.     
197b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
197e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  er */.      Expr
197f0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19810 20 4c 69 73 74 20 6f 66 20 57 48 45 4e 20 74 65   List of WHEN te
19820 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  rms */.      str
19830 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19840 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 20 20 2f  m *aListelem;  /
19850 2a 20 41 72 72 61 79 20 6f 66 20 57 48 45 4e 20  * Array of WHEN 
19860 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20 45  terms */.      E
19870 78 70 72 20 6f 70 43 6f 6d 70 61 72 65 3b 20 20  xpr opCompare;  
19880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19890 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69 20 65 78   /* The X==Ei ex
198a0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
198b0 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 20 20 20 2f 2a 20 54 68 65 20 58 20 65 78 70      /* The X exp
198e0 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
198f0 20 45 78 70 72 20 2a 70 54 65 73 74 20 3d 20 30   Expr *pTest = 0
19900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19910 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28 66 6f 72     /* X==Ei (for
19920 6d 20 41 29 20 6f 72 20 6a 75 73 74 20 45 69 20  m A) or just Ei 
19930 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20 20 20 20  (form B) */.    
19940 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
19950 69 43 61 63 68 65 4c 65 76 65 6c 20 3d 20 70 50  iCacheLevel = pP
19960 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
19970 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61 73 73 65  l; )..      asse
19980 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
19990 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
199a0 49 73 53 65 6c 65 63 74 29 20 26 26 20 70 45 78  IsSelect) && pEx
199b0 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29 3b 0a 20  pr->x.pList );. 
199c0 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
199d0 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
199e0 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
199f0 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
19a00 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
19a10 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
19a20 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
19a30 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
19a40 0a 20 20 20 20 20 20 65 6e 64 4c 61 62 65 6c 20  .      endLabel 
19a50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19a60 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
19a70 20 69 66 28 20 28 70 58 20 3d 20 70 45 78 70 72   if( (pX = pExpr
19a80 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29 7b 0a 20  ->pLeft)!=0 ){. 
19a90 20 20 20 20 20 20 20 74 65 6d 70 58 20 3d 20 2a         tempX = *
19aa0 70 58 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  pX;.        test
19ab0 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  case( pX->op==TK
19ac0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
19ad0 20 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65     exprToRegiste
19ae0 72 28 26 74 65 6d 70 58 2c 20 73 71 6c 69 74 65  r(&tempX, sqlite
19af0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
19b00 61 72 73 65 2c 20 70 58 2c 20 26 72 65 67 46 72  arse, pX, &regFr
19b10 65 65 31 29 29 3b 0a 20 20 20 20 20 20 20 20 74  ee1));.        t
19b20 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
19b30 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1==0 );.        
19b40 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20 3d 20 54  opCompare.op = T
19b50 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 6f 70  K_EQ;.        op
19b60 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74 20 3d 20  Compare.pLeft = 
19b70 26 74 65 6d 70 58 3b 0a 20 20 20 20 20 20 20 20  &tempX;.        
19b80 70 54 65 73 74 20 3d 20 26 6f 70 43 6f 6d 70 61  pTest = &opCompa
19b90 72 65 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  re;.        /* T
19ba0 69 63 6b 65 74 20 62 33 35 31 64 39 35 66 39 63  icket b351d95f9c
19bb0 64 35 65 66 31 37 65 39 64 39 64 62 61 65 31 38  d5ef17e9d9dbae18
19bc0 66 35 63 61 38 36 31 31 31 39 30 30 30 31 3a 0a  f5ca8611190001:.
19bd0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 76          ** The v
19be0 61 6c 75 65 20 69 6e 20 72 65 67 46 72 65 65 31  alue in regFree1
19bf0 20 6d 69 67 68 74 20 67 65 74 20 53 43 6f 70 79   might get SCopy
19c00 2d 65 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  -ed into the fil
19c10 65 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 20 20  e result..      
19c20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20 73 75 72    ** So make sur
19c30 65 20 74 68 61 74 20 74 68 65 20 72 65 67 46 72  e that the regFr
19c40 65 65 31 20 72 65 67 69 73 74 65 72 20 69 73 20  ee1 register is 
19c50 6e 6f 74 20 72 65 75 73 65 64 20 66 6f 72 20 6f  not reused for o
19c60 74 68 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ther.        ** 
19c70 70 75 72 70 6f 73 65 73 20 61 6e 64 20 70 6f 73  purposes and pos
19c80 73 69 62 6c 79 20 6f 76 65 72 77 72 69 74 74 65  sibly overwritte
19c90 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  n.  */.        r
19ca0 65 67 46 72 65 65 31 20 3d 20 30 3b 0a 20 20 20  egFree1 = 0;.   
19cb0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
19cc0 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31 3b 20 69  =0; i<nExpr-1; i
19cd0 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
19ce0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19cf0 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ush(pParse);.   
19d00 20 20 20 20 20 69 66 28 20 70 58 20 29 7b 0a 20       if( pX ){. 
19d10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19d20 20 70 54 65 73 74 21 3d 30 20 29 3b 0a 20 20 20   pTest!=0 );.   
19d30 20 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65         opCompare
19d40 2e 70 52 69 67 68 74 20 3d 20 61 4c 69 73 74 65  .pRight = aListe
19d50 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  lem[i].pExpr;.  
19d60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19d70 20 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 61         pTest = a
19d80 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
19d90 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
19da0 20 20 20 20 20 6e 65 78 74 43 61 73 65 20 3d 20       nextCase = 
19db0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
19dc0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
19dd0 20 74 65 73 74 63 61 73 65 28 20 70 54 65 73 74   testcase( pTest
19de0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
19df0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19e00 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
19e10 61 72 73 65 2c 20 70 54 65 73 74 2c 20 6e 65 78  arse, pTest, nex
19e20 74 43 61 73 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tCase, SQLITE_JU
19e30 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
19e40 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4c 69     testcase( aLi
19e50 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
19e60 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
19e70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
19e80 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
19e90 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b  se, aListelem[i+
19ea0 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  1].pExpr, target
19eb0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
19ec0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19ed0 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 6e 64 4c  OP_Goto, 0, endL
19ee0 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  abel);.        s
19ef0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
19f00 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
19f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
19f20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6e  esolveLabel(v, n
19f30 65 78 74 43 61 73 65 29 3b 0a 20 20 20 20 20 20  extCase);.      
19f40 7d 0a 20 20 20 20 20 20 69 66 28 20 28 6e 45 78  }.      if( (nEx
19f50 70 72 26 31 29 21 3d 30 20 29 7b 0a 20 20 20 20  pr&1)!=0 ){.    
19f60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
19f70 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
19f80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19f90 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
19fa0 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e 45 78 70  , pEList->a[nExp
19fb0 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74 61 72 67  r-1].pExpr, targ
19fc0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  et);.        sql
19fd0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
19fe0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
19ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1a000 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a010 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
1a020 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
1a030 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
1a040 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1a050 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  || pParse->nErr>
1a060 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0 .           ||
1a070 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
1a080 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c 65 76 65  evel==iCacheLeve
1a090 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  l );.      sqlit
1a0a0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1a0b0 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65 6c 29 3b  el(v, endLabel);
1a0c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a0d0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1a0e0 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1a0f0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
1a100 45 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  E: {.      asser
1a110 74 28 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  t( pExpr->affini
1a120 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20  ty==OE_Rollback 
1a130 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
1a140 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  Expr->affinity==
1a150 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20 20 20 20  OE_Abort.       
1a160 20 20 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66      || pExpr->af
1a170 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61 69 6c 0a  finity==OE_Fail.
1a180 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45             || pE
1a190 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1a1a0 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20 20 20 29  E_Ignore.      )
1a1b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1a1c0 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
1a1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a1e0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1a1f0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1a200 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
1a210 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
1a220 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
1a230 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
1a240 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a250 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1a260 20 69 66 28 20 70 45 78 70 72 2d 3e 61 66 66 69   if( pExpr->affi
1a270 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  nity==OE_Abort )
1a280 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a290 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
1a2a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a2b0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1a2c0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1a2d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
1a2e0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1a2f0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 49  ->affinity==OE_I
1a300 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
1a310 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a320 70 34 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  p4(.            
1a330 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
1a340 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e 6f 72 65  TE_OK, OE_Ignore
1a350 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
1a360 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20 20 20 20  oken,0);.       
1a370 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1a380 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 61         sqlite3Ha
1a3a0 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
1a3b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rse, SQLITE_CONS
1a3c0 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 2c 0a  TRAINT_TRIGGER,.
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1a3f0 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 2c 20 70  xpr->affinity, p
1a400 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1a410 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  0, 0);.      }..
1a420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a430 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1a440 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a450 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
1a460 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
1a470 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1a480 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1a490 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 52  2);.  return inR
1a4a0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 61 63  eg;.}../*.** Fac
1a4b0 74 6f 72 20 6f 75 74 20 74 68 65 20 63 6f 64 65  tor out the code
1a4c0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
1a4d0 70 72 65 73 73 69 6f 6e 20 74 6f 20 69 6e 69 74  pression to init
1a4e0 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65 2e  ialization time.
1a4f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a500 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 0a  ExprCodeAtInit(.
1a510 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1a520 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1a530 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1a540 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f 2a   *pExpr,      /*
1a550 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1a560 74 6f 20 63 6f 64 65 20 77 68 65 6e 20 74 68 65  to code when the
1a570 20 56 44 42 45 20 69 6e 69 74 69 61 6c 69 7a 65   VDBE initialize
1a580 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65  s */.  int regDe
1a590 73 74 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  st,      /* Stor
1a5a0 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
1a5b0 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
1a5c0 20 20 75 38 20 72 65 75 73 61 62 6c 65 20 20 20    u8 reusable   
1a5d0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1a5e0 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
1a5f0 73 20 72 65 75 73 61 62 6c 65 20 2a 2f 0a 29 7b  s reusable */.){
1a600 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 3b 0a  .  ExprList *p;.
1a610 20 20 61 73 73 65 72 74 28 20 43 6f 6e 73 74 46    assert( ConstF
1a620 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
1a630 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
1a640 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 70  >pConstExpr;.  p
1a650 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
1a660 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
1a670 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 70  , pExpr, 0);.  p
1a680 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1a690 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1a6a0 20 70 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66   p, pExpr);.  if
1a6b0 28 20 70 20 29 7b 0a 20 20 20 20 20 73 74 72 75  ( p ){.     stru
1a6c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1a6d0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1a6e0 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  p->nExpr-1];.   
1a6f0 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73    pItem->u.iCons
1a700 74 45 78 70 72 52 65 67 20 3d 20 72 65 67 44 65  tExprReg = regDe
1a710 73 74 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e  st;.     pItem->
1a720 72 65 75 73 61 62 6c 65 20 3d 20 72 65 75 73 61  reusable = reusa
1a730 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ble;.  }.  pPars
1a740 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 3d 20  e->pConstExpr = 
1a750 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  p;.}../*.** Gene
1a760 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
1a770 6c 75 61 74 65 20 61 6e 20 65 78 70 72 65 73 73  luate an express
1a780 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ion and store th
1a790 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74  e results.** int
1a7a0 6f 20 61 20 72 65 67 69 73 74 65 72 2e 20 20 52  o a register.  R
1a7b0 65 74 75 72 6e 20 74 68 65 20 72 65 67 69 73 74  eturn the regist
1a7c0 65 72 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  er number where 
1a7d0 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 61  the results.** a
1a7e0 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  re stored..**.**
1a7f0 20 49 66 20 74 68 65 20 72 65 67 69 73 74 65 72   If the register
1a800 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1a810 72 65 67 69 73 74 65 72 20 74 68 61 74 20 63 61  register that ca
1a820 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64  n be deallocated
1a830 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20  ,.** then write 
1a840 69 74 73 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  its number into 
1a850 2a 70 52 65 67 2e 20 20 49 66 20 74 68 65 20 72  *pReg.  If the r
1a860 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20 69  esult register i
1a870 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65 6d 70 6f  s not.** a tempo
1a880 72 61 72 79 2c 20 74 68 65 6e 20 73 65 74 20 2a  rary, then set *
1a890 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pReg to zero..**
1a8a0 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20  .** If pExpr is 
1a8b0 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  a constant, then
1a8c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
1a8d0 67 68 74 20 67 65 6e 65 72 61 74 65 20 74 68 69  ght generate thi
1a8e0 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 66 69 6c  s.** code to fil
1a8f0 6c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  l the register i
1a900 6e 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  n the initializa
1a910 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20 6f 66 20  tion section of 
1a920 74 68 65 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67  the.** VDBE prog
1a930 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ram, in order to
1a940 20 66 61 63 74 6f 72 20 69 74 20 6f 75 74 20 6f   factor it out o
1a950 66 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  f the evaluation
1a960 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   loop..*/.int sq
1a970 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
1a980 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
1a990 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1a9a0 74 20 2a 70 52 65 67 29 7b 0a 20 20 69 6e 74 20  t *pReg){.  int 
1a9b0 72 32 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71  r2;.  pExpr = sq
1a9c0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
1a9d0 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20 69  late(pExpr);.  i
1a9e0 66 28 20 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b  f( ConstFactorOk
1a9f0 28 70 50 61 72 73 65 29 0a 20 20 20 26 26 20 70  (pParse).   && p
1aa00 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
1aa10 49 53 54 45 52 0a 20 20 20 26 26 20 73 71 6c 69  ISTER.   && sqli
1aa20 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1aa30 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70 72 29 0a  tNotJoin(pExpr).
1aa40 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73    ){.    ExprLis
1aa50 74 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  t *p = pParse->p
1aa60 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 69  ConstExpr;.    i
1aa70 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52 65 67 20  nt i;.    *pReg 
1aa80 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 20   = 0;.    if( p 
1aa90 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1aaa0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1aab0 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1aac0 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69 3d 70 2d  pItem=p->a, i=p-
1aad0 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20 70 49 74  >nExpr; i>0; pIt
1aae0 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20 20 20 20  em++, i--){.    
1aaf0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 72      if( pItem->r
1ab00 65 75 73 61 62 6c 65 20 26 26 20 73 71 6c 69 74  eusable && sqlit
1ab10 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49  e3ExprCompare(pI
1ab20 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45 78 70 72  tem->pExpr,pExpr
1ab30 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,-1)==0 ){.     
1ab40 20 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65       return pIte
1ab50 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52  m->u.iConstExprR
1ab60 65 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  eg;.        }.  
1ab70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ab80 72 32 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r2 = ++pParse->n
1ab90 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1aba0 45 78 70 72 43 6f 64 65 41 74 49 6e 69 74 28 70  ExprCodeAtInit(p
1abb0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 72 32  Parse, pExpr, r2
1abc0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1abd0 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
1abe0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1abf0 61 72 73 65 29 3b 0a 20 20 20 20 72 32 20 3d 20  arse);.    r2 = 
1ac00 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ac10 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1ac20 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 69 66  xpr, r1);.    if
1ac30 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20 20 20 20  ( r2==r1 ){.    
1ac40 20 20 2a 70 52 65 67 20 3d 20 72 31 3b 0a 20 20    *pReg = r1;.  
1ac50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ac60 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1ac70 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
1ac80 3b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  ;.      *pReg = 
1ac90 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1aca0 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a 2f 2a 0a  eturn r2;.}../*.
1acb0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1acc0 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
1acd0 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  ate expression p
1ace0 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 74  Expr and store t
1acf0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e  he.** results in
1ad00 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1ad10 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  .  The results a
1ad20 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
1ad30 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 72 65   appear.** in re
1ad40 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a 2a  gister target..*
1ad50 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1ad60 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
1ad70 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1ad80 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1ad90 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a 0a 20 20    int inReg;..  
1ada0 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
1adb0 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
1adc0 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
1add0 28 20 70 45 78 70 72 20 26 26 20 70 45 78 70 72  ( pExpr && pExpr
1ade0 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
1adf0 52 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  R ){.    sqlite3
1ae00 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72 73  VdbeAddOp2(pPars
1ae10 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 43 6f 70  e->pVdbe, OP_Cop
1ae20 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
1ae30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c  , target);.  }el
1ae40 73 65 7b 0a 20 20 20 20 69 6e 52 65 67 20 3d 20  se{.    inReg = 
1ae50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ae60 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1ae70 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1ae80 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1ae90 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50 61 72 73  ->pVdbe || pPars
1aea0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1aeb0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 69  led );.    if( i
1aec0 6e 52 65 67 21 3d 74 61 72 67 65 74 20 26 26 20  nReg!=target && 
1aed0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b  pParse->pVdbe ){
1aee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1aef0 62 65 41 64 64 4f 70 32 28 70 50 61 72 73 65 2d  beAddOp2(pParse-
1af00 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43 6f 70 79  >pVdbe, OP_SCopy
1af10 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65 74 29  , inReg, target)
1af20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1af30 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
1af40 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
1af50 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  luate expression
1af60 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72 65   pExpr and store
1af70 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1af80 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1af90 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 73  et.  The results
1afa0 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
1afb0 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20  to appear.** in 
1afc0 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e  register target.
1afd0 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
1afe0 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 2c  ion is constant,
1aff0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1b000 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63 68 6f 6f  ne.** might choo
1b010 73 65 20 74 6f 20 63 6f 64 65 20 74 68 65 20 65  se to code the e
1b020 78 70 72 65 73 73 69 6f 6e 20 61 74 20 69 6e 69  xpression at ini
1b030 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69 6d 65  tialization time
1b040 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b050 33 45 78 70 72 43 6f 64 65 46 61 63 74 6f 72 61  3ExprCodeFactora
1b060 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1b070 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1b080 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20 69  int target){.  i
1b090 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e  f( pParse->okCon
1b0a0 73 74 46 61 63 74 6f 72 20 26 26 20 73 71 6c 69  stFactor && sqli
1b0b0 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1b0c0 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1b0d0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1b0e0 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1b0f0 78 70 72 2c 20 74 61 72 67 65 74 2c 20 30 29 3b  xpr, target, 0);
1b100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
1b110 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1b120 61 72 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72  arse, pExpr, tar
1b130 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  get);.  }.}../*.
1b140 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1b150 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20   that evaluates 
1b160 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1b170 73 69 6f 6e 20 61 6e 64 20 70 75 74 73 20 74 68  sion and puts th
1b180 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 72  e result.** in r
1b190 65 67 69 73 74 65 72 20 74 61 72 67 65 74 2e 0a  egister target..
1b1a0 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61 6b 65 20  **.** Also make 
1b1b0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
1b1c0 70 72 65 73 73 69 6f 6e 20 72 65 73 75 6c 74 73  pression results
1b1d0 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 20 22 63   into another "c
1b1e0 61 63 68 65 22 20 72 65 67 69 73 74 65 72 0a 2a  ache" register.*
1b1f0 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65  * and modify the
1b200 20 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 20 74   expression so t
1b210 68 61 74 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hat the next tim
1b220 65 20 69 74 20 69 73 20 65 76 61 6c 75 61 74 65  e it is evaluate
1b230 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  d,.** the result
1b240 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
1b250 65 20 63 61 63 68 65 20 72 65 67 69 73 74 65 72  e cache register
1b260 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b270 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1b280 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
1b290 74 20 61 72 65 20 75 73 65 64 20 6d 75 6c 74 69  t are used multi
1b2a0 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73 2e 20 20  ple .** times.  
1b2b0 54 68 65 79 20 61 72 65 20 65 76 61 6c 75 61 74  They are evaluat
1b2c0 65 64 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  ed once and the 
1b2d0 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 65  results of the e
1b2e0 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 61 72 65  xpression.** are
1b2f0 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64   reused..*/.void
1b300 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b310 41 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a  AndCache(Parse *
1b320 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
1b330 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
1b340 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1b350 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1b360 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  nt iMem;..  asse
1b370 72 74 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a  rt( target>0 );.
1b380 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1b390 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53 54 45 52  >op!=TK_REGISTER
1b3a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1b3b0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1b3c0 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  xpr, target);.  
1b3d0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1b3e0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
1b3f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b400 5f 43 6f 70 79 2c 20 74 61 72 67 65 74 2c 20 69  _Copy, target, i
1b410 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54 6f 52 65  Mem);.  exprToRe
1b420 67 69 73 74 65 72 28 70 45 78 70 72 2c 20 69 4d  gister(pExpr, iM
1b430 65 6d 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  em);.}..#if defi
1b440 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1b450 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a  E_TREE_EXPLAIN).
1b460 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
1b470 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
1b480 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61  explanation of a
1b490 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
1b4a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b4b0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 56 64  e3ExplainExpr(Vd
1b4c0 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72 20 2a  be *pOut, Expr *
1b4d0 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6f 70  pExpr){.  int op
1b4e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b4f0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
1b500 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  e being coded */
1b510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b520 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20 2f 2a 20  BinOp = 0;   /* 
1b530 42 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20  Binary operator 
1b540 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b550 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20 20 20 2f  *zUniOp = 0;   /
1b560 2a 20 55 6e 61 72 79 20 6f 70 65 72 61 74 6f 72  * Unary operator
1b570 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 3d   */.  if( pExpr=
1b580 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 54  =0 ){.    op = T
1b590 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  K_NULL;.  }else{
1b5a0 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72 2d  .    op = pExpr-
1b5b0 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  >op;.  }.  switc
1b5c0 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
1b5d0 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
1b5e0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b5f0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b600 75 74 2c 20 22 41 47 47 7b 25 64 3a 25 64 7d 22  ut, "AGG{%d:%d}"
1b610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ,.            pE
1b620 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78  xpr->iTable, pEx
1b630 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1b640 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b650 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
1b660 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
1b670 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
1b680 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1b690 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
1b6a0 20 77 68 65 6e 20 63 6f 64 69 6e 67 20 63 68 65   when coding che
1b6b0 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ck constraints *
1b6c0 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1b6d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b6e0 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28 25 64 29  Out, "COLUMN(%d)
1b6f0 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ", pExpr->iColum
1b700 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1b710 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b720 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b730 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22 2c 0a 20  ut, "{%d:%d}",. 
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1b760 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
1b770 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
1b780 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1b790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1b7a0 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
1b7b0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66      if( pExpr->f
1b7c0 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
1b7d0 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ue ){.        sq
1b7e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b7f0 74 66 28 70 4f 75 74 2c 20 22 25 64 22 2c 20 70  tf(pOut, "%d", p
1b800 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b  Expr->u.iValue);
1b810 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b820 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b830 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1b840 20 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%s", pExpr->u.
1b850 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d  zToken);.      }
1b860 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b870 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1b880 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
1b890 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61 73 65 20  _POINT.    case 
1b8a0 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
1b8b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1b8c0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 22  Printf(pOut,"%s"
1b8d0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1b8e0 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
1b8f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1b900 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
1b910 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b920 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1b930 4f 75 74 2c 22 25 51 22 2c 20 70 45 78 70 72 2d  Out,"%Q", pExpr-
1b940 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1b950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b960 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
1b970 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b980 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b990 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
1b9a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1b9b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b9c0 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a  IT_BLOB_LITERAL.
1b9d0 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
1b9e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b9f0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ba00 4f 75 74 2c 22 25 73 22 2c 20 70 45 78 70 72 2d  Out,"%s", pExpr-
1ba10 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1ba20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1ba30 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
1ba40 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
1ba50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1ba60 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 56  inPrintf(pOut,"V
1ba70 41 52 49 41 42 4c 45 28 25 73 2c 25 64 29 22 2c  ARIABLE(%s,%d)",
1ba80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1baa0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 45 78  r->u.zToken, pEx
1bab0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
1bac0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bad0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
1bae0 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
1baf0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1bb00 6e 74 66 28 70 4f 75 74 2c 22 52 45 47 49 53 54  ntf(pOut,"REGIST
1bb10 45 52 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e  ER(%d)", pExpr->
1bb20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  iTable);.      b
1bb30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1bb40 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
1bb50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bb60 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1bb70 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1bb80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1bb90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bba0 49 54 5f 43 41 53 54 0a 20 20 20 20 63 61 73 65  IT_CAST.    case
1bbb0 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20 20 20 20   TK_CAST: {.    
1bbc0 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
1bbd0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 20   of the form:   
1bbe0 43 41 53 54 28 70 4c 65 66 74 20 41 53 20 74 6f  CAST(pLeft AS to
1bbf0 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ken) */.      co
1bc00 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 66 20 3d  nst char *zAff =
1bc10 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77   "unk";.      sw
1bc20 69 74 63 68 28 20 73 71 6c 69 74 65 33 41 66 66  itch( sqlite3Aff
1bc30 69 6e 69 74 79 54 79 70 65 28 70 45 78 70 72 2d  inityType(pExpr-
1bc40 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 20 29 7b  >u.zToken, 0) ){
1bc50 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1bc60 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20  LITE_AFF_TEXT:  
1bc70 20 20 7a 41 66 66 20 3d 20 22 54 45 58 54 22 3b    zAff = "TEXT";
1bc80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bc90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bca0 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20 7a 41 66  AFF_NONE:    zAf
1bcb0 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20 20 20 20  f = "NONE";     
1bcc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1bcd0 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ase SQLITE_AFF_N
1bce0 55 4d 45 52 49 43 3a 20 7a 41 66 66 20 3d 20 22  UMERIC: zAff = "
1bcf0 4e 55 4d 45 52 49 43 22 3b 20 20 62 72 65 61 6b  NUMERIC";  break
1bd00 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
1bd10 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
1bd20 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e 54 45 47  R: zAff = "INTEG
1bd30 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ER";  break;.   
1bd40 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1bd50 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20 20 7a 41  _AFF_REAL:    zA
1bd60 66 66 20 3d 20 22 52 45 41 4c 22 3b 20 20 20 20  ff = "REAL";    
1bd70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1bd80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1bd90 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1bda0 20 22 43 41 53 54 2d 25 73 28 22 2c 20 7a 41 66   "CAST-%s(", zAf
1bdb0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
1bdc0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1bdd0 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
1bde0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1bdf0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1be00 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62  t, ")");.      b
1be10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1be20 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1be30 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
1be40 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
1be50 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20  BinOp = "LT";   
1be60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1be70 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 42  e TK_LE:      zB
1be80 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20  inOp = "LE";    
1be90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1bea0 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 42 69   TK_GT:      zBi
1beb0 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20  nOp = "GT";     
1bec0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bed0 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 42 69 6e  TK_GE:      zBin
1bee0 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 62  Op = "GE";     b
1bef0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1bf00 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_NE:      zBinO
1bf10 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 62 72  p = "NE";     br
1bf20 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1bf30 5f 45 51 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70  _EQ:      zBinOp
1bf40 20 3d 20 22 45 51 22 3b 20 20 20 20 20 62 72 65   = "EQ";     bre
1bf50 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1bf60 49 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  IS:      zBinOp 
1bf70 3d 20 22 49 53 22 3b 20 20 20 20 20 62 72 65 61  = "IS";     brea
1bf80 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1bf90 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  SNOT:   zBinOp =
1bfa0 20 22 49 53 4e 4f 54 22 3b 20 20 62 72 65 61 6b   "ISNOT";  break
1bfb0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
1bfc0 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  D:     zBinOp = 
1bfd0 22 41 4e 44 22 3b 20 20 20 20 62 72 65 61 6b 3b  "AND";    break;
1bfe0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
1bff0 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
1c000 4f 52 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OR";     break;.
1c010 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
1c020 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 41  :    zBinOp = "A
1c030 44 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  DD";    break;. 
1c040 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
1c050 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4d 55      zBinOp = "MU
1c060 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
1c070 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
1c080 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 53 55 42     zBinOp = "SUB
1c090 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
1c0a0 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
1c0b0 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 45 4d 22    zBinOp = "REM"
1c0c0 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1c0d0 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
1c0e0 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 41 4e   zBinOp = "BITAN
1c0f0 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  D"; break;.    c
1c100 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
1c110 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54 4f 52 22  zBinOp = "BITOR"
1c120 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1c130 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
1c140 42 69 6e 4f 70 20 3d 20 22 44 49 56 22 3b 20 20  BinOp = "DIV";  
1c150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c160 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 42  e TK_LSHIFT:  zB
1c170 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b  inOp = "LSHIFT";
1c180 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c190 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 42 69   TK_RSHIFT:  zBi
1c1a0 6e 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20  nOp = "RSHIFT"; 
1c1b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c1c0 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 42 69 6e  TK_CONCAT:  zBin
1c1d0 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 62  Op = "CONCAT"; b
1c1e0 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
1c1f0 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 55 6e 69  TK_UMINUS:  zUni
1c200 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22 3b 20 62  Op = "UMINUS"; b
1c210 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c220 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55 6e 69 4f  K_UPLUS:   zUniO
1c230 70 20 3d 20 22 55 50 4c 55 53 22 3b 20 20 62 72  p = "UPLUS";  br
1c240 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c250 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e 69 4f 70  _BITNOT:  zUniOp
1c260 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 62 72 65   = "BITNOT"; bre
1c270 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c280 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69 4f 70 20  NOT:     zUniOp 
1c290 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62 72 65 61  = "NOT";    brea
1c2a0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
1c2b0 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f 70 20 3d  SNULL:  zUniOp =
1c2c0 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72 65 61 6b   "ISNULL"; break
1c2d0 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
1c2e0 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70 20 3d 20  TNULL: zUniOp = 
1c2f0 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b  "NOTNULL"; break
1c300 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ;..    case TK_C
1c310 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  OLLATE: {.      
1c320 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1c330 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1c340 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1c350 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c360 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c 4c 41 54  tf(pOut,".COLLAT
1c370 45 28 25 73 29 22 2c 70 45 78 70 72 2d 3e 75 2e  E(%s)",pExpr->u.
1c380 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1c390 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1c3a0 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
1c3b0 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20  CTION:.    case 
1c3c0 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
1c3d0 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
1c3e0 46 61 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4c  Farg;       /* L
1c3f0 69 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  ist of function 
1c400 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
1c410 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1c420 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1c430 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20  _TokenOnly) ){. 
1c440 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 30         pFarg = 0
1c450 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c460 20 20 20 20 20 20 20 70 46 61 72 67 20 3d 20 70         pFarg = p
1c470 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
1c480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c490 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43   op==TK_AGG_FUNC
1c4a0 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  TION ){.        
1c4b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1c4c0 69 6e 74 66 28 70 4f 75 74 2c 20 22 41 47 47 5f  intf(pOut, "AGG_
1c4d0 46 55 4e 43 54 49 4f 4e 25 64 3a 25 73 28 22 2c  FUNCTION%d:%s(",
1c4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1c500 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78 70 72 2d  xpr->op2, pExpr-
1c510 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1c520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c530 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c540 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 46 55 4e  rintf(pOut, "FUN
1c550 43 54 49 4f 4e 3a 25 73 28 22 2c 20 70 45 78 70  CTION:%s(", pExp
1c560 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c570 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c580 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
1c590 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c5a0 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 46  xprList(pOut, pF
1c5b0 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
1c5c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c5d0 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c5e0 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1c5f0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1c600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1c610 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
1c620 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20 20 20 20  _EXISTS: {.     
1c630 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c640 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 45 58 49  rintf(pOut, "EXI
1c650 53 54 53 28 22 29 3b 0a 20 20 20 20 20 20 73 71  STS(");.      sq
1c660 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
1c670 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  ct(pOut, pExpr->
1c680 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
1c690 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c6a0 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29  Printf(pOut,")")
1c6b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c6c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c6d0 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
1c6e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c6f0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 22 29  rintf(pOut, "(")
1c700 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c710 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 4f 75  xplainSelect(pOu
1c720 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  t, pExpr->x.pSel
1c730 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
1c740 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c750 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1c760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c770 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1c780 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1c790 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1c7a0 74 2c 20 22 49 4e 28 22 29 3b 0a 20 20 20 20 20  t, "IN(");.     
1c7b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1c7c0 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  xpr(pOut, pExpr-
1c7d0 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
1c7e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c7f0 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a  ntf(pOut, ",");.
1c800 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1c810 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c820 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
1c830 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c840 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
1c850 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Out, pExpr->x.pS
1c860 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 65  elect);.      }e
1c870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1c880 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
1c890 69 73 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ist(pOut, pExpr-
1c8a0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
1c8b0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c8c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c8d0 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  ut, ")");.      
1c8e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1c8f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c900 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1c910 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
1c920 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
1c930 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   z.    **.    **
1c940 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
1c950 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a 0a 20 20  ent to.    **.  
1c960 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e 44    **    x>=y AND
1c970 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a 20 20 20   x<=z.    **.   
1c980 20 2a 2a 20 58 20 69 73 20 73 74 6f 72 65 64 20   ** X is stored 
1c990 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2e  in pExpr->pLeft.
1c9a0 0a 20 20 20 20 2a 2a 20 59 20 69 73 20 73 74 6f  .    ** Y is sto
1c9b0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1c9c0 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2e  ist->a[0].pExpr.
1c9d0 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20 73 74 6f  .    ** Z is sto
1c9e0 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c  red in pExpr->pL
1c9f0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2e  ist->a[1].pExpr.
1ca00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ca10 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
1ca20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
1ca30 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
1ca40 20 20 20 20 45 78 70 72 20 2a 70 59 20 3d 20 70      Expr *pY = p
1ca50 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1ca60 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
1ca70 20 45 78 70 72 20 2a 70 5a 20 3d 20 70 45 78 70   Expr *pZ = pExp
1ca80 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
1ca90 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
1caa0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1cab0 74 66 28 70 4f 75 74 2c 20 22 42 45 54 57 45 45  tf(pOut, "BETWEE
1cac0 4e 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  N(");.      sqli
1cad0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1cae0 4f 75 74 2c 20 70 58 29 3b 0a 20 20 20 20 20 20  Out, pX);.      
1caf0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1cb00 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1cb10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cb20 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1cb30 70 59 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pY);.      sqlit
1cb40 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1cb50 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  pOut, ",");.    
1cb60 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1cb70 45 78 70 72 28 70 4f 75 74 2c 20 70 5a 29 3b 0a  Expr(pOut, pZ);.
1cb80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1cb90 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1cba0 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65   ")");.      bre
1cbb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1cbc0 73 65 20 54 4b 5f 54 52 49 47 47 45 52 3a 20 7b  se TK_TRIGGER: {
1cbd0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1cbe0 20 6f 70 63 6f 64 65 20 69 73 20 54 4b 5f 54 52   opcode is TK_TR
1cbf0 49 47 47 45 52 2c 20 74 68 65 6e 20 74 68 65 20  IGGER, then the 
1cc00 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
1cc10 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
1cc20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 69  ** to a column i
1cc30 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f 72 20 6f  n the new.* or o
1cc40 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62 6c  ld.* pseudo-tabl
1cc50 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 0a  es available to.
1cc60 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72        ** trigger
1cc70 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e 20 74 68   programs. In th
1cc80 69 73 20 63 61 73 65 20 45 78 70 72 2e 69 54 61  is case Expr.iTa
1cc90 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 31 20  ble is set to 1 
1cca0 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  for the.      **
1ccb0 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f 2d 74 61   new.* pseudo-ta
1ccc0 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ble, or 0 for th
1ccd0 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  e old.* pseudo-t
1cce0 61 62 6c 65 2e 20 45 78 70 72 2e 69 43 6f 6c 75  able. Expr.iColu
1ccf0 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  mn.      ** is s
1cd00 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
1cd10 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d 74   of the pseudo-t
1cd20 61 62 6c 65 20 74 6f 20 72 65 61 64 2c 20 6f 72  able to read, or
1cd30 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20 20 20 20   to -1 to.      
1cd40 2a 2a 20 72 65 61 64 20 74 68 65 20 72 6f 77 69  ** read the rowi
1cd50 64 20 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a  d field..      *
1cd60 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
1cd70 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1cd80 74 2c 20 22 25 73 28 25 64 29 22 2c 20 0a 20 20  t, "%s(%d)", .  
1cd90 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
1cda0 54 61 62 6c 65 20 3f 20 22 4e 45 57 22 20 3a 20  Table ? "NEW" : 
1cdb0 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d 3e 69 43  "OLD", pExpr->iC
1cdc0 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
1cdd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1cde0 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
1cdf0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ce00 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1ce10 22 43 41 53 45 28 22 29 3b 0a 20 20 20 20 20 20  "CASE(");.      
1ce20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1ce30 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1ce40 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
1ce50 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1ce60 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20  tf(pOut, ",");. 
1ce70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ce80 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74  ainExprList(pOut
1ce90 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
1cea0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ceb0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1cec0 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
1ced0 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41  R.    case TK_RA
1cee0 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ISE: {.      con
1cef0 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d  st char *zType =
1cf00 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20 20 73 77   "unk";.      sw
1cf10 69 74 63 68 28 20 70 45 78 70 72 2d 3e 61 66 66  itch( pExpr->aff
1cf20 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
1cf30 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c 62 61 63   case OE_Rollbac
1cf40 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20 22 72 6f  k:   zType = "ro
1cf50 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65 61 6b 3b  llback";  break;
1cf60 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1cf70 5f 41 62 6f 72 74 3a 20 20 20 20 20 20 7a 54 79  _Abort:      zTy
1cf80 70 65 20 3d 20 22 61 62 6f 72 74 22 3b 20 20 20  pe = "abort";   
1cf90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1cfa0 20 63 61 73 65 20 4f 45 5f 46 61 69 6c 3a 20 20   case OE_Fail:  
1cfb0 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 66 61       zType = "fa
1cfc0 69 6c 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  il";      break;
1cfd0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 45  .        case OE
1cfe0 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20 7a 54 79  _Ignore:     zTy
1cff0 70 65 20 3d 20 22 69 67 6e 6f 72 65 22 3b 20 20  pe = "ignore";  
1d000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1d010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1d020 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1d030 2c 20 22 52 41 49 53 45 2d 25 73 28 25 73 29 22  , "RAISE-%s(%s)"
1d040 2c 20 7a 54 79 70 65 2c 20 70 45 78 70 72 2d 3e  , zType, pExpr->
1d050 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
1d060 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1d070 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ndif.  }.  if( z
1d080 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c  BinOp ){.    sql
1d090 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1d0a0 66 28 70 4f 75 74 2c 22 25 73 28 22 2c 20 7a 42  f(pOut,"%s(", zB
1d0b0 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  inOp);.    sqlit
1d0c0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1d0d0 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ut, pExpr->pLeft
1d0e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1d0f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1d100 2c 22 2c 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ,",");.    sqlit
1d110 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f  e3ExplainExpr(pO
1d120 75 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ut, pExpr->pRigh
1d130 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1d140 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1d150 74 2c 22 29 22 29 3b 0a 20 20 7d 65 6c 73 65 20  t,")");.  }else 
1d160 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b 0a 20 20  if( zUniOp ){.  
1d170 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d180 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28  Printf(pOut,"%s(
1d190 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20 20 20 20  ", zUniOp);.    
1d1a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1d1b0 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1d1c0 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
1d1d0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1d1e0 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 0a  (pOut,")");.  }.
1d1f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
1d200 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1d210 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
1d220 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
1d230 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52  SQLITE_ENABLE_TR
1d240 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a  EE_EXPLAIN)./*.*
1d250 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75 6d  * Generate a hum
1d260 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 78 70 6c  an-readable expl
1d270 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  anation of an ex
1d280 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
1d290 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1d2a0 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 56 64  plainExprList(Vd
1d2b0 62 65 20 2a 70 4f 75 74 2c 20 45 78 70 72 4c 69  be *pOut, ExprLi
1d2c0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
1d2d0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1d2e0 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d 3e 6e 45  ==0 || pList->nE
1d2f0 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  xpr==0 ){.    sq
1d300 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1d310 74 66 28 70 4f 75 74 2c 20 22 28 65 6d 70 74 79  tf(pOut, "(empty
1d320 2d 6c 69 73 74 29 22 29 3b 0a 20 20 20 20 72 65  -list)");.    re
1d330 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
1d340 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  ( pList->nExpr==
1d350 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1d360 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1d370 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  , pList->a[0].pE
1d380 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xpr);.  }else{. 
1d390 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d3a0 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a 20 20 20  nPush(pOut);.   
1d3b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1d3c0 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1d3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1d3e0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1d3f0 20 22 69 74 65 6d 5b 25 64 5d 20 3d 20 22 2c 20   "item[%d] = ", 
1d400 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
1d410 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75  3ExplainPush(pOu
1d420 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1d430 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1d440 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
1d450 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
1d460 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
1d470 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
1d480 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1d490 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
1d4a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1d4b0 66 28 70 4f 75 74 2c 20 22 20 41 53 20 25 73 22  f(pOut, " AS %s"
1d4c0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
1d4d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1d4e0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
1d4f0 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61 62 20 29  [i].bSpanIsTab )
1d500 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d510 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d520 4f 75 74 2c 20 22 20 28 25 73 29 22 2c 20 70 4c  Out, " (%s)", pL
1d530 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
1d540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d550 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  if( i<pList->nEx
1d560 70 72 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  pr-1 ){.        
1d570 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
1d580 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  (pOut);.      }.
1d590 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d5a0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 4f 75 74  3ExplainPop(pOut
1d5b0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
1d5c0 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1d5d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  */../*.** Genera
1d5e0 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
1d5f0 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
1d600 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
1d610 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
1d620 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 69  xpression list i
1d630 6e 74 6f 20 61 20 73 65 71 75 65 6e 63 65 20 6f  nto a sequence o
1d640 66 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  f registers begi
1d650 6e 6e 69 6e 67 20 61 74 20 74 61 72 67 65 74 2e  nning at target.
1d660 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1d670 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1d680 65 6e 74 73 20 65 76 61 6c 75 61 74 65 64 2e 0a  ents evaluated..
1d690 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1d6a0 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61 67 20 70  _ECEL_DUP flag p
1d6b0 72 65 76 65 6e 74 73 20 74 68 65 20 61 72 67 75  revents the argu
1d6c0 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  ments from being
1d6d0 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73 69 6e 67  .** filled using
1d6e0 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f 50 5f 43   OP_SCopy.  OP_C
1d6f0 6f 70 79 20 6d 75 73 74 20 62 65 20 75 73 65 64  opy must be used
1d700 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
1d710 54 68 65 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f  The SQLITE_ECEL_
1d720 46 41 43 54 4f 52 20 61 72 67 75 6d 65 6e 74 20  FACTOR argument 
1d730 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61 6e 74 20  allows constant 
1d740 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62 65 0a  arguments to be.
1d750 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20  ** factored out 
1d760 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74  into initializat
1d770 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ion code..*/.int
1d780 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1d790 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
1d7a0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
1d7b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1d7c0 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
1d7d0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 54 68 65  *pList,   /* The
1d7e0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1d7f0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
1d800 20 20 69 6e 74 20 74 61 72 67 65 74 2c 20 20 20    int target,   
1d810 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
1d820 20 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 2a   write results *
1d830 2f 0a 20 20 75 38 20 66 6c 61 67 73 20 20 20 20  /.  u8 flags    
1d840 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
1d850 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73 20 2a 2f  _ECEL_* flags */
1d860 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
1d870 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
1d880 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
1d890 20 75 38 20 63 6f 70 79 4f 70 20 3d 20 28 66 6c   u8 copyOp = (fl
1d8a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
1d8b0 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43 6f 70 79  L_DUP) ? OP_Copy
1d8c0 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a 20 20 61   : OP_SCopy;.  a
1d8d0 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
1d8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 61 72  );.  assert( tar
1d8f0 67 65 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  get>0 );.  asser
1d900 74 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t( pParse->pVdbe
1d910 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65 76 65 72  !=0 );  /* Never
1d920 20 67 65 74 73 20 74 68 69 73 20 66 61 72 20 6f   gets this far o
1d930 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 6e 20  therwise */.  n 
1d940 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
1d950 20 20 69 66 28 20 21 43 6f 6e 73 74 46 61 63 74    if( !ConstFact
1d960 6f 72 4f 6b 28 70 50 61 72 73 65 29 20 29 20 66  orOk(pParse) ) f
1d970 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1d980 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a 20 20 66  ECEL_FACTOR;.  f
1d990 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1d9a0 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
1d9b0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1d9c0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49  Expr *pExpr = pI
1d9d0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
1d9e0 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  if( (flags & SQL
1d9f0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
1da00 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 45 78  !=0 && sqlite3Ex
1da10 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
1da20 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
1da30 69 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e  ite3ExprCodeAtIn
1da40 69 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  it(pParse, pExpr
1da50 2c 20 74 61 72 67 65 74 2b 69 2c 20 30 29 3b 0a  , target+i, 0);.
1da60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1da70 20 69 6e 74 20 69 6e 52 65 67 20 3d 20 73 71 6c   int inReg = sql
1da80 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
1da90 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
1daa0 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20  , target+i);.   
1dab0 20 20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61     if( inReg!=ta
1dac0 72 67 65 74 2b 69 20 29 7b 0a 20 20 20 20 20 20  rget+i ){.      
1dad0 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
1dae0 20 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d         Vdbe *v =
1daf0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1db00 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 70 79          if( copy
1db10 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  Op==OP_Copy.    
1db20 20 20 20 20 20 26 26 20 28 70 4f 70 3d 73 71 6c       && (pOp=sql
1db30 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
1db40 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f   -1))->opcode==O
1db50 50 5f 43 6f 70 79 0a 20 20 20 20 20 20 20 20 20  P_Copy.         
1db60 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f 70 2d 3e  && pOp->p1+pOp->
1db70 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20 20 20 20  p3+1==inReg.    
1db80 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 32 2b       && pOp->p2+
1db90 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61 72 67 65  pOp->p3+1==targe
1dba0 74 2b 69 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t+i.        ){. 
1dbb0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33           pOp->p3
1dbc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1dbd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
1dbe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dbf0 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52 65 67 2c  , copyOp, inReg,
1dc00 20 74 61 72 67 65 74 2b 69 29 3b 0a 20 20 20 20   target+i);.    
1dc10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1dc20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1dc30 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   n;.}../*.** Gen
1dc40 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1dc50 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
1dc60 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78 20 42 45  r..**.**    x BE
1dc70 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 2a 2a  TWEEN y AND z.**
1dc80 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
1dc90 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
1dca0 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79 20 41 4e  **.**    x>=y AN
1dcb0 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20 43 6f 64  D x<=z.**.** Cod
1dcc0 65 20 69 74 20 61 73 20 73 75 63 68 2c 20 74 61  e it as such, ta
1dcd0 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 64 6f 20  king care to do 
1dce0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75 62 65 78  the common subex
1dcf0 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65 6c 69 6d  pression.** elim
1dd00 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e 0a 2a 2f  ination of x..*/
1dd10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
1dd20 72 43 6f 64 65 42 65 74 77 65 65 6e 28 0a 20 20  rCodeBetween(.  
1dd30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1dd40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
1dd50 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
1dd60 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
1dd70 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
1dd80 2f 2a 20 54 68 65 20 42 45 54 57 45 45 4e 20 65  /* The BETWEEN e
1dd90 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
1dda0 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20  nt dest,        
1ddb0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1ddc0 20 74 68 65 20 6a 75 6d 70 20 69 73 20 74 61 6b   the jump is tak
1ddd0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70  en */.  int jump
1dde0 49 66 54 72 75 65 2c 20 20 20 2f 2a 20 54 61 6b  IfTrue,   /* Tak
1ddf0 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68  e the jump if th
1de00 65 20 42 45 54 57 45 45 4e 20 69 73 20 74 72 75  e BETWEEN is tru
1de10 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49  e */.  int jumpI
1de20 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54 61 6b 65  fNull    /* Take
1de30 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
1de40 20 42 45 54 57 45 45 4e 20 69 73 20 4e 55 4c 4c   BETWEEN is NULL
1de50 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 65 78   */.){.  Expr ex
1de60 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a 20 54 68  prAnd;     /* Th
1de70 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 69  e AND operator i
1de80 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a  n  x>=y AND x<=z
1de90 20 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70    */.  Expr comp
1dea0 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  Left;    /* The 
1deb0 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a 2f 0a 20   x>=y  term */. 
1dec0 20 45 78 70 72 20 63 6f 6d 70 52 69 67 68 74 3b   Expr compRight;
1ded0 20 20 20 2f 2a 20 54 68 65 20 20 78 3c 3d 7a 20     /* The  x<=z 
1dee0 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78 70 72 20   term */.  Expr 
1def0 65 78 70 72 58 3b 20 20 20 20 20 20 20 2f 2a 20  exprX;       /* 
1df00 54 68 65 20 20 78 20 20 73 75 62 65 78 70 72 65  The  x  subexpre
1df10 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ssion */.  int r
1df20 65 67 46 72 65 65 31 20 3d 20 30 3b 20 2f 2a 20  egFree1 = 0; /* 
1df30 54 65 6d 70 6f 72 61 72 79 20 75 73 65 20 72 65  Temporary use re
1df40 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  gister */..  ass
1df50 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1df60 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1df70 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
1df80 65 78 70 72 58 20 3d 20 2a 70 45 78 70 72 2d 3e  exprX = *pExpr->
1df90 70 4c 65 66 74 3b 0a 20 20 65 78 70 72 41 6e 64  pLeft;.  exprAnd
1dfa0 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20  .op = TK_AND;.  
1dfb0 65 78 70 72 41 6e 64 2e 70 4c 65 66 74 20 3d 20  exprAnd.pLeft = 
1dfc0 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20 65 78 70  &compLeft;.  exp
1dfd0 72 41 6e 64 2e 70 52 69 67 68 74 20 3d 20 26 63  rAnd.pRight = &c
1dfe0 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63 6f 6d 70  ompRight;.  comp
1dff0 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f 47 45 3b  Left.op = TK_GE;
1e000 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 4c 65 66  .  compLeft.pLef
1e010 74 20 3d 20 26 65 78 70 72 58 3b 0a 20 20 63 6f  t = &exprX;.  co
1e020 6d 70 4c 65 66 74 2e 70 52 69 67 68 74 20 3d 20  mpLeft.pRight = 
1e030 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
1e040 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 63 6f  a[0].pExpr;.  co
1e050 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20 54 4b 5f  mpRight.op = TK_
1e060 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e  LE;.  compRight.
1e070 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a  pLeft = &exprX;.
1e080 20 20 63 6f 6d 70 52 69 67 68 74 2e 70 52 69 67    compRight.pRig
1e090 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ht = pExpr->x.pL
1e0a0 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
1e0b0 0a 20 20 65 78 70 72 54 6f 52 65 67 69 73 74 65  .  exprToRegiste
1e0c0 72 28 26 65 78 70 72 58 2c 20 73 71 6c 69 74 65  r(&exprX, sqlite
1e0d0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1e0e0 61 72 73 65 2c 20 26 65 78 70 72 58 2c 20 26 72  arse, &exprX, &r
1e0f0 65 67 46 72 65 65 31 29 29 3b 0a 20 20 69 66 28  egFree1));.  if(
1e100 20 6a 75 6d 70 49 66 54 72 75 65 20 29 7b 0a 20   jumpIfTrue ){. 
1e110 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
1e120 54 72 75 65 28 70 50 61 72 73 65 2c 20 26 65 78  True(pParse, &ex
1e130 70 72 41 6e 64 2c 20 64 65 73 74 2c 20 6a 75 6d  prAnd, dest, jum
1e140 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73  pIfNull);.  }els
1e150 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
1e160 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1e170 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74  , &exprAnd, dest
1e180 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1e190 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65   }.  sqlite3Rele
1e1a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1e1b0 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 0a 20  e, regFree1);.. 
1e1c0 20 2f 2a 20 45 6e 73 75 72 65 20 61 64 65 71 75   /* Ensure adequ
1e1d0 61 74 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  ate test coverag
1e1e0 65 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  e */.  testcase(
1e1f0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1e200 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1e210 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1e220 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1e230 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e240 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20  umpIfNull==0 && 
1e250 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1e260 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e270 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1e280 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1e290 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1e2a0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e2b0 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue==0 && jumpIfN
1e2c0 75 6c 6c 21 3d 30 20 26 26 20 72 65 67 46 72 65  ull!=0 && regFre
1e2d0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1e2e0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1e2f0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e300 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  ==0 && regFree1=
1e310 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e320 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e330 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  && jumpIfNull==0
1e340 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1e350 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1e360 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1e370 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1e380 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1e390 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70    testcase( jump
1e3a0 49 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d  IfTrue!=0 && jum
1e3b0 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65  pIfNull!=0 && re
1e3c0 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 7d 0a 0a  gFree1!=0 );.}..
1e3d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1e3e0 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
1e3f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
1e400 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
1e410 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
1e420 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
1e430 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1e440 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
1e450 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
1e460 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
1e470 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1e480 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
1e490 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
1e4a0 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
1e4b0 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
1e4c0 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
1e4d0 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
1e4e0 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
1e4f0 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
1e500 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1e510 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  L..**.** This co
1e520 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
1e530 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
1e540 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
1e550 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
1e560 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
1e570 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
1e580 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
1e590 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
1e5a0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
1e5b0 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
1e5c0 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
1e5d0 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
1e5e0 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
1e5f0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
1e600 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
1e610 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
1e620 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
1e630 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
1e640 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
1e650 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
1e660 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
1e670 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
1e680 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
1e690 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1e6a0 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
1e6b0 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
1e6c0 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
1e6d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
1e6e0 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
1e6f0 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1e700 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65  0;.  int regFree
1e710 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c  2 = 0;.  int r1,
1e720 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   r2;..  assert( 
1e730 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49  jumpIfNull==SQLI
1e740 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c  TE_JUMPIFNULL ||
1e750 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e760 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d  ;.  if( NEVER(v=
1e770 3d 30 29 20 29 20 20 20 20 20 72 65 74 75 72 6e  =0) )     return
1e780 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  ;  /* Existence 
1e790 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1e7a0 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1e7b0 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
1e7c0 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  0) ) return;  /*
1e7d0 20 4e 6f 20 77 61 79 20 74 68 69 73 20 63 61 6e   No way this can
1e7e0 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 6f 70 20   happen */.  op 
1e7f0 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73  = pExpr->op;.  s
1e800 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1e810 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a   case TK_AND: {.
1e820 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
1e830 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1e840 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65  bel(v);.      te
1e850 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1e860 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1e870 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e880 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1e890 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75 6d 70 49  >pLeft, d2,jumpI
1e8a0 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d  fNull^SQLITE_JUM
1e8b0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
1e8c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1e8d0 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
1e8e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
1e8f0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
1e900 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
1e910 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e930 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1e940 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   d2);.      sqli
1e950 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1e960 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
1e970 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e980 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20  case TK_OR: {.  
1e990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e9a0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e9b0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e9c0 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
1e9d0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
1e9e0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ea00 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1ea10 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1ea20 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1ea30 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1ea40 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1ea50 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ea60 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28  te3ExprCachePop(
1ea70 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62  pParse);.      b
1ea80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ea90 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
1eaa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1eab0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1eac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ead0 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
1eae0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
1eaf0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1eb00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1eb10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1eb20 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LT:.    case TK
1eb30 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _LE:.    case TK
1eb40 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GT:.    case TK
1eb50 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _GE:.    case TK
1eb60 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _NE:.    case TK
1eb70 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _EQ: {.      tes
1eb80 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
1eb90 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 31  l==0 );.      r1
1eba0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ebb0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
1ebc0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
1ebd0 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
1ebe0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
1ebf0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
1ec00 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
1ec10 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
1ec20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1ec30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ec40 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1ec50 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1ec60 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1ec70 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ec80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ec90 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74  TK_LT==OP_Lt); t
1eca0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c  estcase(op==OP_L
1ecb0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
1ecc0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  If(v,op==OP_Lt);
1ecd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1ece0 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73  _LE==OP_Le); tes
1ecf0 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29  tcase(op==OP_Le)
1ed00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1ed10 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20  (v,op==OP_Le);. 
1ed20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47       assert(TK_G
1ed30 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65 73 74 63  T==OP_Gt); testc
1ed40 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20  ase(op==OP_Gt); 
1ed50 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1ed60 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20  ,op==OP_Gt);.   
1ed70 20 20 20 61 73 73 65 72 74 28 54 4b 5f 47 45 3d     assert(TK_GE=
1ed80 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74 63 61 73  =OP_Ge); testcas
1ed90 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64  e(op==OP_Ge); Vd
1eda0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
1edb0 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20  p==OP_Ge);.     
1edc0 20 61 73 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f   assert(TK_EQ==O
1edd0 50 5f 45 71 29 3b 20 74 65 73 74 63 61 73 65 28  P_Eq); testcase(
1ede0 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65  op==OP_Eq); Vdbe
1edf0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
1ee00 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20 20 20 61  =OP_Eq);.      a
1ee10 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f  ssert(TK_NE==OP_
1ee20 4e 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Ne); testcase(op
1ee30 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f  ==OP_Ne); VdbeCo
1ee40 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1ee50 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20 74 65 73  P_Ne);.      tes
1ee60 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1ee70 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
1ee80 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
1ee90 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1eea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eeb0 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
1eec0 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
1eed0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1eee0 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20  =TK_IS );.      
1eef0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
1ef00 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
1ef10 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
1ef20 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
1ef30 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26   pExpr->pLeft, &
1ef40 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1ef50 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ef60 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ef70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
1ef80 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20   &regFree2);.   
1ef90 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d 54 4b 5f     op = (op==TK_
1efa0 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a 20 54 4b  IS) ? TK_EQ : TK
1efb0 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  _NE;.      codeC
1efc0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
1efd0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
1efe0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
1f010 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
1f020 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1f030 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45  geIf(v, op==TK_E
1f040 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  Q);.      VdbeCo
1f050 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1f060 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65  TK_NE);.      te
1f070 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
1f080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1f090 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
1f0a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f0b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f0c0 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
1f0d0 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
1f0e0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1f0f0 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
1f100 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74  IsNull );   test
1f110 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  case( op==TK_ISN
1f120 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ULL );.      ass
1f130 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d  ert( TK_NOTNULL=
1f140 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74  =OP_NotNull ); t
1f150 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f160 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  NOTNULL );.     
1f170 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1f180 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1f190 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f1a0 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1f1b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1f1c0 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20 64  Op2(v, op, r1, d
1f1d0 65 73 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  est);.      Vdbe
1f1e0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f1f0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20 20  ==TK_ISNULL);.  
1f200 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f210 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  If(v, op==TK_NOT
1f220 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73  NULL);.      tes
1f230 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f240 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
1f250 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f260 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
1f270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f280 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f290 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42  .      exprCodeB
1f2a0 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70  etween(pParse, p
1f2b0 45 78 70 72 2c 20 64 65 73 74 2c 20 31 2c 20 6a  Expr, dest, 1, j
1f2c0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1f2d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1f2e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f2f0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
1f300 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
1f310 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
1f320 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
1f330 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1f340 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
1f350 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e 75 6c 6c  ull = jumpIfNull
1f360 20 3f 20 64 65 73 74 20 3a 20 64 65 73 74 49 66   ? dest : destIf
1f370 46 61 6c 73 65 3b 0a 20 20 20 20 20 20 73 71 6c  False;.      sql
1f380 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
1f390 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
1f3a0 73 74 49 66 46 61 6c 73 65 2c 20 64 65 73 74 49  stIfFalse, destI
1f3b0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1f3c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1f3d0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
1f3e0 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
1f3f0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1f400 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
1f410 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1f420 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f430 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
1f440 20 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61      if( exprAlwa
1f450 79 73 54 72 75 65 28 70 45 78 70 72 29 20 29 7b  ysTrue(pExpr) ){
1f460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1f480 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
1f490 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f4a0 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
1f4b0 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
1f4c0 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a 2f 0a 20     /* No-op */. 
1f4d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f4e0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f4f0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f500 72 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67  rse, pExpr, &reg
1f510 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Free1);.        
1f520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f530 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72 31 2c 20  3(v, OP_If, r1, 
1f540 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1f550 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  !=0);.        Vd
1f560 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1f570 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1f580 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
1f590 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f5a0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1f5b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f5c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1f5d0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1f5e0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1f5f0 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73  , regFree1);.  s
1f600 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
1f610 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
1f620 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a 2f 2a 0a  Free2);  .}../*.
1f630 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
1f640 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
1f650 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
1f660 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
1f670 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
1f680 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
1f690 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
1f6a0 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
1f6b0 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
1f6c0 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
1f6d0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1f6e0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
1f6f0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
1f700 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1f710 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
1f720 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
1f730 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
1f740 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c 49 54 45  IfNull is SQLITE
1f750 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f 72 20 66  _JUMPIFNULL or f
1f760 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
1f770 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20 69 73 20  umpIfNull.** is 
1f780 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
1f790 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50 61  e3ExprIfFalse(Pa
1f7a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1f7b0 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
1f7c0 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  st, int jumpIfNu
1f7d0 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ll){.  Vdbe *v =
1f7e0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1f7f0 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
1f800 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20 30  int regFree1 = 0
1f810 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32  ;.  int regFree2
1f820 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 31 2c 20   = 0;.  int r1, 
1f830 72 32 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a  r2;..  assert( j
1f840 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51 4c 49 54  umpIfNull==SQLIT
1f850 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 7c 7c 20  E_JUMPIFNULL || 
1f860 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b  jumpIfNull==0 );
1f870 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d  .  if( NEVER(v==
1f880 30 29 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  0) ) return; /* 
1f890 45 78 69 73 74 65 6e 63 65 20 6f 66 20 56 44 42  Existence of VDB
1f8a0 45 20 63 68 65 63 6b 65 64 20 62 79 20 63 61 6c  E checked by cal
1f8b0 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ler */.  if( pEx
1f8c0 70 72 3d 3d 30 20 29 20 20 20 20 72 65 74 75 72  pr==0 )    retur
1f8d0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  n;..  /* The val
1f8e0 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20  ue of pExpr->op 
1f8f0 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74  and op are relat
1f900 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
1f910 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70   **.  **       p
1f920 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
1f930 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20      op.  **     
1f940 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20    ---------     
1f950 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a       ----------.
1f960 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53    **       TK_IS
1f970 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50  NULL          OP
1f980 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20  _NotNull.  **   
1f990 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20      TK_NOTNULL  
1f9a0 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c         OP_IsNull
1f9b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e  .  **       TK_N
1f9c0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1f9d0 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Eq.  **       
1f9e0 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20 20 20  TK_EQ           
1f9f0 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20     OP_Ne.  **   
1fa00 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20      TK_GT       
1fa10 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a         OP_Le.  *
1fa20 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20  *       TK_LE   
1fa30 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74             OP_Gt
1fa40 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47  .  **       TK_G
1fa50 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  E              O
1fa60 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20  P_Lt.  **       
1fa70 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20  TK_LT           
1fa80 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20     OP_Ge.  **.  
1fa90 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c  ** For other val
1faa0 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70  ues of pExpr->op
1fab0 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65  , op is undefine
1fac0 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20  d and unused..  
1fad0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
1fae0 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73  TK_ and OP_ cons
1faf0 74 61 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67  tants are arrang
1fb00 65 64 20 73 75 63 68 20 74 68 61 74 20 77 65 0a  ed such that we.
1fb10 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65    ** can compute
1fb20 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f   the mapping abo
1fb30 76 65 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c  ve using the fol
1fb40 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f  lowing expressio
1fb50 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29  n..  ** Assert()
1fb60 73 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  s verify that th
1fb70 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
1fb80 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20   correct..  */. 
1fb90 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f   op = ((pExpr->o
1fba0 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29  p+(TK_ISNULL&1))
1fbb0 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  ^1)-(TK_ISNULL&1
1fbc0 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
1fbd0 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e  correct alignmen
1fbe0 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  t of TK_ and OP_
1fbf0 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a   constants.  */.
1fc00 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1fc10 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c  >op!=TK_ISNULL |
1fc20 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  | op==OP_NotNull
1fc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1fc40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e  xpr->op!=TK_NOTN
1fc50 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73  ULL || op==OP_Is
1fc60 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Null );.  assert
1fc70 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
1fc80 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20  NE || op==OP_Eq 
1fc90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1fca0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c  pr->op!=TK_EQ ||
1fcb0 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20   op==OP_Ne );.  
1fcc0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1fcd0 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d  p!=TK_LT || op==
1fce0 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72  OP_Ge );.  asser
1fcf0 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1fd00 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74  _LE || op==OP_Gt
1fd10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1fd20 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c  xpr->op!=TK_GT |
1fd30 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  | op==OP_Le );. 
1fd40 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1fd50 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d  op!=TK_GE || op=
1fd60 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69  =OP_Lt );..  swi
1fd70 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
1fd80 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
1fd90 44 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  D: {.      testc
1fda0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1fdb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1fdc0 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1fdd0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1fde0 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1fdf0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1fe00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
1fe10 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
1fe20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1fe30 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1fe40 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
1fe50 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1fe60 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1fe70 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
1fe80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fe90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1fea0 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _OR: {.      int
1feb0 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
1fec0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1fed0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1fee0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
1fef0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ff00 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1ff10 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1ff20 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c  , jumpIfNull^SQL
1ff30 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1ff40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ff50 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
1ff60 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
1ff70 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
1ff80 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ff90 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
1ffa0 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
1ffb0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1ffc0 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
1ffd0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1ffe0 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
1fff0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20000 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
20010 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
20020 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c  tcase( jumpIfNul
20030 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  l==0 );.      sq
20040 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
20050 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
20060 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
20070 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
20080 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20090 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
200a0 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
200b0 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
200c0 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
200d0 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
200e0 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
200f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
20100 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
20110 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
20120 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
20130 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
20140 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
20150 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
20160 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20170 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
20180 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
20190 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
201a0 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
201b0 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
201c0 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20  >pRight, op,.   
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
201e0 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d  1, r2, dest, jum
201f0 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
20200 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50  assert(TK_LT==OP
20210 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Lt); testcase(o
20220 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43  p==OP_Lt); VdbeC
20230 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
20240 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73  OP_Lt);.      as
20250 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  sert(TK_LE==OP_L
20260 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  e); testcase(op=
20270 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76  =OP_Le); VdbeCov
20280 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
20290 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Le);.      asse
202a0 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29  rt(TK_GT==OP_Gt)
202b0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
202c0 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Gt); VdbeCover
202d0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
202e0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
202f0 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20  (TK_GE==OP_Ge); 
20300 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
20310 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Ge); VdbeCoverag
20320 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29  eIf(v,op==OP_Ge)
20330 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
20340 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65  K_EQ==OP_Eq); te
20350 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71  stcase(op==OP_Eq
20360 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
20370 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a  f(v,op==OP_Eq);.
20380 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
20390 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74  NE==OP_Ne); test
203a0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  case(op==OP_Ne);
203b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
203c0 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20  v,op==OP_Ne);.  
203d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
203e0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
203f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
20400 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
20410 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20420 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20     case TK_IS:. 
20430 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
20440 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
20450 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
20460 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74 65  K_IS );.      te
20470 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
20480 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
20490 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
204a0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
204b0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
204c0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
204d0 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
204e0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
204f0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
20500 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
20510 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 70 45  ;.      op = (pE
20520 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 29 20  xpr->op==TK_IS) 
20530 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45 51 3b  ? TK_NE : TK_EQ;
20540 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
20550 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
20560 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
20570 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
20590 2c 20 72 32 2c 20 64 65 73 74 2c 20 53 51 4c 49  , r2, dest, SQLI
205a0 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20  TE_NULLEQ);.    
205b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
205c0 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a  (v, op==TK_EQ);.
205d0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
205e0 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
205f0 45 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  E);.      testca
20600 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20610 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20620 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
20630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20640 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20650 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
20660 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
20670 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
20680 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
20690 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
206a0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
206b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
206c0 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20  beAddOp2(v, op, 
206d0 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  r1, dest);.     
206e0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
206f0 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20 20 56 64  K_ISNULL );   Vd
20700 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
20710 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a  op==TK_ISNULL);.
20720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20730 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29  op==TK_NOTNULL )
20740 3b 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ;  VdbeCoverageI
20750 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e  f(v, op==TK_NOTN
20760 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
20770 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d  case( regFree1==
20780 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
207a0 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
207b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
207c0 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a  umpIfNull==0 );.
207d0 20 20 20 20 20 20 65 78 70 72 43 6f 64 65 42 65        exprCodeBe
207e0 74 77 65 65 6e 28 70 50 61 72 73 65 2c 20 70 45  tween(pParse, pE
207f0 78 70 72 2c 20 64 65 73 74 2c 20 30 2c 20 6a 75  xpr, dest, 0, ju
20800 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
20810 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
20820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20830 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
20840 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
20850 20 20 20 69 66 28 20 6a 75 6d 70 49 66 4e 75 6c     if( jumpIfNul
20860 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
20870 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28 70  ite3ExprCodeIN(p
20880 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65  Parse, pExpr, de
20890 73 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  st, dest);.     
208a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
208b0 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 3d  int destIfNull =
208c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
208d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
208e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
208f0 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70  eIN(pParse, pExp
20900 72 2c 20 64 65 73 74 2c 20 64 65 73 74 49 66 4e  r, dest, destIfN
20910 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ull);.        sq
20920 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
20930 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e  Label(v, destIfN
20940 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ull);.      }.  
20950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20960 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
20970 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
20980 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65   exprAlwaysFalse
20990 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  (pExpr) ){.     
209a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
209b0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
209c0 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
209d0 20 7d 65 6c 73 65 20 69 66 28 20 65 78 70 72 41   }else if( exprA
209e0 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
209f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e   ){.        /* n
20a00 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65  o-op */.      }e
20a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20  lse{.        r1 
20a20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
20a30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
20a40 78 70 72 2c 20 26 72 65 67 46 72 65 65 31 29 3b  xpr, &regFree1);
20a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20a60 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
20a70 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64 65 73 74  _IfNot, r1, dest
20a80 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 29  , jumpIfNull!=0)
20a90 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
20aa0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
20ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
20ac0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
20ad0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
20ae0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
20af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
20b00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
20b10 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
20b20 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
20b30 67 46 72 65 65 31 29 3b 0a 20 20 73 71 6c 69 74  gFree1);.  sqlit
20b40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
20b50 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
20b60 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  2);.}../*.** Do 
20b70 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
20b80 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
20b90 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
20ba0 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 0a  rn 0 if the two.
20bb0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
20bc0 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 64  re completely id
20bd0 65 6e 74 69 63 61 6c 2e 20 20 52 65 74 75 72 6e  entical.  Return
20be0 20 31 20 69 66 20 74 68 65 79 20 64 69 66 66 65   1 if they diffe
20bf0 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20 61 20 43  r only.** by a C
20c00 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
20c10 61 74 20 74 68 65 20 74 6f 70 20 6c 65 76 65 6c  at the top level
20c20 2e 20 20 52 65 74 75 72 6e 20 32 20 69 66 20 74  .  Return 2 if t
20c30 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
20c40 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72 20 74 68  nces.** other th
20c50 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  an the top-level
20c60 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f   COLLATE operato
20c70 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  r..**.** If any 
20c80 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
20c90 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
20ca0 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
20cb0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
20cc0 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
20cd0 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
20ce0 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
20cf0 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
20d00 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Tab..**.** The p
20d10 41 20 73 69 64 65 20 6d 69 67 68 74 20 62 65 20  A side might be 
20d20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45  using TK_REGISTE
20d30 52 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  R.  If that is t
20d40 68 65 20 63 61 73 65 20 61 6e 64 20 70 42 20 69  he case and pB i
20d50 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e 67 20 54  s.** not using T
20d60 4b 5f 52 45 47 49 53 54 45 52 20 62 75 74 20 69  K_REGISTER but i
20d70 73 20 6f 74 68 65 72 77 69 73 65 20 65 71 75 69  s otherwise equi
20d80 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20 73 74 69  valent, then sti
20d90 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ll return 0..**.
20da0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 69  ** Sometimes thi
20db0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
20dc0 65 74 75 72 6e 20 32 20 65 76 65 6e 20 69 66 20  eturn 2 even if 
20dd0 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
20de0 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 61 72  ons.** really ar
20df0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 49  e equivalent.  I
20e00 66 20 77 65 20 63 61 6e 6e 6f 74 20 70 72 6f 76  f we cannot prov
20e10 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
20e20 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 69 64  ssions are.** id
20e30 65 6e 74 69 63 61 6c 2c 20 77 65 20 72 65 74 75  entical, we retu
20e40 72 6e 20 32 20 6a 75 73 74 20 74 6f 20 62 65 20  rn 2 just to be 
20e50 73 61 66 65 2e 20 20 53 6f 20 69 66 20 74 68 69  safe.  So if thi
20e60 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
20e70 75 72 6e 73 20 32 2c 20 74 68 65 6e 20 79 6f 75  urns 2, then you
20e80 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6b   do not really k
20e90 6e 6f 77 20 66 6f 72 20 63 65 72 74 61 69 6e 20  now for certain 
20ea0 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a 20 65 78  if the two.** ex
20eb0 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 68  pressions are th
20ec0 65 20 73 61 6d 65 2e 20 20 42 75 74 20 69 66 20  e same.  But if 
20ed0 79 6f 75 20 67 65 74 20 61 20 30 20 6f 72 20 31  you get a 0 or 1
20ee0 20 72 65 74 75 72 6e 2c 20 74 68 65 6e 20 79 6f   return, then yo
20ef0 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73 75 72 65  u.** can be sure
20f00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
20f10 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20   are the same.  
20f20 49 6e 20 74 68 65 20 70 6c 61 63 65 73 20 77 68  In the places wh
20f30 65 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ere.** this rout
20f40 69 6e 65 20 69 73 20 75 73 65 64 2c 20 69 74 20  ine is used, it 
20f50 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 74 6f  does not hurt to
20f60 20 67 65 74 20 61 6e 20 65 78 74 72 61 20 32 20   get an extra 2 
20f70 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73 74 20 6d  - that.** just m
20f80 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 73  ight result in s
20f90 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20 73 6c 6f  ome slightly slo
20fa0 77 65 72 20 63 6f 64 65 2e 20 20 42 75 74 20 72  wer code.  But r
20fb0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 6e 20 69  eturning.** an i
20fc0 6e 63 6f 72 72 65 63 74 20 30 20 6f 72 20 31 20  ncorrect 0 or 1 
20fd0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
20fe0 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  malfunction..*/.
20ff0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
21000 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
21010 20 45 78 70 72 20 2a 70 42 2c 20 69 6e 74 20 69   Expr *pB, int i
21020 54 61 62 29 7b 0a 20 20 75 33 32 20 63 6f 6d 62  Tab){.  u32 comb
21030 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20 69 66 28  inedFlags;.  if(
21040 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
21050 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
21060 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b 0a 20 20  ==pA ? 0 : 2;.  
21070 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  }.  combinedFlag
21080 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73 20 7c 20  s = pA->flags | 
21090 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 66 28  pB->flags;.  if(
210a0 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26   combinedFlags &
210b0 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 29 7b 0a   EP_IntValue ){.
210c0 20 20 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61      if( (pA->fla
210d0 67 73 26 70 42 2d 3e 66 6c 61 67 73 26 45 50 5f  gs&pB->flags&EP_
210e0 49 6e 74 56 61 6c 75 65 29 21 3d 30 20 26 26 20  IntValue)!=0 && 
210f0 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d 3d 70 42  pA->u.iValue==pB
21100 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b 0a 20 20  ->u.iValue ){.  
21110 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
21120 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32    }.    return 2
21130 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
21140 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b 0a 20 20  op!=pB->op ){.  
21150 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d 3d 54 4b    if( pA->op==TK
21160 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c 69  _COLLATE && sqli
21170 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
21180 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c 20 69 54  A->pLeft, pB, iT
21190 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  ab)<2 ){.      r
211a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
211b0 20 20 20 69 66 28 20 70 42 2d 3e 6f 70 3d 3d 54     if( pB->op==T
211c0 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73 71 6c  K_COLLATE && sql
211d0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
211e0 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69  pA, pB->pLeft, i
211f0 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20 20 20  Tab)<2 ){.      
21200 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
21210 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
21220 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
21230 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57  TK_COLUMN && ALW
21240 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54 4b 5f 41  AYS(pA->op!=TK_A
21250 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 41  GG_COLUMN) && pA
21260 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20  ->u.zToken ){.  
21270 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 41 2d    if( strcmp(pA-
21280 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d 3e 75 2e  >u.zToken,pB->u.
21290 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b 0a 20 20  zToken)!=0 ){.  
212a0 20 20 20 20 72 65 74 75 72 6e 20 70 41 2d 3e 6f      return pA->o
212b0 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 3f 20  p==TK_COLLATE ? 
212c0 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  1 : 2;.    }.  }
212d0 0a 20 20 69 66 28 20 28 70 41 2d 3e 66 6c 61 67  .  if( (pA->flag
212e0 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29  s & EP_Distinct)
212f0 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20 26 20 45  !=(pB->flags & E
21300 50 5f 44 69 73 74 69 6e 63 74 29 20 29 20 72 65  P_Distinct) ) re
21310 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 41 4c  turn 2;.  if( AL
21320 57 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c  WAYS((combinedFl
21330 61 67 73 20 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e  ags & EP_TokenOn
21340 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ly)==0) ){.    i
21350 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73  f( combinedFlags
21360 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
21370 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
21380 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21390 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
213a0 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20 69 54 61  , pB->pLeft, iTa
213b0 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
213c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
213d0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
213e0 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
213f0 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72 6e  , iTab) ) return
21400 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   2;.    if( sqli
21410 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
21420 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73 74 2c 20  re(pA->x.pList, 
21430 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54 61  pB->x.pList, iTa
21440 62 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  b) ) return 2;. 
21450 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 28 63     if( ALWAYS((c
21460 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20 26 20 45  ombinedFlags & E
21470 50 5f 52 65 64 75 63 65 64 29 3d 3d 30 29 20 29  P_Reduced)==0) )
21480 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e  {.      if( pA->
21490 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
214a0 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 32 3b  lumn ) return 2;
214b0 0a 20 20 20 20 20 20 69 66 28 20 70 41 2d 3e 69  .      if( pA->i
214c0 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
214d0 65 20 0a 20 20 20 20 20 20 20 26 26 20 28 70 41  e .       && (pA
214e0 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
214f0 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69 54 61 62  | NEVER(pB->iTab
21500 6c 65 3e 3d 30 29 29 20 29 20 72 65 74 75 72 6e  le>=0)) ) return
21510 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   2;.    }.  }.  
21520 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
21530 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 45  ** Compare two E
21540 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 2e  xprList objects.
21550 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
21560 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
21570 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72   and .** non-zer
21580 6f 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  o if they differ
21590 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
215a0 2a 2a 20 49 66 20 61 6e 79 20 73 75 62 65 6c 65  ** If any subele
215b0 6d 65 6e 74 20 6f 66 20 70 42 20 68 61 73 20 45  ment of pB has E
215c0 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28 2d 31 29  xpr.iTable==(-1)
215d0 20 74 68 65 6e 20 69 74 20 69 73 20 61 6c 6c 6f   then it is allo
215e0 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d 70 61 72  wed.** to compar
215f0 65 20 65 71 75 61 6c 20 74 6f 20 61 6e 20 65 71  e equal to an eq
21600 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d 65 6e 74  uivalent element
21610 20 69 6e 20 70 41 20 77 69 74 68 20 45 78 70 72   in pA with Expr
21620 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a  .iTable==iTab..*
21630 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21640 65 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 6e  e might return n
21650 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65 71 75 69  on-zero for equi
21660 76 61 6c 65 6e 74 20 45 78 70 72 4c 69 73 74 73  valent ExprLists
21670 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c 79 20 63  .  The.** only c
21680 6f 6e 73 65 71 75 65 6e 63 65 20 77 69 6c 6c 20  onsequence will 
21690 62 65 20 64 69 73 61 62 6c 65 64 20 6f 70 74 69  be disabled opti
216a0 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42 75 74 20  mizations.  But 
216b0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
216c0 6d 75 73 74 20 6e 65 76 65 72 20 72 65 74 75 72  must never retur
216d0 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 45  n 0 if the two E
216e0 78 70 72 4c 69 73 74 20 6f 62 6a 65 63 74 73 20  xprList objects 
216f0 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 6f  are different, o
21700 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e 63 74 69  r.** a malfuncti
21710 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 2e 0a  on will result..
21720 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 70  **.** Two NULL p
21730 6f 69 6e 74 65 72 73 20 61 72 65 20 63 6f 6e 73  ointers are cons
21740 69 64 65 72 65 64 20 74 6f 20 62 65 20 74 68 65  idered to be the
21750 20 73 61 6d 65 2e 20 20 42 75 74 20 61 20 4e 55   same.  But a NU
21760 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 61 6c  LL pointer.** al
21770 77 61 79 73 20 64 69 66 66 65 72 73 20 66 72 6f  ways differs fro
21780 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69  m a non-NULL poi
21790 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
217a0 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
217b0 61 72 65 28 45 78 70 72 4c 69 73 74 20 2a 70 41  are(ExprList *pA
217c0 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 42 2c 20  , ExprList *pB, 
217d0 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 6e 74  int iTab){.  int
217e0 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
217f0 26 26 20 70 42 3d 3d 30 20 29 20 72 65 74 75 72  && pB==0 ) retur
21800 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  n 0;.  if( pA==0
21810 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72 65 74 75   || pB==0 ) retu
21820 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 1;.  if( pA->
21830 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45 78 70 72  nExpr!=pB->nExpr
21840 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
21850 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 6e 45  or(i=0; i<pA->nE
21860 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
21870 78 70 72 20 2a 70 45 78 70 72 41 20 3d 20 70 41  xpr *pExprA = pA
21880 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
21890 20 20 45 78 70 72 20 2a 70 45 78 70 72 42 20 3d    Expr *pExprB =
218a0 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pB->a[i].pExpr;
218b0 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 61 5b 69  .    if( pA->a[i
218c0 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d 70 42 2d  ].sortOrder!=pB-
218d0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
218e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
218f0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21900 6f 6d 70 61 72 65 28 70 45 78 70 72 41 2c 20 70  ompare(pExprA, p
21910 45 78 70 72 42 2c 20 69 54 61 62 29 20 29 20 72  ExprB, iTab) ) r
21920 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
21930 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
21940 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
21950 20 77 65 20 63 61 6e 20 70 72 6f 76 65 20 74 68   we can prove th
21960 65 20 70 45 32 20 77 69 6c 6c 20 61 6c 77 61 79  e pE2 will alway
21970 73 20 62 65 20 74 72 75 65 20 69 66 20 70 45 31  s be true if pE1
21980 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20 20 52 65   is.** true.  Re
21990 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 77 65  turn false if we
219a0 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   cannot complete
219b0 20 74 68 65 20 70 72 6f 6f 66 20 6f 72 20 69 66   the proof or if
219c0 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a 20 62 65   pE2 might.** be
219d0 20 66 61 6c 73 65 2e 20 20 45 78 61 6d 70 6c 65   false.  Example
219e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 45 31  s:.**.**     pE1
219f0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 70 45 32  : x==5       pE2
21a00 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
21a10 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a     Result: true.
21a20 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3e 30 20  **     pE1: x>0 
21a30 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 3d 35         pE2: x==5
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
21a50 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20  ult: false.**   
21a60 20 20 70 45 31 3a 20 78 3d 32 31 20 20 20 20 20    pE1: x=21     
21a70 20 20 70 45 32 3a 20 78 3d 32 31 20 4f 52 20 79    pE2: x=21 OR y
21a80 3d 34 33 20 20 20 20 20 52 65 73 75 6c 74 3a 20  =43     Result: 
21a90 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21aa0 20 78 21 3d 31 32 33 20 20 20 20 20 70 45 32 3a   x!=123     pE2:
21ab0 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21ac0 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
21ad0 2a 20 20 20 20 20 70 45 31 3a 20 78 21 3d 3f 31  *     pE1: x!=?1
21ae0 20 20 20 20 20 20 70 45 32 3a 20 78 20 49 53 20        pE2: x IS 
21af0 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
21b00 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20  lt: true.**     
21b10 70 45 31 3a 20 78 20 49 53 20 4e 55 4c 4c 20 20  pE1: x IS NULL  
21b20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55  pE2: x IS NOT NU
21b30 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 66 61  LL    Result: fa
21b40 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20  lse.**     pE1: 
21b50 78 20 49 53 20 3f 32 20 20 20 20 70 45 32 3a 20  x IS ?2    pE2: 
21b60 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  x IS NOT NULL   
21b70 20 52 65 75 73 6c 74 3a 20 66 61 6c 73 65 0a 2a   Reuslt: false.*
21b80 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d 70 61 72  *.** When compar
21b90 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ing TK_COLUMN no
21ba0 64 65 73 20 62 65 74 77 65 65 6e 20 70 45 31 20  des between pE1 
21bb0 61 6e 64 20 70 45 32 2c 20 69 66 20 70 45 32 20  and pE2, if pE2 
21bc0 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69 54 61 62  has.** Expr.iTab
21bd0 6c 65 3c 30 20 74 68 65 6e 20 61 73 73 75 6d 65  le<0 then assume
21be0 20 61 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20   a table number 
21bf0 67 69 76 65 6e 20 62 79 20 69 54 61 62 2e 0a 2a  given by iTab..*
21c00 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20 64 6f 75  *.** When in dou
21c10 62 74 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  bt, return false
21c20 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 74 72 75  .  Returning tru
21c30 65 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  e might give a p
21c40 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6d  erformance.** im
21c50 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52 65 74 75  provement.  Retu
21c60 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d 69 67 68  rning false migh
21c70 74 20 63 61 75 73 65 20 61 20 70 65 72 66 6f 72  t cause a perfor
21c80 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2c  mance reduction,
21c90 20 62 75 74 0a 2a 2a 20 69 74 20 77 69 6c 6c 20   but.** it will 
21ca0 61 6c 77 61 79 73 20 67 69 76 65 20 74 68 65 20  always give the 
21cb0 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 61  correct answer a
21cc0 6e 64 20 69 73 20 68 65 6e 63 65 20 61 6c 77 61  nd is hence alwa
21cd0 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69 6e 74 20  ys safe..*/.int 
21ce0 73 71 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69  sqlite3ExprImpli
21cf0 65 73 45 78 70 72 28 45 78 70 72 20 2a 70 45 31  esExpr(Expr *pE1
21d00 2c 20 45 78 70 72 20 2a 70 45 32 2c 20 69 6e 74  , Expr *pE2, int
21d10 20 69 54 61 62 29 7b 0a 20 20 69 66 28 20 73 71   iTab){.  if( sq
21d20 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
21d30 28 70 45 31 2c 20 70 45 32 2c 20 69 54 61 62 29  (pE1, pE2, iTab)
21d40 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
21d50 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
21d60 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 0a 20 20  E2->op==TK_OR.  
21d70 20 26 26 20 28 73 71 6c 69 74 65 33 45 78 70 72   && (sqlite3Expr
21d80 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c  ImpliesExpr(pE1,
21d90 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61   pE2->pLeft, iTa
21da0 62 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b).             
21db0 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  || sqlite3ExprIm
21dc0 70 6c 69 65 73 45 78 70 72 28 70 45 31 2c 20 70  pliesExpr(pE1, p
21dd0 45 32 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  E2->pRight, iTab
21de0 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ) ).  ){.    ret
21df0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
21e00 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f 54   pE2->op==TK_NOT
21e10 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71 6c 69 74  NULL.   && sqlit
21e20 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
21e30 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32 2d 3e 70  1->pLeft, pE2->p
21e40 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d 30 0a 20  Left, iTab)==0. 
21e50 20 20 26 26 20 28 70 45 31 2d 3e 6f 70 21 3d 54    && (pE1->op!=T
21e60 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70 45 31 2d  K_ISNULL && pE1-
21e70 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20 20 29 7b  >op!=TK_IS).  ){
21e80 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
21e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21ea0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
21eb0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
21ec0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69  wing structure i
21ed0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 72  s used by the tr
21ee0 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20 74 6f 20  ee walker.** to 
21ef0 63 6f 75 6e 74 20 72 65 66 65 72 65 6e 63 65 73  count references
21f00 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e   to table column
21f10 73 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s in the argumen
21f20 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20 61 67 67  ts of an .** agg
21f30 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
21f40 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6d 70   in order to imp
21f50 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 73 71  lement the.** sq
21f60 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 54 68 69  lite3FunctionThi
21f70 73 53 72 63 28 29 20 72 6f 75 74 69 6e 65 2e 0a  sSrc() routine..
21f80 2a 2f 0a 73 74 72 75 63 74 20 53 72 63 43 6f 75  */.struct SrcCou
21f90 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  nt {.  SrcList *
21fa0 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e 65 20 70  pSrc;   /* One p
21fb0 61 72 74 69 63 75 6c 61 72 20 46 52 4f 4d 20 63  articular FROM c
21fc0 6c 61 75 73 65 20 69 6e 20 61 20 6e 65 73 74 65  lause in a neste
21fd0 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  d query */.  int
21fe0 20 6e 54 68 69 73 3b 20 20 20 20 20 20 20 2f 2a   nThis;       /*
21ff0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
22000 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
22010 20 69 6e 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a   in pSrcList */.
22020 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b 20 20 20    int nOther;   
22030 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22040 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
22050 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65 72 20 46  lumns in other F
22060 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a 2f 0a 7d  ROM clauses */.}
22070 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ;../*.** Count t
22080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
22090 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
220a0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
220b0 74 20 65 78 70 72 53 72 63 43 6f 75 6e 74 28 57  t exprSrcCount(W
220c0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
220d0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
220e0 2f 2a 20 54 68 65 20 4e 45 56 45 52 28 29 20 6f  /* The NEVER() o
220f0 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72  n the second ter
22100 6d 20 69 73 20 62 65 63 61 75 73 65 20 73 71 6c  m is because sql
22110 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
22120 54 68 69 73 53 72 63 28 29 0a 20 20 2a 2a 20 69  ThisSrc().  ** i
22130 73 20 61 6c 77 61 79 73 20 63 61 6c 6c 65 64 20  s always called 
22140 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 45 78  before sqlite3Ex
22150 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
22160 74 65 73 28 29 20 61 6e 64 20 73 6f 20 74 68 65  tes() and so the
22170 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 73  .  ** TK_COLUMNs
22180 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62 65   have not yet be
22190 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  en converted int
221a0 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 2e  o TK_AGG_COLUMN.
221b0 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c 69 74 65    If.  ** sqlite
221c0 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
221d0 73 53 72 63 28 29 20 69 73 20 75 73 65 64 20 64  sSrc() is used d
221e0 69 66 66 65 72 65 6e 74 6c 79 20 69 6e 20 74 68  ifferently in th
221f0 65 20 66 75 74 75 72 65 2c 20 74 68 65 0a 20 20  e future, the.  
22200 2a 2a 20 4e 45 56 45 52 28 29 20 77 69 6c 6c 20  ** NEVER() will 
22210 6e 65 65 64 20 74 6f 20 62 65 20 72 65 6d 6f 76  need to be remov
22220 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ed. */.  if( pEx
22230 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
22240 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45 78 70 72  N || NEVER(pExpr
22250 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
22260 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  UMN) ){.    int 
22270 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  i;.    struct Sr
22280 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70 57 61 6c  cCount *p = pWal
22290 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f 75 6e 74  ker->u.pSrcCount
222a0 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  ;.    SrcList *p
222b0 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
222c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
222d0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
222e0 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
222f0 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63 2d 3e 61  >iTable==pSrc->a
22300 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
22310 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
22320 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 20  f( i<pSrc->nSrc 
22330 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 68 69  ){.      p->nThi
22340 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s++;.    }else{.
22350 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68 65 72 2b        p->nOther+
22360 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
22370 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
22380 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  ue;.}../*.** Det
22390 65 72 6d 69 6e 65 20 69 66 20 61 6e 79 20 6f 66  ermine if any of
223a0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
223b0 6f 20 74 68 65 20 70 45 78 70 72 20 46 75 6e 63  o the pExpr Func
223c0 74 69 6f 6e 20 72 65 66 65 72 65 6e 63 65 0a 2a  tion reference.*
223d0 2a 20 70 53 72 63 4c 69 73 74 2e 20 20 52 65 74  * pSrcList.  Ret
223e0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 79  urn true if they
223f0 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65 74 75 72   do.  Also retur
22400 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 66 75  n true if the fu
22410 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 6e 6f  nction.** has no
22420 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20 68 61   arguments or ha
22430 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61 6e 74 20  s only constant 
22440 61 72 67 75 6d 65 6e 74 73 2e 20 20 52 65 74 75  arguments.  Retu
22450 72 6e 20 66 61 6c 73 65 20 69 66 20 70 45 78 70  rn false if pExp
22460 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20  r.** references 
22470 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e 6f 74 20  columns but not 
22480 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61 62 6c 65  columns of table
22490 73 20 66 6f 75 6e 64 20 69 6e 20 70 53 72 63 4c  s found in pSrcL
224a0 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
224b0 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
224c0 68 69 73 53 72 63 28 45 78 70 72 20 2a 70 45 78  hisSrc(Expr *pEx
224d0 70 72 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  pr, SrcList *pSr
224e0 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c 6b 65 72  cList){.  Walker
224f0 20 77 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   w;.  struct Src
22500 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20 61 73 73  Count cnt;.  ass
22510 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
22520 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
22530 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
22540 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
22550 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
22560 20 3d 20 65 78 70 72 53 72 63 43 6f 75 6e 74 3b   = exprSrcCount;
22570 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f 75 6e 74  .  w.u.pSrcCount
22580 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e 74 2e 70   = &cnt;.  cnt.p
22590 53 72 63 20 3d 20 70 53 72 63 4c 69 73 74 3b 0a  Src = pSrcList;.
225a0 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d 20 30 3b    cnt.nThis = 0;
225b0 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72 20 3d 20  .  cnt.nOther = 
225c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  0;.  sqlite3Walk
225d0 45 78 70 72 4c 69 73 74 28 26 77 2c 20 70 45 78  ExprList(&w, pEx
225e0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
225f0 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54 68 69 73  return cnt.nThis
22600 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74 68 65 72  >0 || cnt.nOther
22610 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ==0;.}../*.** Ad
22620 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
22630 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d  to the pAggInfo-
22640 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 2e 20 20  >aCol[] array.  
22650 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
22660 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
22670 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
22680 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
22690 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
226a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
226b0 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d   addAggInfoColum
226c0 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41  n(sqlite3 *db, A
226d0 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a  ggInfo *pInfo){.
226e0 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f    int i;.  pInfo
226f0 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ->aCol = sqlite3
22700 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
22710 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
22720 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c 0a 20 20   pInfo->aCol,.  
22730 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e 66       sizeof(pInf
22740 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a 20 20 20  o->aCol[0]),.   
22750 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 43 6f 6c      &pInfo->nCol
22760 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  umn,.       &i. 
22770 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
22780 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  }    ../*.** Add
22790 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
227a0 6f 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e  o the pAggInfo->
227b0 61 46 75 6e 63 5b 5d 20 61 72 72 61 79 2e 20 20  aFunc[] array.  
227c0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
227d0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 65   of.** the new e
227e0 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  lement.  Return 
227f0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
22800 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  r if malloc fail
22810 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22820 20 61 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28   addAggInfoFunc(
22830 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 67 67  sqlite3 *db, Agg
22840 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  Info *pInfo){.  
22850 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66 6f 2d 3e  int i;.  pInfo->
22860 61 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 41  aFunc = sqlite3A
22870 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
22880 20 20 20 20 20 64 62 2c 20 0a 20 20 20 20 20 20       db, .      
22890 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 0a 20   pInfo->aFunc,. 
228a0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 49 6e        sizeof(pIn
228b0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29 2c 0a 20  fo->aFunc[0]),. 
228c0 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e 46        &pInfo->nF
228d0 75 6e 63 2c 0a 20 20 20 20 20 20 20 26 69 0a 20  unc,.       &i. 
228e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a   );.  return i;.
228f0 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  }    ../*.** Thi
22900 73 20 69 73 20 74 68 65 20 78 45 78 70 72 43 61  s is the xExprCa
22910 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20 74 72 65  llback for a tre
22920 65 20 77 61 6c 6b 65 72 2e 20 20 49 74 20 69 73  e walker.  It is
22930 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69 6d 70 6c   used to.** impl
22940 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 45 78 70  ement sqlite3Exp
22950 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
22960 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See 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 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
22990 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
229a0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
229b0 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72   int analyzeAggr
229c0 65 67 61 74 65 28 57 61 6c 6b 65 72 20 2a 70 57  egate(Walker *pW
229d0 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
229e0 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
229f0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
22a00 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
22a10 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  C;.  Parse *pPar
22a20 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
22a30 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  ;.  SrcList *pSr
22a40 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
22a50 63 4c 69 73 74 3b 0a 20 20 41 67 67 49 6e 66 6f  cList;.  AggInfo
22a60 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 4e 43   *pAggInfo = pNC
22a70 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a 20 20 73  ->pAggInfo;..  s
22a80 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
22a90 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
22aa0 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
22ab0 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
22ac0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
22ad0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
22ae0 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
22af0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
22b00 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
22b10 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 43  MN );.      /* C
22b20 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
22b30 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 69 6e 20  he column is in 
22b40 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
22b50 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20  s in the FROM.  
22b60 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66      ** clause of
22b70 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71   the aggregate q
22b80 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  uery */.      if
22b90 28 20 41 4c 57 41 59 53 28 70 53 72 63 4c 69 73  ( ALWAYS(pSrcLis
22ba0 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  t!=0) ){.       
22bb0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22bc0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 70 53  item *pItem = pS
22bd0 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  rcList->a;.     
22be0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
22bf0 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
22c00 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
22c10 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
22c20 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 3b  gInfo_col *pCol;
22c30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22c40 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
22c50 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f  rty(pExpr, EP_To
22c60 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
22c70 65 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ed) );.         
22c80 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
22c90 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75 72 73  le==pItem->iCurs
22ca0 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
22cb0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
22cc0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
22cd0 6d 65 61 6e 73 20 74 68 61 74 20 70 45 78 70 72  means that pExpr
22ce0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
22cf0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
22d00 2a 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  * that is in the
22d10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
22d20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 71 75  the aggregate qu
22d30 65 72 79 2e 20 20 0a 20 20 20 20 20 20 20 20 20  ery.  .         
22d40 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
22d50 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74    ** Make an ent
22d60 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
22d70 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d 3e 61  n in pAggInfo->a
22d80 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72 65 0a 20  Col[] if there. 
22d90 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
22da0 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79 20 74 68   not an entry th
22db0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
22dc0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
22dd0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
22de0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
22df0 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  = pAggInfo->aCol
22e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
22e10 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67 49 6e 66  r(k=0; k<pAggInf
22e20 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 2c  o->nColumn; k++,
22e30 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
22e40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
22e50 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d  ->iTable==pExpr-
22e60 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20  >iTable &&.     
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
22e80 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70  l->iColumn==pExp
22e90 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  r->iColumn ){.  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
22eb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
22ec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22ed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
22ee0 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e 66 6f 2d  f( (k>=pAggInfo-
22ef0 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20 20 20 20  >nColumn).      
22f00 20 20 20 20 20 20 20 26 26 20 28 6b 20 3d 20 61         && (k = a
22f10 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75 6d 6e 28  ddAggInfoColumn(
22f20 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67  pParse->db, pAgg
22f30 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20 20 20 20  Info))>=0 .     
22f40 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22f50 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26          pCol = &
22f60 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 6b  pAggInfo->aCol[k
22f70 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
22f80 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d 20 70 45   pCol->pTab = pE
22f90 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
22fa0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
22fb0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
22fc0 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
22fd0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75       pCol->iColu
22fe0 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  mn = pExpr->iCol
22ff0 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  umn;.           
23000 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d 20 3d 20     pCol->iMem = 
23010 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
23030 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  ol->iSorterColum
23040 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
23050 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 45 78 70        pCol->pExp
23060 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
23070 20 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67           if( pAg
23080 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 20  gInfo->pGroupBy 
23090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
230a0 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 20     int j, n;.   
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
230c0 72 4c 69 73 74 20 2a 70 47 42 20 3d 20 70 41 67  rList *pGB = pAg
230d0 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70 42 79 3b  gInfo->pGroupBy;
230e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
230f0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23100 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20 3d 20 70  _item *pTerm = p
23110 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 20  GB->a;.         
23120 20 20 20 20 20 20 20 6e 20 3d 20 70 47 42 2d 3e         n = pGB->
23130 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  nExpr;.         
23140 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
23150 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b  j<n; j++, pTerm+
23160 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
23170 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
23180 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231a0 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
231b0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d 3e 69 54  COLUMN && pE->iT
231c0 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61  able==pExpr->iTa
231d0 62 6c 65 20 26 26 0a 20 20 20 20 20 20 20 20 20  ble &&.         
231e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 2d               pE-
231f0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
23200 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
23230 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
23250 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
23260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23290 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
232a0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3c  ->iSorterColumn<
232b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
232c0 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74       pCol->iSort
232d0 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41 67 67 49  erColumn = pAggI
232e0 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67 43 6f 6c  nfo->nSortingCol
232f0 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  umn++;.         
23300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23320 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 77   /* There is now
23330 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 70 45   an entry for pE
23340 78 70 72 20 69 6e 20 70 41 67 67 49 6e 66 6f 2d  xpr in pAggInfo-
23350 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68 65 72 0a  >aCol[] (either.
23360 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
23370 65 63 61 75 73 65 20 69 74 20 77 61 73 20 74 68  ecause it was th
23380 65 72 65 20 62 65 66 6f 72 65 20 6f 72 20 62 65  ere before or be
23390 63 61 75 73 65 20 77 65 20 6a 75 73 74 20 63 72  cause we just cr
233a0 65 61 74 65 64 20 69 74 29 2e 0a 20 20 20 20 20  eated it)..     
233b0 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e 76 65 72         ** Conver
233c0 74 20 74 68 65 20 70 45 78 70 72 20 74 6f 20 62  t the pExpr to b
233d0 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  e a TK_AGG_COLUM
233e0 4e 20 72 65 66 65 72 72 69 6e 67 20 74 6f 20 74  N referring to t
233f0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  hat.            
23400 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  ** pAggInfo->aCo
23410 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20 20 20 20  l[] entry..     
23420 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23430 20 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41        ExprSetVVA
23440 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
23450 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
23460 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
23470 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67  >pAggInfo = pAgg
23480 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
23490 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
234a0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  _AGG_COLUMN;.   
234b0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
234c0 69 41 67 67 20 3d 20 28 69 31 36 29 6b 3b 0a 20  iAgg = (i16)k;. 
234d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
234e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a  ;.          } /*
234f0 20 65 6e 64 69 66 20 70 45 78 70 72 2d 3e 69 54   endif pExpr->iT
23500 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43 75  able==pItem->iCu
23510 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
23520 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70 20 6f 76  } /* end loop ov
23530 65 72 20 70 53 72 63 4c 69 73 74 20 2a 2f 0a 20  er pSrcList */. 
23540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
23550 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
23560 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
23570 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  _AGG_FUNCTION: {
23580 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d  .      if( (pNC-
23590 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 6e  >ncFlags & NC_In
235a0 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20 20 20 20  AggFunc)==0.    
235b0 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e 77     && pWalker->w
235c0 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70 45 78 70  alkerDepth==pExp
235d0 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20 29 7b 0a  r->op2.      ){.
235e0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
235f0 20 74 6f 20 73 65 65 20 69 66 20 70 45 78 70 72   to see if pExpr
23600 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
23610 6f 66 20 61 6e 6f 74 68 65 72 20 61 67 67 72 65  of another aggre
23620 67 61 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  gate .        **
23630 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
23640 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
23650 20 70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74   pAggInfo struct
23660 75 72 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ure.        */. 
23670 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
23680 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 49 74 65  gInfo_func *pIte
23690 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  m = pAggInfo->aF
236a0 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  unc;.        for
236b0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
236c0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 49  ->nFunc; i++, pI
236d0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
236e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
236f0 72 43 6f 6d 70 61 72 65 28 70 49 74 65 6d 2d 3e  rCompare(pItem->
23700 70 45 78 70 72 2c 20 70 45 78 70 72 2c 20 2d 31  pExpr, pExpr, -1
23710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23720 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23740 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
23750 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
23760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
23770 70 45 78 70 72 20 69 73 20 6f 72 69 67 69 6e 61  pExpr is origina
23780 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65 77 20 65  l.  Make a new e
23790 6e 74 72 79 20 69 6e 20 70 41 67 67 49 6e 66 6f  ntry in pAggInfo
237a0 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20 20 20 20  ->aFunc[].      
237b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
237c0 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
237d0 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20  arse->db);.     
237e0 20 20 20 20 20 69 20 3d 20 61 64 64 41 67 67 49       i = addAggI
237f0 6e 66 6f 46 75 6e 63 28 70 50 61 72 73 65 2d 3e  nfoFunc(pParse->
23800 64 62 2c 20 70 41 67 67 49 6e 66 6f 29 3b 0a 20  db, pAggInfo);. 
23810 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
23820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23830 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23840 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
23850 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
23860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
23870 74 65 6d 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d  tem = &pAggInfo-
23880 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20  >aFunc[i];.     
23890 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45         pItem->pE
238a0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
238b0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
238c0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
238d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  >nMem;.         
238e0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
238f0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
23900 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
23910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
23920 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d 20 73 71  Item->pFunc = sq
23930 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
23940 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
23970 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
23980 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
23990 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n),.            
239a0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 78 2e         pExpr->x.
239b0 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 78  pList ? pExpr->x
239c0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  .pList->nExpr : 
239d0 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
239e0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
239f0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  r->flags & EP_Di
23a00 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
23a10 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
23a20 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73  Distinct = pPars
23a30 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
23a40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
23a60 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  m->iDistinct = -
23a70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
23a80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
23aa0 2a 20 4d 61 6b 65 20 70 45 78 70 72 20 70 6f 69  * Make pExpr poi
23ab0 6e 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70  nt to the approp
23ac0 72 69 61 74 65 20 70 41 67 67 49 6e 66 6f 2d 3e  riate pAggInfo->
23ad0 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79 0a 20 20  aFunc[] entry.  
23ae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23af0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
23b00 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
23b10 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
23b20 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
23b30 20 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50       ExprSetVVAP
23b40 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
23b50 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20  P_NoReduce);.   
23b60 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67       pExpr->iAgg
23b70 20 3d 20 28 69 31 36 29 69 3b 0a 20 20 20 20 20   = (i16)i;.     
23b80 20 20 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e     pExpr->pAggIn
23b90 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20  fo = pAggInfo;. 
23ba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
23bb0 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 7d  C_Prune;.      }
23bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
23bd0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
23be0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
23bf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
23c00 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74  C_Continue;.}.st
23c10 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65  atic int analyze
23c20 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
23c30 63 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ct(Walker *pWalk
23c40 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  er, Select *pSel
23c50 65 63 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ect){.  UNUSED_P
23c60 41 52 41 4d 45 54 45 52 28 70 57 61 6c 6b 65 72  ARAMETER(pWalker
23c70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
23c80 4d 45 54 45 52 28 70 53 65 6c 65 63 74 29 3b 0a  METER(pSelect);.
23c90 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
23ca0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
23cb0 41 6e 61 6c 79 7a 65 20 74 68 65 20 70 45 78 70  Analyze the pExp
23cc0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  r expression loo
23cd0 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
23ce0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
23cf0 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
23d00 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
23d10 65 20 61 64 64 65 64 20 74 6f 20 41 67 67 49 6e  e added to AggIn
23d20 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 20 70  fo object that p
23d30 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a 2a 2a 20  NC->pAggInfo.** 
23d40 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 64 64 69  points to.  Addi
23d50 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 61  tional entries a
23d60 72 65 20 6d 61 64 65 20 6f 6e 20 74 68 65 20 41  re made on the A
23d70 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 61 73  ggInfo object as
23d80 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a  .** necessary..*
23d90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23da0 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
23db0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
23dc0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
23dd0 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
23de0 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 73 6f  d by sqlite3Reso
23df0 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
23e00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
23e10 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
23e20 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
23e30 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
23e40 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  pr){.  Walker w;
23e50 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
23e60 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
23e70 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
23e80 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74   analyzeAggregat
23e90 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  e;.  w.xSelectCa
23ea0 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65  llback = analyze
23eb0 41 67 67 72 65 67 61 74 65 73 49 6e 53 65 6c 65  AggregatesInSele
23ec0 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  ct;.  w.u.pNC = 
23ed0 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
23ee0 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20  NC->pSrcList!=0 
23ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  );.  sqlite3Walk
23f00 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
23f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 73  .}../*.** Call s
23f20 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
23f30 65 41 67 67 72 65 67 61 74 65 73 28 29 20 66 6f  eAggregates() fo
23f40 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
23f50 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65 78 70 72  on in an.** expr
23f60 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 52 65  ession list.  Re
23f70 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
23f80 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
23f90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
23fa0 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e 61 6c 79  found, the analy
23fb0 73 69 73 20 69 73 20 63 75 74 20 73 68 6f 72 74  sis is cut short
23fc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23fd0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
23fe0 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ist(NameContext 
23ff0 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73 74 20 2a  *pNC, ExprList *
24000 70 4c 69 73 74 29 7b 0a 20 20 73 74 72 75 63 74  pList){.  struct
24010 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
24020 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
24030 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
24040 20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69     for(pItem=pLi
24050 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
24060 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
24070 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
24080 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
24090 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 4e  yzeAggregates(pN
240a0 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  C, pItem->pExpr)
240b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
240c0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
240d0 73 69 6e 67 6c 65 20 6e 65 77 20 72 65 67 69 73  single new regis
240e0 74 65 72 20 66 6f 72 20 75 73 65 20 74 6f 20 68  ter for use to h
240f0 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65 72 6d 65  old some interme
24100 64 69 61 74 65 20 72 65 73 75 6c 74 2e 0a 2a 2f  diate result..*/
24110 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
24120 65 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50  empReg(Parse *pP
24130 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
24140 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3d 3d 30  rse->nTempReg==0
24150 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2b   ){.    return +
24160 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
24170 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72   }.  return pPar
24180 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 2d 2d 70  se->aTempReg[--p
24190 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 5d  Parse->nTempReg]
241a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
241b0 6f 63 61 74 65 20 61 20 72 65 67 69 73 74 65 72  ocate a register
241c0 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69 6c 61 62  , making availab
241d0 6c 65 20 66 6f 72 20 72 65 75 73 65 20 66 6f 72  le for reuse for
241e0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
241f0 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  urpose..**.** If
24200 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 63   a register is c
24210 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 75  urrently being u
24220 73 65 64 20 62 79 20 74 68 65 20 63 6f 6c 75 6d  sed by the colum
24230 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 0a 2a 2a  n cache, then.**
24240 20 74 68 65 20 64 65 61 6c 6c 6f 63 61 74 69 6f   the deallocatio
24250 6e 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  n is deferred un
24260 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63  til the column c
24270 61 63 68 65 20 6c 69 6e 65 20 74 68 61 74 20 75  ache line that u
24280 73 65 73 0a 2a 2a 20 74 68 65 20 72 65 67 69 73  ses.** the regis
24290 74 65 72 20 62 65 63 6f 6d 65 73 20 73 74 61 6c  ter becomes stal
242a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
242b0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
242c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
242d0 69 6e 74 20 69 52 65 67 29 7b 0a 20 20 69 66 28  int iReg){.  if(
242e0 20 69 52 65 67 20 26 26 20 70 50 61 72 73 65 2d   iReg && pParse-
242f0 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53  >nTempReg<ArrayS
24300 69 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d  ize(pParse->aTem
24310 70 52 65 67 29 20 29 7b 0a 20 20 20 20 69 6e 74  pReg) ){.    int
24320 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74 20 79   i;.    struct y
24330 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 20  ColCache *p;.   
24340 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
24350 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
24360 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
24370 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
24380 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67       if( p->iReg
24390 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20 20 20  ==iReg ){.      
243a0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 31    p->tempReg = 1
243b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
243c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
243d0 20 20 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d      pParse->aTem
243e0 70 52 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65  pReg[pParse->nTe
243f0 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52 65 67 3b  mpReg++] = iReg;
24400 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
24410 6c 6f 63 61 74 65 20 6f 72 20 64 65 61 6c 6c 6f  locate or deallo
24420 63 61 74 65 20 61 20 62 6c 6f 63 6b 20 6f 66 20  cate a block of 
24430 6e 52 65 67 20 63 6f 6e 73 65 63 75 74 69 76 65  nReg consecutive
24440 20 72 65 67 69 73 74 65 72 73 0a 2a 2f 0a 69 6e   registers.*/.in
24450 74 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  t sqlite3GetTemp
24460 52 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  Range(Parse *pPa
24470 72 73 65 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a  rse, int nReg){.
24480 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 20    int i, n;.  i 
24490 3d 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65  = pParse->iRange
244a0 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50 61 72 73  Reg;.  n = pPars
244b0 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b 0a 20 20  e->nRangeReg;.  
244c0 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29 7b 0a 20  if( nReg<=n ){. 
244d0 20 20 20 61 73 73 65 72 74 28 20 21 75 73 65 64     assert( !used
244e0 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 70 50  AsColumnCache(pP
244f0 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d 31 29 20  arse, i, i+n-1) 
24500 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 69  );.    pParse->i
24510 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e 52 65 67  RangeReg += nReg
24520 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  ;.    pParse->nR
24530 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52 65 67 3b  angeReg -= nReg;
24540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 20  .  }else{.    i 
24550 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
24560 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
24570 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20 20 7d 0a  em += nReg;.  }.
24580 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 76 6f    return i;.}.vo
24590 69 64 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  id sqlite3Releas
245a0 65 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  eTempRange(Parse
245b0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52   *pParse, int iR
245c0 65 67 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  eg, int nReg){. 
245d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
245e0 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20  eRemove(pParse, 
245f0 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a 20 20 69  iReg, nReg);.  i
24600 66 28 20 6e 52 65 67 3e 70 50 61 72 73 65 2d 3e  f( nReg>pParse->
24610 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a 20 20 20  nRangeReg ){.   
24620 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
24630 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20 20 20 70  eg = nReg;.    p
24640 50 61 72 73 65 2d 3e 69 52 61 6e 67 65 52 65 67  Parse->iRangeReg
24650 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a   = iReg;.  }.}..
24660 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 74  /*.** Mark all t
24670 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
24680 72 73 20 61 73 20 62 65 69 6e 67 20 75 6e 61 76  rs as being unav
24690 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73  ailable for reus
246a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
246b0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
246c0 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
246d0 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54  e){.  pParse->nT
246e0 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 70 50  empReg = 0;.  pP
246f0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20  arse->nRangeReg 
24700 3d 20 30 3b 0a 7d 0a                             = 0;.}.