/ Hex Artifact Content
Login

Artifact 51dfaa60c0ec9db231535c98ae9ad5ab1409fd88:


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 23 69 66 20 53 45 4c 45 43 54 54 52  h);.#if SELECTTR
8bc0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 6d 65  ACE_ENABLED.  me
8bd0: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 53 65 6c 4c  mcpy(pNew->zSelL
8be0: 61 62 65 6c 2c 20 70 2d 3e 7a 53 65 6c 4c 61 62  abel, p->zSelLab
8bf0: 65 6c 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  el, sizeof(p->zS
8c00: 65 6c 4c 61 62 65 6c 29 29 3b 0a 23 65 6e 64 69  elLabel));.#endi
8c10: 66 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  f.  return pNew;
8c20: 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20  .}.#else.Select 
8c30: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
8c40: 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  p(sqlite3 *db, S
8c50: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 66 6c  elect *p, int fl
8c60: 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ags){.  assert( 
8c70: 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  p==0 );.  return
8c80: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f   0;.}.#endif.../
8c90: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
8ca0: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
8cb0: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
8cc0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
8cd0: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
8ce0: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
8cf0: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
8d00: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
8d10: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
8d20: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
8d30: 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74 69 72  ccurs, the entir
8d40: 65 20 6c 69 73 74 20 69 73 20 66 72 65 65 64 20  e list is freed 
8d50: 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72  and.** NULL is r
8d60: 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e 6f 6e  eturned.  If non
8d70: 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  -NULL is returne
8d80: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  d, then it is gu
8d90: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68 61 74  aranteed.** that
8da0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
8db0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
8dc0: 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45 78 70  appended..*/.Exp
8dd0: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
8de0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  prListAppend(.  
8df0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8e00: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8e10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8e20: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
8e30: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
8e40: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
8e50: 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
8e60: 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  L */.  Expr *pEx
8e70: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
8e80: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
8e90: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d 69 67  be appended. Mig
8ea0: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
8eb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
8ec0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
8ed0: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8ee0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
8ef0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8f00: 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  b, sizeof(ExprLi
8f10: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
8f20: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
8f30: 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20 20   goto no_mem;.  
8f40: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61    }.    pList->a
8f50: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
8f60: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
8f70: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
8f80: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
8f90: 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f 6d 65  ==0 ) goto no_me
8fa0: 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  m;.  }else if( (
8fb0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26 20 28  pList->nExpr & (
8fc0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 29  pList->nExpr-1))
8fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
8fe0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
8ff0: 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *a;.    assert( 
9000: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  pList->nExpr>0 )
9010: 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65  ;.    a = sqlite
9020: 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
9030: 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e  List->a, pList->
9040: 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66 28 70  nExpr*2*sizeof(p
9050: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
9060: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
9070: 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b      goto no_mem;
9080: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
9090: 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20 20 61  ->a = a;.  }.  a
90a0: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
90b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20 29 7b  =0 );.  if( 1 ){
90c0: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
90d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
90e0: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
90f0: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
9100: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
9110: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
9120: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  ));.    pItem->p
9130: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
9140: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
9150: 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20 20 0a  ;..no_mem:     .
9160: 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69    /* Avoid leaki
9170: 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ng memory if mal
9180: 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64 2e 20  loc has failed. 
9190: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
91a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
91b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
91c0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
91d0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  List);.  return 
91e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
91f0: 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d  the ExprList.a[]
9200: 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74 20 6f  .zName element o
9210: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9220: 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d 0a 2a  tly added item.*
9230: 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  * on the express
9240: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
9250: 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 4e  pList might be N
9260: 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ULL following an
9270: 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42 75 74   OOM error.  But
9280: 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 65   pName should ne
9290: 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c 2e 20  ver be.** NULL. 
92a0: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
92b0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 74  ocation fails, t
92c0: 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  he pParse->db->m
92d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
92e0: 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 76  .** is set..*/.v
92f0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c  oid sqlite3ExprL
9300: 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20 50 61  istSetName(.  Pa
9310: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
9320: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9330: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9340: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9350: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
9360: 20 77 68 69 63 68 20 74 6f 20 61 64 64 20 74 68   which to add th
9370: 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  e span. */.  Tok
9380: 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
9390: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74 6f 20       /* Name to 
93a0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
93b0: 74 20 64 65 71 75 6f 74 65 20 20 20 20 20 20 20  t dequote       
93c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
93d0: 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 20   cause the name 
93e0: 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64 20 2a  to be dequoted *
93f0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
9400: 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  List!=0 || pPars
9410: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9420: 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  led!=0 );.  if( 
9430: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73 74 72  pList ){.    str
9440: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9450: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 73  m *pItem;.    as
9460: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
9470: 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65  pr>0 );.    pIte
9480: 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
9490: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20  ist->nExpr-1];. 
94a0: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
94b0: 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  ->zName==0 );.  
94c0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
94d0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
94e0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  p(pParse->db, pN
94f0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
9500: 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71 75 6f  );.    if( dequo
9510: 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61  te && pItem->zNa
9520: 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65 71 75  me ) sqlite3Dequ
9530: 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  ote(pItem->zName
9540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
9550: 53 65 74 20 74 68 65 20 45 78 70 72 4c 69 73 74  Set the ExprList
9560: 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65 6d 65  .a[].zSpan eleme
9570: 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nt of the most r
9580: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74  ecently added it
9590: 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70  em.** on the exp
95a0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
95b0: 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20  .** pList might 
95c0: 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e  be NULL followin
95d0: 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  g an OOM error. 
95e0: 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f 75 6c   But pSpan shoul
95f0: 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55  d never be.** NU
9600: 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  LL.  If a memory
9610: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
9620: 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64  s, the pParse->d
9630: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9640: 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a  flag.** is set..
9650: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
9660: 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 0a  xprListSetSpan(.
9670: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
9690: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
96a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
96b0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
96c0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64  t to which to ad
96d0: 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20  d the span. */. 
96e0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
96f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9700: 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64 65 64  span to be added
9710: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
9720: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9730: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  b;.  assert( pLi
9740: 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  st!=0 || db->mal
9750: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
9760: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
9770: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
9780: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
9790: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
97a0: 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20  ->nExpr-1];.    
97b0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
97c0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 61 73  Expr>0 );.    as
97d0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
97e0: 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65 6d 2d  Failed || pItem-
97f0: 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d 3e 70  >pExpr==pSpan->p
9800: 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  Expr );.    sqli
9810: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
9820: 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20  tem->zSpan);.   
9830: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20 3d 20   pItem->zSpan = 
9840: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
9850: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61  (db, (char*)pSpa
9860: 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20  n->zStart,.     
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9890: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
98a0: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
98b0: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
98c0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
98d0: 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74 20 63  on list pEList c
98e0: 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74 68 61  ontains more tha
98f0: 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65 6e 74  n iLimit element
9900: 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20 65  s,.** leave an e
9910: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
9920: 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  pParse..*/.void 
9930: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
9940: 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20 50 61  heckLength(.  Pa
9950: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45  rse *pParse,.  E
9960: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
9970: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9980: 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Object.){.  int 
9990: 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  mx = pParse->db-
99a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
99b0: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a 20 20  IMIT_COLUMN];.  
99c0: 74 65 73 74 63 61 73 65 28 20 70 45 4c 69 73 74  testcase( pEList
99d0: 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
99e0: 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73 74 63  r==mx );.  testc
99f0: 61 73 65 28 20 70 45 4c 69 73 74 20 26 26 20 70  ase( pEList && p
9a00: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6d 78  EList->nExpr==mx
9a10: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69  +1 );.  if( pELi
9a20: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
9a30: 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20 73 71  xpr>mx ){.    sq
9a40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9a50: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
9a60: 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22 2c 20  columns in %s", 
9a70: 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a 7d 0a  zObject);.  }.}.
9a80: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
9a90: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
9aa0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
9ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9ac0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
9ad0: 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  db, ExprList *pL
9ae0: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
9af0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9b00: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9b10: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
9b20: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
9b30: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
9b40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
9b50: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
9b60: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
9b70: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
9b80: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
9b90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9ba0: 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 45  te(db, pItem->pE
9bb0: 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  xpr);.    sqlite
9bc0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
9bd0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
9be0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9bf0: 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a   pItem->zSpan);.
9c00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
9c10: 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
9c20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
9c30: 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
9c40: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ../*.** These ro
9c50: 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c 6b 65  utines are Walke
9c60: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20 57 61  r callbacks.  Wa
9c70: 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61 20 70  lker.u.pi is a p
9c80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
9c90: 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73 65 20  integer.  These 
9ca0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 68 65  routines are che
9cb0: 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65 73 73  cking an express
9cc0: 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  ion to see.** if
9cd0: 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74 61 6e   it is a constan
9ce0: 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65 72 2e  t.  Set *Walker.
9cf0: 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74 68 65  u.pi to 0 if the
9d00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a   expression is.*
9d10: 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 2e 0a  * not constant..
9d20: 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
9d30: 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20 61 72  back routines ar
9d40: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
9d50: 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ent the followin
9d60: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c  g:.**.**     sql
9d70: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9d80: 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  nt().**     sqli
9d90: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
9da0: 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20 20 20  tNotJoin().**   
9db0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43    sqlite3ExprIsC
9dc0: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9dd0: 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  n().**.*/.static
9de0: 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43   int exprNodeIsC
9df0: 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72 20 2a  onstant(Walker *
9e00: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
9e10: 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49 66 20  Expr){..  /* If 
9e20: 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69 73 20  pWalker->u.i is 
9e30: 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72 6d 20  3 then any term 
9e40: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
9e50: 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66 72 6f  n that comes fro
9e60: 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20 6f 72  m.  ** the ON or
9e70: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
9e80: 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75 61 6c  f a join disqual
9e90: 69 66 69 65 73 20 74 68 65 20 65 78 70 72 65 73  ifies the expres
9ea0: 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d 20 62  sion.  ** from b
9eb0: 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
9ec0: 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20 20 69  constant. */.  i
9ed0: 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d  f( pWalker->u.i=
9ee0: 3d 33 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =3 && ExprHasPro
9ef0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9f00: 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
9f10: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d 20   pWalker->u.i = 
9f20: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
9f30: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
9f40: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
9f50: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 73  p ){.    /* Cons
9f60: 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ider functions t
9f70: 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 69 66  o be constant if
9f80: 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67 75 6d   all their argum
9f90: 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74 61 6e  ents are constan
9fa0: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65 69 74  t.    ** and eit
9fb0: 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  her pWalker->u.i
9fc0: 3d 3d 32 20 6f 72 20 74 68 65 20 66 75 6e 63 74  ==2 or the funct
9fd0: 69 6f 6e 20 61 73 20 74 68 65 20 53 51 4c 49 54  ion as the SQLIT
9fe0: 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 0a 20 20 20  E_FUNC_CONST.   
9ff0: 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20   ** flag. */.   
a000: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
a010: 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 57 61  N:.      if( pWa
a020: 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 7c 7c 20  lker->u.i==2 || 
a030: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
a040: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 61 6e  pExpr,EP_Constan
a050: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
a060: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
a070: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
a080: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
a090: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
a0a0: 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ID:.    case TK_
a0b0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65  COLUMN:.    case
a0c0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
a0d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  :.    case TK_AG
a0e0: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  G_COLUMN:.      
a0f0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a100: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
a110: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a120: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
a130: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
a140: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a150: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
a160: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a170: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
a180: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
a190: 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75        pWalker->u
a1a0: 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  .i = 0;.      re
a1b0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
a1c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
a1d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
a1e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
a1f0: 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e 6f  T ); /* selectNo
a200: 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69 6c  deIsConstant wil
a210: 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20 20  l disallow */.  
a220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a230: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
a240: 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74 4e  TS ); /* selectN
a250: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77 69  odeIsConstant wi
a260: 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a 20  ll disallow */. 
a270: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
a280: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a 7d 0a  Continue;.  }.}.
a290: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
a2a0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  tNodeIsConstant(
a2b0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
a2c0: 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
a2d0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
a2e0: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
a2f0: 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 3d    pWalker->u.i =
a300: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
a310: 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74 69 63  _Abort;.}.static
a320: 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e 73 74   int exprIsConst
a330: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 6e  (Expr *p, int in
a340: 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c 6b 65  itFlag){.  Walke
a350: 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  r w;.  memset(&w
a360: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
a370: 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69 74 46  .  w.u.i = initF
a380: 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  lag;.  w.xExprCa
a390: 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f 64  llback = exprNod
a3a0: 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 77  eIsConstant;.  w
a3b0: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
a3c0: 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49 73 43   = selectNodeIsC
a3d0: 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c 69 74  onstant;.  sqlit
a3e0: 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
a3f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 75 2e  );.  return w.u.
a400: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  i;.}../*.** Walk
a410: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
a420: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
a430: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a440: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
a450: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
a460: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 20 6f  lves variables o
a470: 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  r function calls
a480: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
a490: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
a4a0: 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75   function, a dou
a4b0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
a4c0: 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a  g (ex: "abc").**
a4d0: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
a4e0: 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20   variable but a 
a4f0: 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74  single-quoted st
a500: 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29  ring (ex: 'abc')
a510: 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e   is.** a constan
a520: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
a530: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
a540: 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  Expr *p){.  retu
a550: 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74 28 70  rn exprIsConst(p
a560: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 1);.}../*.** W
a570: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
a580: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
a590: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
a5a0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
a5b0: 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 20  ** that does no 
a5c0: 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d 20 74  originate from t
a5d0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
a5e0: 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f 69 6e  lauses of a join
a5f0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
a600: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
a610: 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63 74 69  iables or functi
a620: 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65 72 6d  on calls or term
a630: 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f 4e 20  s from.** an ON 
a640: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  or USING clause.
a650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
a660: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74  xprIsConstantNot
a670: 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b 0a 20  Join(Expr *p){. 
a680: 20 72 65 74 75 72 6e 20 65 78 70 72 49 73 43 6f   return exprIsCo
a690: 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a 2f 2a  nst(p, 3);.}../*
a6a0: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
a6b0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
a6c0: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
a6d0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
a6e0: 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66 75 6e  tant.** or a fun
a6f0: 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74 68 20  ction call with 
a700: 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d 65 6e  constant argumen
a710: 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e 64 20  ts.  Return and 
a720: 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  0 if there.** ar
a730: 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65 73 2e  e any variables.
a740: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
a750: 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
a760: 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62  function, a doub
a770: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
a780: 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20   (ex: "abc").** 
a790: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
a7a0: 76 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73  variable but a s
a7b0: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ingle-quoted str
a7c0: 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20  ing (ex: 'abc') 
a7d0: 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74  is.** a constant
a7e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
a7f0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
a800: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20 2a 70  Function(Expr *p
a810: 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72  ){.  return expr
a820: 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b 0a 7d  IsConst(p, 2);.}
a830: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ../*.** If the e
a840: 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f 64 65  xpression p code
a850: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
a860: 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61  eger that is sma
a870: 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20  ll enough.** to 
a880: 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20  fit in a 32-bit 
a890: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
a8a0: 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61  1 and put the va
a8b0: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
a8c0: 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65  er.** in *pValue
a8d0: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
a8e0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69  sion is not an i
a8f0: 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20  nteger or if it 
a900: 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f  is too big.** to
a910: 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64   fit in a signed
a920: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
a930: 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65   return 0 and le
a940: 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68  ave *pValue unch
a950: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
a960: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
a970: 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  er(Expr *p, int 
a980: 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20  *pValue){.  int 
a990: 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  rc = 0;..  /* If
a9a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69   an expression i
a9b0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c 69 74  s an integer lit
a9c0: 65 72 61 6c 20 74 68 61 74 20 66 69 74 73 20 69  eral that fits i
a9d0: 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69  n a signed 32-bi
a9e0: 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  t.  ** integer, 
a9f0: 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e 74 56  then the EP_IntV
aa00: 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c 20 68  alue flag will h
aa10: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
aa20: 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65 72 74   set */.  assert
aa30: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 54 45  ( p->op!=TK_INTE
aa40: 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61 67 73  GER || (p->flags
aa50: 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 21   & EP_IntValue)!
aa60: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
aa70: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
aa80: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
aa90: 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  c)==0 );..  if( 
aaa0: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  p->flags & EP_In
aab0: 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 2a 70  tValue ){.    *p
aac0: 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69 56 61  Value = p->u.iVa
aad0: 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  lue;.    return 
aae0: 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  1;.  }.  switch(
aaf0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
ab00: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
ab10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ab20: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
ab30: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
ab40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ab50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
ab60: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
ab70: 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66   int v;.      if
ab80: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
ab90: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c  nteger(p->pLeft,
aba0: 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20   &v) ){.        
abb0: 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32 31 34  assert( v!=(-214
abc0: 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a 20 20  7483647-1) );.  
abd0: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
abe0: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  -v;.        rc =
abf0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ac00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ac10: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
ac20: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
ac30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
ac40: 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65  urn FALSE if the
ac50: 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
ac60: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
ac70: 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e  ion can be NULL.
ac80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
ac90: 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20 62  pression might b
aca0: 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65  e NULL or if the
acb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
acc0: 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20 74 6f  oo complex.** to
acd0: 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54 52 55   tell return TRU
ace0: 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  E.  .**.** This 
acf0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
ad00: 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  as an optimizati
ad10: 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50 5f 49  on, to skip OP_I
ad20: 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  sNull opcodes.**
ad30: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 74 68   when we know th
ad40: 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  at a value canno
ad50: 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65 6e 63  t be NULL.  Henc
ad60: 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  e, a false posit
ad70: 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  ive.** (returnin
ad80: 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e 20 66  g TRUE when in f
ad90: 61 63 74 20 74 68 65 20 65 78 70 72 65 73 73 69  act the expressi
ada0: 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  on can never be 
adb0: 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a 20 62  NULL) might.** b
adc0: 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66 6f 72  e a small perfor
add0: 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20 69 73  mance hit but is
ade0: 20 6f 74 68 65 72 77 69 73 65 20 68 61 72 6d 6c   otherwise harml
adf0: 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f 74 68  ess.  On the oth
ae00: 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20 66 61  er.** hand, a fa
ae10: 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28 72 65  lse negative (re
ae20: 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20 77 68  turning FALSE wh
ae30: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  en the result co
ae40: 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a 2a 20  uld be NULL).** 
ae50: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
ae60: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72 72 65  lt in an incorre
ae70: 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f 20 77  ct answer.  So w
ae80: 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20 72 65  hen in doubt, re
ae90: 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a 2a 2f  turn.** TRUE..*/
aea0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
aeb0: 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73 74 20  CanBeNull(const 
aec0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38 20 6f  Expr *p){.  u8 o
aed0: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 6f  p;.  while( p->o
aee0: 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c 20 70  p==TK_UPLUS || p
aef0: 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55 53 20  ->op==TK_UMINUS 
af00: 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66 74 3b  ){ p = p->pLeft;
af10: 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b   }.  op = p->op;
af20: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
af30: 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20 70 2d  GISTER ) op = p-
af40: 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68 28 20  >op2;.  switch( 
af50: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
af60: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
af70: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
af80: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
af90: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
afa0: 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  OB:.      return
afb0: 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
afc0: 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20 61 73  COLUMN:.      as
afd0: 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21 3d 30  sert( p->pTab!=0
afe0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
aff0: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26   p->iColumn>=0 &
b000: 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  & p->pTab->aCol[
b010: 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  p->iColumn].notN
b020: 75 6c 6c 3d 3d 30 3b 0a 20 20 20 20 64 65 66 61  ull==0;.    defa
b030: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
b040: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
b050: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
b060: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
b070: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e 73 74  ssion is a const
b080: 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ant which would 
b090: 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  be.** unchanged 
b0a0: 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 77  by OP_Affinity w
b0b0: 69 74 68 20 74 68 65 20 61 66 66 69 6e 69 74 79  ith the affinity
b0c0: 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
b0d0: 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
b0e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b0f0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
b100: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
b110: 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 65   OP_Affinity ope
b120: 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  ration.** can be
b130: 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65 6e 20   omitted.  When 
b140: 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72 6e 20  in doubt return 
b150: 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73 65 20  FALSE.  A false 
b160: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73 20 68  negative.** is h
b170: 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61 6c 73  armless.  A fals
b180: 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f 77 65  e positive, howe
b190: 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c 74 20  ver, can result 
b1a0: 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a 2a 20  in the wrong.** 
b1b0: 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  answer..*/.int s
b1c0: 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
b1d0: 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
b1e0: 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c 20 63  const Expr *p, c
b1f0: 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38 20 6f  har aff){.  u8 o
b200: 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d 53 51  p;.  if( aff==SQ
b210: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 20  LITE_AFF_NONE ) 
b220: 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68 69 6c  return 1;.  whil
b230: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 50 4c  e( p->op==TK_UPL
b240: 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  US || p->op==TK_
b250: 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20 70 2d  UMINUS ){ p = p-
b260: 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70 20 3d  >pLeft; }.  op =
b270: 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70   p->op;.  if( op
b280: 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 20  ==TK_REGISTER ) 
b290: 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20 20 73  op = p->op2;.  s
b2a0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
b2b0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
b2c0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
b2d0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
b2e0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 3d  _INTEGER || aff=
b2f0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
b300: 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  RIC;.    }.    c
b310: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a  ase TK_FLOAT: {.
b320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 66 66        return aff
b330: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
b340: 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  L || aff==SQLITE
b350: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
b360: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b370: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
b380: 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51 4c 49  return aff==SQLI
b390: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
b3a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
b3b0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LOB: {.      ret
b3c0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
b3d0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
b3e0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b3f0: 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20 29 3b   p->iTable>=0 );
b400: 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20 62 65    /* p cannot be
b410: 20 70 61 72 74 20 6f 66 20 61 20 43 48 45 43 4b   part of a CHECK
b420: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
b430: 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 69       return p->i
b440: 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 20 20  Column<0.       
b450: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
b460: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c  TE_AFF_INTEGER |
b470: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
b480: 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20 20 20  F_NUMERIC);.    
b490: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
b4a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
b4b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
b4c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b4d0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
b4e0: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
b4f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
b500: 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77  int sqlite3IsRow
b510: 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  id(const char *z
b520: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
b530: 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57  StrICmp(z, "_ROW
b540: 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72  ID_")==0 ) retur
b550: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
b560: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f  e3StrICmp(z, "RO
b570: 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  WID")==0 ) retur
b580: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
b590: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49  e3StrICmp(z, "OI
b5a0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
b5b0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
b5c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
b5d0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 62  rue if we are ab
b5e0: 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f 70 65  le to the IN ope
b5f0: 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69  rator optimizati
b600: 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65 72 79  on on a.** query
b610: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
b620: 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20 28 53  **       x IN (S
b630: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
b640: 20 57 68 65 72 65 20 74 68 65 20 53 45 4c 45 43   Where the SELEC
b650: 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73 20 61  T... clause is a
b660: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
b670: 68 65 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  he parameter to 
b680: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  this.** routine.
b690: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c 65 63  .**.** The Selec
b6a0: 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  t object passed 
b6b0: 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  in has already b
b6c0: 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73 65 64  een preprocessed
b6d0: 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72 6f 72   and no.** error
b6e0: 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f 75 6e  s have been foun
b6f0: 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
b700: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b710: 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  RY.static int is
b720: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
b730: 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  t(Select *p){.  
b740: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
b750: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b760: 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  t;.  Table *pTab
b770: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b780: 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
b790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 69             /* ri
b7a0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
b7b0: 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20 2a 2f   IN is SELECT */
b7c0: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
b7d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
b7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
b7f0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
b800: 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  CT */.  if( p->s
b810: 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
b820: 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
b830: 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65 73 74  ate) ){.    test
b840: 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46 6c 61  case( (p->selFla
b850: 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
b860: 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
b870: 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b  ==SF_Distinct );
b880: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28  .    testcase( (
b890: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
b8a0: 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
b8b0: 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67  gregate))==SF_Ag
b8c0: 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 72  gregate );.    r
b8d0: 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f 20 44  eturn 0; /* No D
b8e0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
b8f0: 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61 74 65  and no aggregate
b900: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b910: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  }.  assert( p->p
b920: 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20 20 20  GroupBy==0 );   
b930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b940: 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
b950: 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ause */.  if( p-
b960: 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
b970: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b980: 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d 49 54   /* Has no LIMIT
b990: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61 73 73   clause */.  ass
b9a0: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
b9b0: 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  =0 );           
b9c0: 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49 54 20      /* No LIMIT 
b9d0: 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45 54 20  means no OFFSET 
b9e0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65  */.  if( p->pWhe
b9f0: 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ba10: 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75  as no WHERE clau
ba20: 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d 20 70  se */.  pSrc = p
ba30: 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
ba40: 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 69  ( pSrc!=0 );.  i
ba50: 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  f( pSrc->nSrc!=1
ba60: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
ba70: 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20        /* Single 
ba80: 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63 6c 61  term in FROM cla
ba90: 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 72  use */.  if( pSr
baa0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20  c->a[0].pSelect 
bab0: 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
bac0: 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74 20 61  /* FROM is not a
bad0: 20 73 75 62 71 75 65 72 79 20 6f 72 20 76 69 65   subquery or vie
bae0: 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 70 53  w */.  pTab = pS
baf0: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20  rc->a[0].pTab;. 
bb00: 20 69 66 28 20 4e 45 56 45 52 28 70 54 61 62 3d   if( NEVER(pTab=
bb10: 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
bb20: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
bb30: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20 20 20  pSelect==0 );   
bb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d           /* FROM
bb50: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
bb60: 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28 20 49   view */.  if( I
bb70: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
bb80: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
bb90: 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
bba0: 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
bbb0: 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  able */.  pEList
bbc0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
bbd0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
bbe0: 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  r!=1 ) return 0;
bbf0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 6f         /* One co
bc00: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
bc10: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66 28 20  lt set */.  if( 
bc20: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
bc30: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
bc40: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  N ) return 0; /*
bc50: 20 52 65 73 75 6c 74 20 69 73 20 61 20 63 6f 6c   Result is a col
bc60: 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  umn */.  return 
bc70: 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
bc80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bc90: 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ERY */../*.** Co
bca0: 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20 69 6e  de an OP_Once in
bcb0: 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 61 6c  struction and al
bcc0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
bcd0: 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74 75 72   its flag. Retur
bce0: 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72 65 73  n the .** addres
bcf0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
bd00: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  truction..*/.int
bd10: 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
bd20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
bd30: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
bd40: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
bd50: 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56 69 72  se);      /* Vir
bd60: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69  tual machine bei
bd70: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 72 65  ng coded */.  re
bd80: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
bd90: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp1(v, OP_Onc
bda0: 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65  e, pParse->nOnce
bdb0: 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ++);.}../*.** Ge
bdc0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
bdd0: 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65 66 74   checks the left
bde0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
bdf0: 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43 75 72  index table iCur
be00: 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 69 74   to see if.** it
be10: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 4e 55   contains any NU
be20: 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43 61 75  LL entries.  Cau
be30: 73 65 20 74 68 65 20 72 65 67 69 73 74 65 72 20  se the register 
be40: 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20 74 6f  at regHasNull to
be50: 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20   be set.** to a 
be60: 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
be70: 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e 73 20  f iCur contains 
be80: 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75 73 65  no NULLs.  Cause
be90: 20 72 65 67 69 73 74 65 72 20 72 65 67 48 61 73   register regHas
bea0: 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20 73 65  Null.** to be se
beb0: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69 43 75  t to NULL if iCu
bec0: 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  r contains one o
bed0: 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75  r more NULL valu
bee0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
bef0: 69 64 20 73 71 6c 69 74 65 33 53 65 74 48 61 73  id sqlite3SetHas
bf00: 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20 2a 76  NullFlag(Vdbe *v
bf10: 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e 74 20  , int iCur, int 
bf20: 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20 20 69  regHasNull){.  i
bf30: 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74 65 33  nt j1;.  sqlite3
bf40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bf50: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
bf60: 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31 20 3d  HasNull);.  j1 =
bf70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bf80: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
bf90: 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f 76 65   iCur); VdbeCove
bfa0: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
bfb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bfc0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 2c  OP_Column, iCur,
bfd0: 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c 29 3b   0, regHasNull);
bfe0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
bff0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
c000: 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 56  _TYPEOFARG);.  V
c010: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
c020: 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e 28 25  first_entry_in(%
c030: 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20 20 73  d)", iCur));.  s
c040: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
c050: 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a 0a 23  re(v, j1);.}...#
c060: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c070: 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a  IT_SUBQUERY./*.*
c080: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
c090: 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
c0a0: 20 77 69 74 68 20 61 20 6c 69 73 74 20 28 6e 6f   with a list (no
c0b0: 74 20 61 20 73 75 62 71 75 65 72 79 29 20 6f 6e  t a subquery) on
c0c0: 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74 2d 68   the .** right-h
c0d0: 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74 75 72  and side.  Retur
c0e0: 6e 20 54 52 55 45 20 69 66 20 74 68 61 74 20 6c  n TRUE if that l
c0f0: 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  ist is constant.
c100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c110: 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e  qlite3InRhsIsCon
c120: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49 6e 29  stant(Expr *pIn)
c130: 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53 3b 0a  {.  Expr *pLHS;.
c140: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
c150: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
c160: 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f 78 49  perty(pIn, EP_xI
c170: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 70 4c  sSelect) );.  pL
c180: 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66 74 3b  HS = pIn->pLeft;
c190: 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20 3d 20  .  pIn->pLeft = 
c1a0: 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  0;.  res = sqlit
c1b0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
c1c0: 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e 70 4c  (pIn);.  pIn->pL
c1d0: 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20 72 65  eft = pLHS;.  re
c1e0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6e 64  turn res;.}.#end
c1f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
c200: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
c210: 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  by the implement
c220: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49 4e 20  ation of the IN 
c230: 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 2e 0a  (...) operator..
c240: 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61 6d 65  ** The pX parame
c250: 74 65 72 20 69 73 20 74 68 65 20 65 78 70 72 65  ter is the expre
c260: 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52 48 53  ssion on the RHS
c270: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
c280: 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6d 69  tor, which.** mi
c290: 67 68 74 20 62 65 20 65 69 74 68 65 72 20 61 20  ght be either a 
c2a0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
c2b0: 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75 65 72  ons or a subquer
c2c0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  y..**.** The job
c2d0: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
c2e0: 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72 20 63   is to find or c
c2f0: 72 65 61 74 65 20 61 20 62 2d 74 72 65 65 20 6f  reate a b-tree o
c300: 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e 0a 2a  bject that can.*
c310: 2a 20 62 65 20 75 73 65 64 20 65 69 74 68 65 72  * be used either
c320: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d 65 6d   to test for mem
c330: 62 65 72 73 68 69 70 20 69 6e 20 74 68 65 20 52  bership in the R
c340: 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69 74 65  HS set or to ite
c350: 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rate through.** 
c360: 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 74  all members of t
c370: 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b 69 70  he RHS set, skip
c380: 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65 73 2e  ping duplicates.
c390: 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f 72 20  .**.** A cursor 
c3a0: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
c3b0: 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 20 74   b-tree object t
c3c0: 68 61 74 20 69 73 20 74 68 65 20 52 48 53 20 6f  hat is the RHS o
c3d0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
c3e0: 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69 54 61  r.** and pX->iTa
c3f0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
c400: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
c410: 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
c420: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
c430: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
c440: 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68 65 20  n indicates the 
c450: 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61 73 20  b-tree type, as 
c460: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c470: 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20   IN_INDEX_ROWID 
c480: 20 20 20 20 20 2d 20 54 68 65 20 63 75 72 73 6f       - The curso
c490: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c4a0: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
c4b0: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
c4c0: 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54 68 65  INDEX_ASC  - The
c4d0: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
c4e0: 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69  ed on an ascendi
c4f0: 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20 20 49  ng index..**   I
c500: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 44 45  N_INDEX_INDEX_DE
c510: 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f 72 20  SC - The cursor 
c520: 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
c530: 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78  descending index
c540: 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45 58 5f  ..**   IN_INDEX_
c550: 45 50 48 20 20 20 20 20 20 20 20 2d 20 54 68 65  EPH        - The
c560: 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
c570: 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61 6c 6c  ed on a speciall
c580: 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  y created and.**
c590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5a0: 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c 61 74           populat
c5b0: 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62  ed epheremal tab
c5c0: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
c5d0: 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d 20 4e  X_NOOP       - N
c5e0: 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61 6c 6c  o cursor was all
c5f0: 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49 4e 20  ocated.  The IN 
c600: 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65  operator must be
c610: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c620: 20 20 20 20 20 20 20 20 20 20 20 20 69 6d 70 6c              impl
c630: 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73 65 71  emented as a seq
c640: 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69  uence of compari
c650: 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  sons..**.** An e
c660: 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65 20 6d  xisting b-tree m
c670: 69 67 68 74 20 62 65 20 75 73 65 64 20 69 66 20  ight be used if 
c680: 74 68 65 20 52 48 53 20 65 78 70 72 65 73 73 69  the RHS expressi
c690: 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d 70 6c  on pX is a simpl
c6a0: 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 73 75  e.** subquery su
c6b0: 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ch as:.**.**    
c6c0: 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e   SELECT <column>
c6d0: 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a 2a 2a   FROM <table>.**
c6e0: 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53 20 6f  .** If the RHS o
c6f0: 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  f the IN operato
c700: 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72 20 61  r is a list or a
c710: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 73 75   more complex su
c720: 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20  bquery, then.** 
c730: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
c740: 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  le might need to
c750: 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 72   be generated fr
c760: 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64 20 74  om the RHS and t
c770: 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61 62 6c  hen.** pX->iTabl
c780: 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
c790: 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
c7a0: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
c7b0: 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  f an.** existing
c7c0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
c7d0: 65 20 69 6e 46 6c 61 67 73 20 70 61 72 61 6d 65  e inFlags parame
c7e0: 74 65 72 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ter must contain
c7f0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   exactly one of 
c800: 74 68 65 20 62 69 74 73 0a 2a 2a 20 49 4e 5f 49  the bits.** IN_I
c810: 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20  NDEX_MEMBERSHIP 
c820: 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50  or IN_INDEX_LOOP
c830: 2e 20 20 49 66 20 69 6e 46 6c 61 67 73 20 63 6f  .  If inFlags co
c840: 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f 49 4e 44  ntains.** IN_IND
c850: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 2c 20 74  EX_MEMBERSHIP, t
c860: 68 65 6e 20 74 68 65 20 67 65 6e 65 72 61 74 65  hen the generate
c870: 64 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65 20  d table will be 
c880: 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a 20 66 61  used for a.** fa
c890: 73 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65  st membership te
c8a0: 73 74 2e 20 20 57 68 65 6e 20 74 68 65 20 49 4e  st.  When the IN
c8b0: 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62 69 74 20  _INDEX_LOOP bit 
c8c0: 69 73 20 73 65 74 2c 20 74 68 65 0a 2a 2a 20 49  is set, the.** I
c8d0: 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20  N index will be 
c8e0: 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20 6f 76 65  used to loop ove
c8f0: 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  r all values of 
c900: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a 2a  the RHS of the.*
c910: 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  * IN operator..*
c920: 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
c930: 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73 65 64 20  EX_LOOP is used 
c940: 28 61 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20  (and the b-tree 
c950: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
c960: 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
c970: 67 68 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65  gh the set membe
c980: 72 73 29 20 74 68 65 6e 20 74 68 65 20 62 2d 74  rs) then the b-t
c990: 72 65 65 20 6d 75 73 74 20 6e 6f 74 20 63 6f 6e  ree must not con
c9a0: 74 61 69 6e 20 64 75 70 6c 69 63 61 74 65 73 2e  tain duplicates.
c9b0: 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65 6d 61 6c  .** An epheremal
c9c0: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 75   table must be u
c9d0: 73 65 64 20 75 6e 6c 65 73 73 20 74 68 65 20 73  sed unless the s
c9e0: 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75 6d 6e 3e  elected <column>
c9f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
ca00: 2a 20 74 6f 20 62 65 20 75 6e 69 71 75 65 20 2d  * to be unique -
ca10: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
ca20: 69 74 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52  it is an INTEGER
ca30: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
ca40: 69 74 0a 2a 2a 20 68 61 73 20 61 20 55 4e 49 51  it.** has a UNIQ
ca50: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 72  UE constraint or
ca60: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 2e 0a 2a   UNIQUE index..*
ca70: 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f 49 4e 44  *.** When IN_IND
ca80: 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 69 73  EX_MEMBERSHIP is
ca90: 20 75 73 65 64 20 28 61 6e 64 20 74 68 65 20 62   used (and the b
caa0: 2d 74 72 65 65 20 77 69 6c 6c 20 62 65 20 75 73  -tree will be us
cab0: 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61 73 74 20  ed .** for fast 
cac0: 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20 74  set membership t
cad0: 65 73 74 73 29 20 74 68 65 6e 20 61 6e 20 65 70  ests) then an ep
cae0: 68 65 72 65 6d 61 6c 20 74 61 62 6c 65 20 6d 75  heremal table mu
caf0: 73 74 20 0a 2a 2a 20 62 65 20 75 73 65 64 20 75  st .** be used u
cb00: 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e 3e 20 69  nless <column> i
cb10: 73 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  s an INTEGER PRI
cb20: 4d 41 52 59 20 4b 45 59 20 6f 72 20 61 6e 20 69  MARY KEY or an i
cb30: 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20 62 65 20  ndex can .** be 
cb40: 66 6f 75 6e 64 20 77 69 74 68 20 3c 63 6f 6c 75  found with <colu
cb50: 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65 66 74 2d  mn> as its left-
cb60: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  most column..**.
cb70: 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f 49 4e 44  ** If the IN_IND
cb80: 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e 64 20 49  EX_NOOP_OK and I
cb90: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
cba0: 49 50 20 61 72 65 20 62 6f 74 68 20 73 65 74 20  IP are both set 
cbb0: 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65 20 52 48  and.** if the RH
cbc0: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
cbd0: 61 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 28  ator is a list (
cbe0: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
cbf0: 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
cc00: 74 69 6e 65 20 6d 69 67 68 74 20 64 65 63 69 64  tine might decid
cc10: 65 20 74 68 61 74 20 63 72 65 61 74 69 6e 67 20  e that creating 
cc20: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 62 2d 74  an ephemeral b-t
cc30: 72 65 65 20 66 6f 72 20 6d 65 6d 62 65 72 73 68  ree for membersh
cc40: 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67 20 69 73  ip.** testing is
cc50: 20 74 6f 6f 20 65 78 70 65 6e 73 69 76 65 20 61   too expensive a
cc60: 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  nd return IN_IND
cc70: 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20 74 68 61  EX_NOOP.  In tha
cc80: 74 20 63 61 73 65 2c 20 74 68 65 0a 2a 2a 20 63  t case, the.** c
cc90: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  alling routine s
cca0: 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65 6e 74 20  hould implement 
ccb0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
ccc0: 75 73 69 6e 67 20 61 20 73 65 71 75 65 6e 63 65  using a sequence
ccd0: 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20 4e 65 20  .** of Eq or Ne 
cce0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
ccf0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tions..**.** Whe
cd00: 6e 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  n the b-tree is 
cd10: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 6d  being used for m
cd20: 65 6d 62 65 72 73 68 69 70 20 74 65 73 74 73 2c  embership tests,
cd30: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
cd40: 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68 74 20 6e  ction.** might n
cd50: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77 68 65 74  eed to know whet
cd60: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 52  her or not the R
cd70: 48 53 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  HS side of the I
cd80: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 63 6f  N operator.** co
cd90: 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c 2e 20 20  ntains a NULL.  
cda0: 49 66 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20  If prRhsHasNull 
cdb0: 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c 20 70 6f  is not a NULL po
cdc0: 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a 20 69 66  inter and .** if
cdd0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 63 68   there is any ch
cde0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28 2e  ance that the (.
cdf0: 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ..) might contai
ce00: 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 61  n a NULL value a
ce10: 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c 20 74 68  t.** runtime, th
ce20: 65 6e 20 61 20 72 65 67 69 73 74 65 72 20 69 73  en a register is
ce30: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
ce40: 68 65 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  he register numb
ce50: 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  er written.** to
ce60: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2e 20   *prRhsHasNull. 
ce70: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  If there is no c
ce80: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 28  hance that the (
ce90: 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73 20 61 0a  ...) contains a.
cea0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 2c 20 74  ** NULL value, t
ceb0: 68 65 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  hen *prRhsHasNul
cec0: 6c 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  l is left unchan
ced0: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ged..**.** If a 
cee0: 72 65 67 69 73 74 65 72 20 69 73 20 61 6c 6c 6f  register is allo
cef0: 63 61 74 65 64 20 61 6e 64 20 69 74 73 20 6c 6f  cated and its lo
cf00: 63 61 74 69 6f 6e 20 73 74 6f 72 65 64 20 69 6e  cation stored in
cf10: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20   *prRhsHasNull, 
cf20: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75  then.** the valu
cf30: 65 20 69 6e 20 74 68 61 74 20 72 65 67 69 73 74  e in that regist
cf40: 65 72 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  er will be NULL 
cf50: 69 66 20 74 68 65 20 62 2d 74 72 65 65 20 63 6f  if the b-tree co
cf60: 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f  ntains one or mo
cf70: 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  re.** NULL value
cf80: 73 2c 20 61 6e 64 20 69 74 20 77 69 6c 6c 20 62  s, and it will b
cf90: 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55 4c 4c 20  e some non-NULL 
cfa0: 76 61 6c 75 65 20 69 66 20 74 68 65 20 62 2d 74  value if the b-t
cfb0: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a  ree contains no.
cfc0: 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 0a  ** NULL values..
cfd0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
cfe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
cff0: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 49  int sqlite3FindI
d000: 6e 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  nIndex(Parse *pP
d010: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 58 2c 20  arse, Expr *pX, 
d020: 75 33 32 20 69 6e 46 6c 61 67 73 2c 20 69 6e 74  u32 inFlags, int
d030: 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c 29 7b   *prRhsHasNull){
d040: 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b 20 20 20  .  Select *p;   
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d060: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
d070: 43 54 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  CT to the right 
d080: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  of IN operator *
d090: 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  /.  int eType = 
d0a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
d0c0: 65 20 6f 66 20 52 48 53 20 74 61 62 6c 65 2e 20  e of RHS table. 
d0d0: 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f 0a 20 20  IN_INDEX_* */.  
d0e0: 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
d0f0: 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 20  e->nTab++;      
d100: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
d110: 6f 66 20 74 68 65 20 52 48 53 20 74 61 62 6c 65  of the RHS table
d120: 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73 74 42 65   */.  int mustBe
d130: 55 6e 69 71 75 65 3b 20 20 20 20 20 20 20 20 20  Unique;         
d140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d150: 72 75 65 20 69 66 20 52 48 53 20 6d 75 73 74 20  rue if RHS must 
d160: 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 56  be unique */.  V
d170: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
d180: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
d190: 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20       /* Virtual 
d1a0: 6d 61 63 68 69 6e 65 20 62 65 69 6e 67 20 63 6f  machine being co
d1b0: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
d1c0: 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  ( pX->op==TK_IN 
d1d0: 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e 69 71 75  );.  mustBeUniqu
d1e0: 65 20 3d 20 28 69 6e 46 6c 61 67 73 20 26 20 49  e = (inFlags & I
d1f0: 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29 21 3d 30  N_INDEX_LOOP)!=0
d200: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
d210: 20 73 65 65 20 69 66 20 61 6e 20 65 78 69 73 74   see if an exist
d220: 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ing table or ind
d230: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ex can be used t
d240: 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66 79 20 74  o.  ** satisfy t
d250: 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73 20  he query.  This 
d260: 69 73 20 70 72 65 66 65 72 61 62 6c 65 20 74 6f  is preferable to
d270: 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 6e 65   generating a ne
d280: 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d 65 72 61  w .  ** ephemera
d290: 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  l table..  */.  
d2a0: 70 20 3d 20 28 45 78 70 72 48 61 73 50 72 6f 70  p = (ExprHasProp
d2b0: 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53  erty(pX, EP_xIsS
d2c0: 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e 78 2e 70  elect) ? pX->x.p
d2d0: 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a 20 20 69  Select : 0);.  i
d2e0: 66 28 20 41 4c 57 41 59 53 28 70 50 61 72 73 65  f( ALWAYS(pParse
d2f0: 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 69 73  ->nErr==0) && is
d300: 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70  CandidateForInOp
d310: 74 28 70 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  t(p) ){.    sqli
d320: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d330: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
d340: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
d350: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  onnection */.   
d360: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
d390: 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20   <table>. */.   
d3a0: 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20   Expr *pExpr;   
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
d3d0: 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a  ssion <column> *
d3e0: 2f 0a 20 20 20 20 69 31 36 20 69 43 6f 6c 3b 20  /.    i16 iCol; 
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d410: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
d420: 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20 20 20 20  <column> */.    
d430: 69 31 36 20 69 44 62 3b 20 20 20 20 20 20 20 20  i16 iDb;        
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
d460: 73 65 20 69 64 78 20 66 6f 72 20 70 54 61 62 20  se idx for pTab 
d470: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
d480: 70 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  p );            
d490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
d4a0: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
d4b0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
d4c0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d4d0: 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  p->pEList!=0 ); 
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
d4f0: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
d500: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
d510: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d520: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
d530: 70 45 78 70 72 21 3d 30 20 29 3b 20 2f 2a 20 42  pExpr!=0 ); /* B
d540: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
d550: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
d560: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d570: 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b 20 20 20  p->pSrc!=0 );   
d580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
d590: 65 63 61 75 73 65 20 6f 66 20 69 73 43 61 6e 64  ecause of isCand
d5a0: 69 64 61 74 65 46 6f 72 49 6e 4f 70 74 28 70 29  idateForInOpt(p)
d5b0: 20 2a 2f 0a 20 20 20 20 70 54 61 62 20 3d 20 70   */.    pTab = p
d5c0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
d5d0: 62 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20 70  b;.    pExpr = p
d5e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
d5f0: 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d  Expr;.    iCol =
d600: 20 28 69 31 36 29 70 45 78 70 72 2d 3e 69 43 6f   (i16)pExpr->iCo
d610: 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20 20 2f 2a  lumn;.   .    /*
d620: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 72 61 6e   Code an OP_Tran
d630: 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f 50 5f 54  saction and OP_T
d640: 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20 3c 74 61  ableLock for <ta
d650: 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20 69 44 62  ble>. */.    iDb
d660: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d670: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
d680: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
d690: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
d6a0: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
d6b0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
d6c0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
d6d0: 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
d6e0: 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
d6f0: 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  me);..    /* Thi
d700: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
d710: 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 74  ly called from t
d720: 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e 20 62 6f  wo places. In bo
d730: 74 68 20 63 61 73 65 73 20 74 68 65 20 76 64 62  th cases the vdb
d740: 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72  e.    ** has alr
d750: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
d760: 74 65 64 2e 20 53 6f 20 61 73 73 75 6d 65 20 73  ted. So assume s
d770: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 29 20  qlite3GetVdbe() 
d780: 69 73 20 61 6c 77 61 79 73 0a 20 20 20 20 2a 2a  is always.    **
d790: 20 73 75 63 63 65 73 73 66 75 6c 20 68 65 72 65   successful here
d7a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
d7b0: 65 72 74 28 76 29 3b 0a 20 20 20 20 69 66 28 20  ert(v);.    if( 
d7c0: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d7d0: 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
d7e0: 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
d7f0: 73 65 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  se);.      VdbeC
d800: 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20  overage(v);..   
d810: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
d820: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62  ble(pParse, iTab
d830: 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f  , iDb, pTab, OP_
d840: 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  OpenRead);.     
d850: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
d860: 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20 20 20 20  X_ROWID;..      
d870: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d880: 65 72 65 28 76 2c 20 69 41 64 64 72 29 3b 0a 20  ere(v, iAddr);. 
d890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d8a0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
d8d0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
d8e0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
d8f0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
d900: 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70 61 72  ed by the compar
d910: 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69 6e 64 65  ison. If an inde
d920: 78 20 69 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  x is to.      **
d930: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
d940: 65 20 6f 66 20 61 20 74 65 6d 70 2d 74 61 62 6c  e of a temp-tabl
d950: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 6f 72  e, it must be or
d960: 64 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a  dered according.
d970: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73        ** to this
d980: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d990: 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 43  nce.  */.      C
d9a0: 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20 3d 20 73  ollSeq *pReq = s
d9b0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
d9c0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
d9d0: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 45  e, pX->pLeft, pE
d9e0: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  xpr);..      /* 
d9f0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  Check that the a
da00: 66 66 69 6e 69 74 79 20 74 68 61 74 20 77 69 6c  ffinity that wil
da10: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 70 65 72  l be used to per
da20: 66 6f 72 6d 20 74 68 65 20 0a 20 20 20 20 20 20  form the .      
da30: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  ** comparison is
da40: 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
da50: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
da60: 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20 20 20 20   column. If.    
da70: 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 2c 20    ** it is not, 
da80: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
da90: 6c 65 20 74 6f 20 75 73 65 20 61 6e 79 20 69 6e  le to use any in
daa0: 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dex..      */.  
dab0: 20 20 20 20 69 6e 74 20 61 66 66 69 6e 69 74 79      int affinity
dac0: 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  _ok = sqlite3Ind
dad0: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
dae0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
daf0: 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20  ].affinity);..  
db00: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
db10: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 20  b->pIndex; pIdx 
db20: 26 26 20 65 54 79 70 65 3d 3d 30 20 26 26 20 61  && eType==0 && a
db30: 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70 49 64 78  ffinity_ok; pIdx
db40: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
db50: 20 20 20 20 20 20 20 69 66 28 20 28 70 49 64 78         if( (pIdx
db60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69  ->aiColumn[0]==i
db70: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 20 26 26  Col).         &&
db80: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
db90: 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
dba0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
dbb0: 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20 20 20 20  , 0)==pReq.     
dbc0: 20 20 20 20 26 26 20 28 21 6d 75 73 74 42 65 55      && (!mustBeU
dbd0: 6e 69 71 75 65 20 7c 7c 20 28 70 49 64 78 2d 3e  nique || (pIdx->
dbe0: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26 20 49 73  nKeyCol==1 && Is
dbf0: 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
dc00: 29 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ))).        ){. 
dc10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 41 64           int iAd
dc20: 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65  dr = sqlite3Code
dc30: 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 20 56 64  Once(pParse); Vd
dc40: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
dc50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dc60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dc70: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54 61 62 2c  _OpenRead, iTab,
dc80: 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62   pIdx->tnum, iDb
dc90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
dca0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
dcb0: 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64  Info(pParse, pId
dcc0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  x);.          Vd
dcd0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
dce0: 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
dcf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
dd00: 65 72 74 28 20 49 4e 5f 49 4e 44 45 58 5f 49 4e  ert( IN_INDEX_IN
dd10: 44 45 58 5f 44 45 53 43 20 3d 3d 20 49 4e 5f 49  DEX_DESC == IN_I
dd20: 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53 43 2b 31  NDEX_INDEX_ASC+1
dd30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54   );.          eT
dd40: 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 49  ype = IN_INDEX_I
dd50: 4e 44 45 58 5f 41 53 43 20 2b 20 70 49 64 78 2d  NDEX_ASC + pIdx-
dd60: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3b 0a  >aSortOrder[0];.
dd70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
dd80: 72 52 68 73 48 61 73 4e 75 6c 6c 20 26 26 20 21  rRhsHasNull && !
dd90: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
dda0: 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  .notNull ){.    
ddb0: 20 20 20 20 20 20 20 20 2a 70 72 52 68 73 48 61          *prRhsHa
ddc0: 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73 65  sNull = ++pParse
ddd0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20  ->nMem;.        
dde0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48 61      sqlite3SetHa
ddf0: 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 69 54 61  sNullFlag(v, iTa
de00: 62 2c 20 2a 70 72 52 68 73 48 61 73 4e 75 6c 6c  b, *prRhsHasNull
de10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
de20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
de30: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
de40: 69 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  iAddr);.        
de50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
de60: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
de70: 70 72 65 65 78 69 73 74 69 6e 67 20 69 6e 64 65  preexisting inde
de80: 78 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 66  x is available f
de90: 6f 72 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  or the IN clause
dea0: 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f 49 4e 44  .  ** and IN_IND
deb0: 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e 20 61 6c  EX_NOOP is an al
dec0: 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20 20 2a 2a  lowed reply.  **
ded0: 20 61 6e 64 20 74 68 65 20 52 48 53 20 6f 66 20   and the RHS of 
dee0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
def0: 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f 74 20 61  is a list, not a
df00: 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 61   subquery.  ** a
df10: 6e 64 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f  nd the RHS is no
df20: 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20 68 61 73  t contant or has
df30: 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 74 65   two or fewer te
df40: 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 69  rms,.  ** then i
df50: 74 20 69 73 20 6e 6f 74 20 77 6f 72 74 68 20 63  t is not worth c
df60: 72 65 61 74 69 6e 67 20 61 6e 20 65 70 68 65 6d  reating an ephem
df70: 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20 65 76  eral table to ev
df80: 61 6c 75 61 74 65 0a 20 20 2a 2a 20 74 68 65 20  aluate.  ** the 
df90: 49 4e 20 6f 70 65 72 61 74 6f 72 20 73 6f 20 72  IN operator so r
dfa0: 65 74 75 72 6e 20 49 4e 5f 49 4e 44 45 58 5f 4e  eturn IN_INDEX_N
dfb0: 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  OOP..  */.  if( 
dfc0: 65 54 79 70 65 3d 3d 30 0a 20 20 20 26 26 20 28  eType==0.   && (
dfd0: 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44  inFlags & IN_IND
dfe0: 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a 20 20 20 26  EX_NOOP_OK).   &
dff0: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
e000: 74 79 28 70 58 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pX, EP_xIsSel
e010: 65 63 74 29 0a 20 20 20 26 26 20 28 21 73 71 6c  ect).   && (!sql
e020: 69 74 65 33 49 6e 52 68 73 49 73 43 6f 6e 73 74  ite3InRhsIsConst
e030: 61 6e 74 28 70 58 29 20 7c 7c 20 70 58 2d 3e 78  ant(pX) || pX->x
e040: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 32  .pList->nExpr<=2
e050: 29 0a 20 20 29 7b 0a 20 20 20 20 65 54 79 70 65  ).  ){.    eType
e060: 20 3d 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50   = IN_INDEX_NOOP
e070: 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 0a 20 20 69  ;.  }.     ..  i
e080: 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
e090: 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74 20     /* Could not 
e0a0: 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69 6e 67  find an existing
e0b0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
e0c0: 74 6f 20 75 73 65 20 61 73 20 74 68 65 20 52 48  to use as the RH
e0d0: 53 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 2a 2a  S b-tree..    **
e0e0: 20 57 65 20 77 69 6c 6c 20 68 61 76 65 20 74 6f   We will have to
e0f0: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 70 68   generate an eph
e100: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 74 6f 20  emeral table to 
e110: 64 6f 20 74 68 65 20 6a 6f 62 2e 0a 20 20 20 20  do the job..    
e120: 2a 2f 0a 20 20 20 20 75 33 32 20 73 61 76 65 64  */.    u32 saved
e130: 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
e140: 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
e150: 0a 20 20 20 20 69 6e 74 20 72 4d 61 79 48 61 76  .    int rMayHav
e160: 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 65  eNull = 0;.    e
e170: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
e180: 45 50 48 3b 0a 20 20 20 20 69 66 28 20 69 6e 46  EPH;.    if( inF
e190: 6c 61 67 73 20 26 20 49 4e 5f 49 4e 44 45 58 5f  lags & IN_INDEX_
e1a0: 4c 4f 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 50  LOOP ){.      pP
e1b0: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
e1c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
e1d0: 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
e1e0: 6d 6e 3c 30 20 26 26 20 21 45 78 70 72 48 61 73  mn<0 && !ExprHas
e1f0: 50 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f  Property(pX, EP_
e200: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
e210: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e        eType = IN
e220: 5f 49 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 20 20  _INDEX_ROWID;.  
e230: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
e240: 69 66 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c  if( prRhsHasNull
e250: 20 29 7b 0a 20 20 20 20 20 20 2a 70 72 52 68 73   ){.      *prRhs
e260: 48 61 73 4e 75 6c 6c 20 3d 20 72 4d 61 79 48 61  HasNull = rMayHa
e270: 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61 72 73  veNull = ++pPars
e280: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 7d 0a 20  e->nMem;.    }. 
e290: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
e2a0: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
e2b0: 70 58 2c 20 72 4d 61 79 48 61 76 65 4e 75 6c 6c  pX, rMayHaveNull
e2c0: 2c 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  , eType==IN_INDE
e2d0: 58 5f 52 4f 57 49 44 29 3b 0a 20 20 20 20 70 50  X_ROWID);.    pP
e2e0: 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
e2f0: 20 3d 20 73 61 76 65 64 4e 51 75 65 72 79 4c 6f   = savedNQueryLo
e300: 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  op;.  }else{.   
e310: 20 70 58 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54   pX->iTable = iT
e320: 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ab;.  }.  return
e330: 20 65 54 79 70 65 3b 0a 7d 0a 23 65 6e 64 69 66   eType;.}.#endif
e340: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
e350: 20 63 6f 64 65 20 66 6f 72 20 73 63 61 6c 61 72   code for scalar
e360: 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64   subqueries used
e370: 20 61 73 20 61 20 73 75 62 71 75 65 72 79 20 65   as a subquery e
e380: 78 70 72 65 73 73 69 6f 6e 2c 20 45 58 49 53 54  xpression, EXIST
e390: 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20 6f 70 65 72  S,.** or IN oper
e3a0: 61 74 6f 72 73 2e 20 20 45 78 61 6d 70 6c 65 73  ators.  Examples
e3b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 53 45 4c  :.**.**     (SEL
e3c0: 45 43 54 20 61 20 46 52 4f 4d 20 62 29 20 20 20  ECT a FROM b)   
e3d0: 20 20 20 20 20 20 20 2d 2d 20 73 75 62 71 75 65         -- subque
e3e0: 72 79 0a 2a 2a 20 20 20 20 20 45 58 49 53 54 53  ry.**     EXISTS
e3f0: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
e400: 62 29 20 20 20 2d 2d 20 45 58 49 53 54 53 20 73  b)   -- EXISTS s
e410: 75 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 78  ubquery.**     x
e420: 20 49 4e 20 28 34 2c 35 2c 31 31 29 20 20 20 20   IN (4,5,11)    
e430: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 49 4e 20            -- IN 
e440: 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 6c 69  operator with li
e450: 73 74 20 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64  st on right-hand
e460: 20 73 69 64 65 0a 2a 2a 20 20 20 20 20 78 20 49   side.**     x I
e470: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
e480: 20 62 29 20 20 20 20 20 2d 2d 20 49 4e 20 6f 70   b)     -- IN op
e490: 65 72 61 74 6f 72 20 77 69 74 68 20 73 75 62 71  erator with subq
e4a0: 75 65 72 79 20 6f 6e 20 74 68 65 20 72 69 67 68  uery on the righ
e4b0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 45 78 70  t.**.** The pExp
e4c0: 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 73 63  r parameter desc
e4d0: 72 69 62 65 73 20 74 68 65 20 65 78 70 72 65 73  ribes the expres
e4e0: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
e4f0: 6e 73 20 74 68 65 20 49 4e 0a 2a 2a 20 6f 70 65  ns the IN.** ope
e500: 72 61 74 6f 72 20 6f 72 20 73 75 62 71 75 65 72  rator or subquer
e510: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  y..**.** If para
e520: 6d 65 74 65 72 20 69 73 52 6f 77 69 64 20 69 73  meter isRowid is
e530: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
e540: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
e550: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 0a 2a   is guaranteed.*
e560: 2a 20 74 6f 20 62 65 20 6f 66 20 74 68 65 20 66  * to be of the f
e570: 6f 72 6d 20 22 3c 72 6f 77 69 64 3e 20 49 4e 20  orm "<rowid> IN 
e580: 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20 77 68 65 72  (?, ?, ?)", wher
e590: 65 20 3c 72 6f 77 69 64 3e 20 69 73 20 61 20 72  e <rowid> is a r
e5a0: 65 66 65 72 65 6e 63 65 0a 2a 2a 20 74 6f 20 73  eference.** to s
e5b0: 6f 6d 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  ome integer key 
e5c0: 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 74 61 62 6c  column of a tabl
e5d0: 65 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  e B-Tree. In thi
e5e0: 73 20 63 61 73 65 2c 20 75 73 65 20 61 6e 0a 2a  s case, use an.*
e5f0: 2a 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 20  * intkey B-Tree 
e600: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
e610: 20 6f 66 20 49 4e 28 2e 2e 2e 29 20 76 61 6c 75   of IN(...) valu
e620: 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  es instead of th
e630: 65 20 75 73 75 61 6c 0a 2a 2a 20 28 73 6c 6f 77  e usual.** (slow
e640: 65 72 29 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  er) variable len
e650: 67 74 68 20 6b 65 79 73 20 42 2d 54 72 65 65 2e  gth keys B-Tree.
e660: 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d 61 79 48 61  .**.** If rMayHa
e670: 76 65 4e 75 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65  veNull is non-ze
e680: 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ro, that means t
e690: 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
e6a0: 6e 20 69 73 20 61 6e 20 49 4e 0a 2a 2a 20 28 6e  n is an IN.** (n
e6b0: 6f 74 20 61 20 53 45 4c 45 43 54 20 6f 72 20 45  ot a SELECT or E
e6c0: 58 49 53 54 53 29 20 61 6e 64 20 74 68 61 74 20  XISTS) and that 
e6d0: 74 68 65 20 52 48 53 20 6d 69 67 68 74 20 63 6f  the RHS might co
e6e0: 6e 74 61 69 6e 73 20 4e 55 4c 4c 73 2e 0a 2a 2a  ntains NULLs..**
e6f0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
e700: 65 20 64 6f 65 73 20 69 73 20 69 6e 69 74 69 61  e does is initia
e710: 6c 69 7a 65 20 74 68 65 20 72 65 67 69 73 74 65  lize the registe
e720: 72 20 67 69 76 65 6e 20 62 79 20 72 4d 61 79 48  r given by rMayH
e730: 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 4e 55  aveNull.** to NU
e740: 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67 20 72 6f 75  LL.  Calling rou
e750: 74 69 6e 65 73 20 77 69 6c 6c 20 74 61 6b 65 20  tines will take 
e760: 63 61 72 65 20 6f 66 20 63 68 61 6e 67 69 6e 67  care of changing
e770: 20 74 68 69 73 20 72 65 67 69 73 74 65 72 0a 2a   this register.*
e780: 2a 20 76 61 6c 75 65 20 74 6f 20 6e 6f 6e 2d 4e  * value to non-N
e790: 55 4c 4c 20 69 66 20 74 68 65 20 52 48 53 20 69  ULL if the RHS i
e7a0: 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 2a 2a 0a  s NULL-free..**.
e7b0: 2a 2a 20 46 6f 72 20 61 20 53 45 4c 45 43 54 20  ** For a SELECT 
e7c0: 6f 72 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  or EXISTS operat
e7d0: 6f 72 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  or, return the r
e7e0: 65 67 69 73 74 65 72 20 74 68 61 74 20 68 6f 6c  egister that hol
e7f0: 64 73 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74  ds the.** result
e800: 2e 20 20 46 6f 72 20 49 4e 20 6f 70 65 72 61 74  .  For IN operat
e810: 6f 72 73 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ors or if an err
e820: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 72  or occurs, the r
e830: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 30  eturn value is 0
e840: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
e850: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
e860: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  Y.int sqlite3Cod
e870: 65 53 75 62 73 65 6c 65 63 74 28 0a 20 20 50 61  eSubselect(.  Pa
e880: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e890: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
e8a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
e8b0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
e8c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 49 4e 2c        /* The IN,
e8d0: 20 53 45 4c 45 43 54 2c 20 6f 72 20 45 58 49 53   SELECT, or EXIS
e8e0: 54 53 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  TS operator */. 
e8f0: 20 69 6e 74 20 72 48 61 73 4e 75 6c 6c 46 6c 61   int rHasNullFla
e900: 67 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69  g,       /* Regi
e910: 73 74 65 72 20 74 68 61 74 20 72 65 63 6f 72 64  ster that record
e920: 73 20 77 68 65 74 68 65 72 20 4e 55 4c 4c 73 20  s whether NULLs 
e930: 65 78 69 73 74 20 69 6e 20 52 48 53 20 2a 2f 0a  exist in RHS */.
e940: 20 20 69 6e 74 20 69 73 52 6f 77 69 64 20 20 20    int isRowid   
e950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
e960: 74 72 75 65 2c 20 4c 48 53 20 6f 66 20 49 4e 20  true, LHS of IN 
e970: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 72 6f  operator is a ro
e980: 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  wid */.){.  int 
e990: 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 2d  jmpIfDynamic = -
e9a0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
e9b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 2d 74          /* One-t
e9c0: 69 6d 65 20 74 65 73 74 20 61 64 64 72 65 73 73  ime test address
e9d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 52 65 67 20 3d   */.  int rReg =
e9e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea00: 20 52 65 67 69 73 74 65 72 20 73 74 6f 72 69 6e   Register storin
ea10: 67 20 72 65 73 75 6c 74 69 6e 67 20 2a 2f 0a 20  g resulting */. 
ea20: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
ea30: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ea40: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
ea50: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
ea60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
ea70: 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
ea80: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
ea90: 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69 6e 20   must be run in 
eaa0: 69 74 73 20 65 6e 74 69 72 65 74 79 20 65 76 65  its entirety eve
eab0: 72 79 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  ry time it is en
eac0: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 69  countered.  ** i
ead0: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
eae0: 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 3a 0a  lowing is true:.
eaf0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 2a 20 20    **.  **    *  
eb00: 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
eb10: 69 64 65 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ide is a correla
eb20: 74 65 64 20 73 75 62 71 75 65 72 79 0a 20 20 2a  ted subquery.  *
eb30: 2a 20 20 20 20 2a 20 20 54 68 65 20 72 69 67 68  *    *  The righ
eb40: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61  t-hand side is a
eb50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
eb60: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 76 61 72  t containing var
eb70: 69 61 62 6c 65 73 0a 20 20 2a 2a 20 20 20 20 2a  iables.  **    *
eb80: 20 20 57 65 20 61 72 65 20 69 6e 73 69 64 65 20    We are inside 
eb90: 61 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 0a 20  a trigger.  **. 
eba0: 20 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68   ** If all of th
ebb0: 65 20 61 62 6f 76 65 20 61 72 65 20 66 61 6c 73  e above are fals
ebc0: 65 2c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  e, then we can r
ebd0: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 6a 75 73  un this code jus
ebe0: 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 73 61 76 65  t once.  ** save
ebf0: 20 74 68 65 20 72 65 73 75 6c 74 73 2c 20 61 6e   the results, an
ec00: 64 20 72 65 75 73 65 20 74 68 65 20 73 61 6d 65  d reuse the same
ec10: 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62 73 65   result on subse
ec20: 71 75 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  quent invocation
ec30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 45  s..  */.  if( !E
ec40: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
ec50: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
ec60: 63 74 29 20 29 7b 0a 20 20 20 20 6a 6d 70 49 66  ct) ){.    jmpIf
ec70: 44 79 6e 61 6d 69 63 20 3d 20 73 71 6c 69 74 65  Dynamic = sqlite
ec80: 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
ec90: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
eca0: 76 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  v);.  }..#ifndef
ecb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
ecc0: 4c 41 49 4e 0a 20 20 69 66 28 20 70 50 61 72 73  LAIN.  if( pPars
ecd0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
ece0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
ecf0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ed00: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
ed10: 2d 3e 64 62 2c 20 22 45 58 45 43 55 54 45 20 25  ->db, "EXECUTE %
ed20: 73 25 73 20 53 55 42 51 55 45 52 59 20 25 64 22  s%s SUBQUERY %d"
ed30: 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d  , jmpIfDynamic>=
ed40: 30 3f 22 22 3a 22 43 4f 52 52 45 4c 41 54 45 44  0?"":"CORRELATED
ed50: 20 22 2c 0a 20 20 20 20 20 20 20 20 70 45 78 70   ",.        pExp
ed60: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 3f 22 4c 49  r->op==TK_IN?"LI
ed70: 53 54 22 3a 22 53 43 41 4c 41 52 22 2c 20 70 50  ST":"SCALAR", pP
ed80: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
ed90: 74 49 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  tId.    );.    s
eda0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
edb0: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
edc0: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
edd0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
ede0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
edf0: 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63 68  #endif..  switch
ee00: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
ee10: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
ee20: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
ee30: 6e 69 74 79 3b 20 20 20 20 20 20 20 20 20 20 20  nity;           
ee40: 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 6f     /* Affinity o
ee50: 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65  f the LHS of the
ee60: 20 49 4e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74   IN */.      int
ee70: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
ee80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
ee90: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45 70  ess of OP_OpenEp
eea0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
eeb0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ion */.      Exp
eec0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
eed0: 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20 74 68 65 20  ->pLeft; /* the 
eee0: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
eef0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
ef00: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
ef10: 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4b  o = 0;      /* K
ef20: 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ey information *
ef30: 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  /..      affinit
ef40: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
ef50: 66 66 69 6e 69 74 79 28 70 4c 65 66 74 29 3b 0a  ffinity(pLeft);.
ef60: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
ef70: 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
ef80: 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
ef90: 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
efa0: 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
efb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
efc0: 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
efd0: 6d 65 20 77 61 79 2e 20 20 41 6e 20 65 70 68 65  me way.  An ephe
efe0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 69 73 20 0a  meral table is .
eff0: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
f000: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
f010: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
f020: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
f030: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
f040: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
f050: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
f060: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
f070: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
f080: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
f090: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
f0a0: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
f0b0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f0c0: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
f0d0: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
f0e0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
f0f0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
f100: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
f110: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
f120: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
f130: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
f140: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
f150: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
f160: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
f170: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
f180: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
f190: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
f1a0: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
f1b0: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
f1c0: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
f1d0: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
f1e0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
f1f0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
f200: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
f210: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
f220: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
f230: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
f240: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
f250: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
f260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f270: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
f280: 6d 65 72 61 6c 2c 20 70 45 78 70 72 2d 3e 69 54  meral, pExpr->iT
f290: 61 62 6c 65 2c 20 21 69 73 52 6f 77 69 64 29 3b  able, !isRowid);
f2a0: 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
f2b0: 3d 20 69 73 52 6f 77 69 64 20 3f 20 30 20 3a 20  = isRowid ? 0 : 
f2c0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
f2d0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
f2e0: 31 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66  1, 1);..      if
f2f0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
f300: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
f310: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
f320: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
f330: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
f340: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
f350: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
f360: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
f370: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
f380: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
f390: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
f3a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
f3b0: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
f3c0: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
f3d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f3e0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
f3f0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
f400: 63 74 3b 0a 20 20 20 20 20 20 20 20 53 65 6c 65  ct;.        Sele
f410: 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
f420: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
f430: 45 4c 69 73 74 3b 0a 0a 20 20 20 20 20 20 20 20  EList;..        
f440: 61 73 73 65 72 74 28 20 21 69 73 52 6f 77 69 64  assert( !isRowid
f450: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
f460: 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
f470: 74 28 26 64 65 73 74 2c 20 53 52 54 5f 53 65 74  t(&dest, SRT_Set
f480: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29  , pExpr->iTable)
f490: 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 61  ;.        dest.a
f4a0: 66 66 53 64 73 74 20 3d 20 28 75 38 29 61 66 66  ffSdst = (u8)aff
f4b0: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 61  inity;.        a
f4c0: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
f4d0: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
f4e0: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
f4f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   );.        pSel
f500: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  ect->iLimit = 0;
f510: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f520: 65 28 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  e( pSelect->selF
f530: 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
f540: 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ct );.        pS
f550: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
f560: 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
f570: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f580: 65 28 20 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  e( pKeyInfo==0 )
f590: 3b 20 2f 2a 20 43 61 75 73 65 64 20 62 79 20 4f  ; /* Caused by O
f5a0: 4f 4d 20 69 6e 20 73 71 6c 69 74 65 33 4b 65 79  OM in sqlite3Key
f5b0: 49 6e 66 6f 41 6c 6c 6f 63 28 29 20 2a 2f 0a 20  InfoAlloc() */. 
f5c0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
f5d0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f5e0: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
f5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f600: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
f610: 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20  f(pKeyInfo);.   
f620: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
f630: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f640: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c     pEList = pSel
f650: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
f660: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
f670: 79 49 6e 66 6f 21 3d 30 20 29 3b 20 2f 2a 20 4f  yInfo!=0 ); /* O
f680: 4f 4d 20 77 69 6c 6c 20 63 61 75 73 65 20 65 78  OM will cause ex
f690: 69 74 20 61 66 74 65 72 20 73 71 6c 69 74 65 33  it after sqlite3
f6a0: 53 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 20 20  Select() */.    
f6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
f6c0: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st!=0 );.       
f6d0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 2d   assert( pEList-
f6e0: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
f6f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f700: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
f710: 65 61 62 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20  eable(pKeyInfo) 
f720: 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  );.        pKeyI
f730: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  nfo->aColl[0] = 
f740: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
f750: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
f760: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
f770: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
f7b0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
f7c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f7d0: 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
f7e0: 70 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  pList!=0) ){.   
f7f0: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
f800: 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
f810: 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a  rlist).        *
f820: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 6f 72  *.        ** For
f830: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
f840: 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78  , build an index
f850: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76   key from the ev
f860: 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20  aluation and.   
f870: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74       ** store it
f880: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
f890: 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70  y table. If <exp
f8a0: 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  r> is a column, 
f8b0: 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20  then use.       
f8c0: 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73   ** that columns
f8d0: 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62   affinity when b
f8e0: 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65  uilding index ke
f8f0: 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  ys. If <expr> is
f900: 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
f910: 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75  a column, use nu
f920: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a  meric affinity..
f930: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f940: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
f950: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
f960: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
f970: 73 74 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  st;.        stru
f980: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
f990: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20   *pItem;.       
f9a0: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
f9b0: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ..        if( !a
f9c0: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
f9d0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
f9e0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
f9f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa00: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
fa10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
fa20: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
fa30: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
fa40: 4b 65 79 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  KeyInfo) );.    
fa50: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
fa60: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73 71 6c 69 74  aColl[0] = sqlit
fa70: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
fa80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
fa90: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ft);.        }..
faa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
fab0: 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
fac0: 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72  ression in <expr
fad0: 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20  list>. */.      
fae0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
faf0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
fb00: 3b 0a 20 20 20 20 20 20 20 20 72 32 20 3d 20 73  ;.        r2 = s
fb10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
fb20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
fb30: 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29 20    if( isRowid ) 
fb40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fb50: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
fb60: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 66 6f   r2);.        fo
fb70: 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r(i=pList->nExpr
fb80: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
fb90: 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
fba0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
fbb0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 49 74 65  Expr *pE2 = pIte
fbc0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
fbd0: 20 20 20 20 69 6e 74 20 69 56 61 6c 54 6f 49 6e      int iValToIn
fbe0: 73 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  s;..          /*
fbf0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
fc00: 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  on is not consta
fc10: 6e 74 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  nt then we will 
fc20: 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
fc30: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 65    ** disable the
fc40: 20 74 65 73 74 20 74 68 61 74 20 77 61 73 20 67   test that was g
fc50: 65 6e 65 72 61 74 65 64 20 61 62 6f 76 65 20 74  enerated above t
fc60: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 0a 20  hat makes sure. 
fc70: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
fc80: 20 63 6f 64 65 20 6f 6e 6c 79 20 65 78 65 63 75   code only execu
fc90: 74 65 73 20 6f 6e 63 65 2e 20 20 42 65 63 61 75  tes once.  Becau
fca0: 73 65 20 66 6f 72 20 61 20 6e 6f 6e 2d 63 6f 6e  se for a non-con
fcb0: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 20 20  stant.          
fcc0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 65  ** expression we
fcd0: 20 6e 65 65 64 20 74 6f 20 72 65 72 75 6e 20 74   need to rerun t
fce0: 68 69 73 20 63 6f 64 65 20 65 61 63 68 20 74 69  his code each ti
fcf0: 6d 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  me..          */
fd00: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
fd10: 6d 70 49 66 44 79 6e 61 6d 69 63 3e 3d 30 20 26  mpIfDynamic>=0 &
fd20: 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  & !sqlite3ExprIs
fd30: 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
fd40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
fd50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
fd60: 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49 66 44 79 6e  Noop(v, jmpIfDyn
fd70: 61 6d 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20  amic);.         
fd80: 20 20 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 20     jmpIfDynamic 
fd90: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
fda0: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
fdb0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
fdc0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
fdd0: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
fde0: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
fdf0: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
fe00: 69 64 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  id && sqlite3Exp
fe10: 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
fe20: 26 69 56 61 6c 54 6f 49 6e 73 29 20 29 7b 0a 20  &iValToIns) ){. 
fe30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fe40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fe50: 4f 50 5f 49 6e 73 65 72 74 49 6e 74 2c 20 70 45  OP_InsertInt, pE
fe60: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 32 2c  xpr->iTable, r2,
fe70: 20 69 56 61 6c 54 6f 49 6e 73 29 3b 0a 20 20 20   iValToIns);.   
fe80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
fe90: 20 20 20 20 20 20 20 20 20 20 72 33 20 3d 20 73            r3 = s
fea0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
feb0: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 32  rget(pParse, pE2
fec0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
fed0: 20 20 20 69 66 28 20 69 73 52 6f 77 69 64 20 29     if( isRowid )
fee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
fef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ff00: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
ff10: 74 2c 20 72 33 2c 0a 20 20 20 20 20 20 20 20 20  t, r3,.         
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ff40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ff50: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +2);.           
ff60: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
ff70: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v);.            
ff80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff90: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
ffa0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
ffb0: 20 72 32 2c 20 72 33 29 3b 0a 20 20 20 20 20 20   r2, r3);.      
ffc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ffd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ffe0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
fff0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
10000 33 2c 20 31 2c 20 72 32 2c 20 26 61 66 66 69 6e  3, 1, r2, &affin
10010 69 74 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ity, 1);.       
10020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
10030 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
10040 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 33  hange(pParse, r3
10050 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
10060 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10070 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
10080 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54  nsert, pExpr->iT
10090 61 62 6c 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  able, r2);.     
100a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
100b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
100c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
100d0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
100e0 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
100f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
10100 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
10110 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
10120 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
10130 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10140 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
10150 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
10160 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
10170 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
10180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10190 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  }..    case TK_E
101a0 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20  XISTS:.    case 
101b0 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 64  TK_SELECT:.    d
101c0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
101d0 2f 2a 20 49 66 20 74 68 69 73 20 68 61 73 20 74  /* If this has t
101e0 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53 45  o be a scalar SE
101f0 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20  LECT.  Generate 
10200 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a  code to put the.
10210 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
10220 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e  f this select in
10230 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61   a memory cell a
10240 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75  nd record the nu
10250 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66  mber.      ** of
10260 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
10270 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 20 20 49 66   in iColumn.  If
10280 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 49 53   this is an EXIS
10290 54 53 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  TS, write.      
102a0 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 30 20  ** an integer 0 
102b0 28 6e 6f 74 20 65 78 69 73 74 73 29 20 6f 72 20  (not exists) or 
102c0 31 20 28 65 78 69 73 74 73 29 20 69 6e 74 6f 20  1 (exists) into 
102d0 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 0a 20 20  a memory cell.  
102e0 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 63 6f 72      ** and recor
102f0 64 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  d that memory ce
10300 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
10310 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 53 65       */.      Se
10320 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20  lect *pSel;     
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
10350 61 74 65 6d 65 6e 74 20 74 6f 20 65 6e 63 6f 64  atement to encod
10360 65 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  e */.      Selec
10370 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 2f 2a 20 48 6f 77 20 74 6f 20 64 65 61 6c 20   /* How to deal 
103a0 77 69 74 68 20 53 45 4c 45 43 74 20 72 65 73 75  with SELECt resu
103b0 6c 74 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73  lt */..      tes
103c0 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
103d0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
103e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
103f0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
10400 45 43 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ECT );.      ass
10410 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
10420 54 4b 5f 45 58 49 53 54 53 20 7c 7c 20 70 45 78  TK_EXISTS || pEx
10430 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  pr->op==TK_SELEC
10440 54 20 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  T );..      asse
10450 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
10460 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
10470 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
10480 20 20 70 53 65 6c 20 3d 20 70 45 78 70 72 2d 3e    pSel = pExpr->
10490 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
104a0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
104b0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 30 2c  stInit(&dest, 0,
104c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 29   ++pParse->nMem)
104d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
104e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
104f0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 65 73 74   ){.        dest
10500 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 4d 65 6d  .eDest = SRT_Mem
10510 3b 0a 20 20 20 20 20 20 20 20 64 65 73 74 2e 69  ;.        dest.i
10520 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 44 50  Sdst = dest.iSDP
10530 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  arm;.        sql
10540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10550 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 64 65  , OP_Null, 0, de
10560 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  st.iSDParm);.   
10570 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10580 28 28 76 2c 20 22 49 6e 69 74 20 73 75 62 71 75  ((v, "Init subqu
10590 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20  ery result"));. 
105a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
105b0 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
105c0 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20 20 20   SRT_Exists;.   
105d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
105e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
105f0 65 67 65 72 2c 20 30 2c 20 64 65 73 74 2e 69 53  eger, 0, dest.iS
10600 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  DParm);.        
10610 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10620 22 49 6e 69 74 20 45 58 49 53 54 53 20 72 65 73  "Init EXISTS res
10630 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ult"));.      }.
10640 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10650 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
10660 64 62 2c 20 70 53 65 6c 2d 3e 70 4c 69 6d 69 74  db, pSel->pLimit
10670 29 3b 0a 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  );.      pSel->p
10680 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 50  Limit = sqlite3P
10690 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
106a0 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 0a 20  INTEGER, 0, 0,. 
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
106e0 6e 73 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 53  ns[1]);.      pS
106f0 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  el->iLimit = 0;.
10700 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
10710 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
10720 70 53 65 6c 2c 20 26 64 65 73 74 29 20 29 7b 0a  pSel, &dest) ){.
10730 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
10740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10750 72 52 65 67 20 3d 20 64 65 73 74 2e 69 53 44 50  rReg = dest.iSDP
10760 61 72 6d 3b 0a 20 20 20 20 20 20 45 78 70 72 53  arm;.      ExprS
10770 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
10780 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
10790 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
107a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
107b0 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 20 29 7b   rHasNullFlag ){
107c0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 48  .    sqlite3SetH
107d0 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20 70 45  asNullFlag(v, pE
107e0 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 72 48 61  xpr->iTable, rHa
107f0 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a 20 20 7d 0a  sNullFlag);.  }.
10800 0a 20 20 69 66 28 20 6a 6d 70 49 66 44 79 6e 61  .  if( jmpIfDyna
10810 6d 69 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  mic>=0 ){.    sq
10820 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
10830 65 28 76 2c 20 6a 6d 70 49 66 44 79 6e 61 6d 69  e(v, jmpIfDynami
10840 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  c);.  }.  sqlite
10850 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
10860 61 72 73 65 29 3b 0a 0a 20 20 72 65 74 75 72 6e  arse);..  return
10870 20 72 52 65 67 3b 0a 7d 0a 23 65 6e 64 69 66 20   rReg;.}.#endif 
10880 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
10890 55 42 51 55 45 52 59 20 2a 2f 0a 0a 23 69 66 6e  UBQUERY */..#ifn
108a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
108b0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47  SUBQUERY./*.** G
108c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
108d0 20 61 6e 20 49 4e 20 65 78 70 72 65 73 73 69 6f   an IN expressio
108e0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78 20  n..**.**      x 
108f0 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a  IN (SELECT ...).
10900 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 76 61  **      x IN (va
10910 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29  lue, value, ...)
10920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
10930 68 61 6e 64 20 73 69 64 65 20 28 4c 48 53 29 20  hand side (LHS) 
10940 69 73 20 61 20 73 63 61 6c 61 72 20 65 78 70 72  is a scalar expr
10950 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 72 69 67  ession.  The rig
10960 68 74 2d 68 61 6e 64 20 73 69 64 65 20 28 52 48  ht-hand side (RH
10970 53 29 0a 2a 2a 20 69 73 20 61 6e 20 61 72 72 61  S).** is an arra
10980 79 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  y of zero or mor
10990 65 20 76 61 6c 75 65 73 2e 20 20 54 68 65 20 65  e values.  The e
109a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
109b0 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 0a  e if the LHS is.
109c0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
109d0 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 54 68  hin the RHS.  Th
109e0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  e value of the e
109f0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 6b  xpression is unk
10a00 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a 2a 2a 20 69  nown (NULL).** i
10a10 66 20 74 68 65 20 4c 48 53 20 69 73 20 4e 55 4c  f the LHS is NUL
10a20 4c 20 6f 72 20 69 66 20 74 68 65 20 4c 48 53 20  L or if the LHS 
10a30 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  is not contained
10a40 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
10a50 61 6e 64 20 74 68 65 0a 2a 2a 20 52 48 53 20 63  and the.** RHS c
10a60 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
10a70 6f 72 65 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ore NULL values.
10a80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10a90 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
10aa0 64 65 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  de that jumps to
10ab0 20 64 65 73 74 49 66 46 61 6c 73 65 20 69 66 20   destIfFalse if 
10ac0 74 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 0a  the LHS is not .
10ad0 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  ** contained wit
10ae0 68 69 6e 20 74 68 65 20 52 48 53 2e 20 20 49 66  hin the RHS.  If
10af0 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 77 65   due to NULLs we
10b00 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
10b10 65 20 69 66 20 74 68 65 20 4c 48 53 0a 2a 2a 20  e if the LHS.** 
10b20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
10b30 74 68 65 20 52 48 53 20 74 68 65 6e 20 6a 75 6d  the RHS then jum
10b40 70 20 74 6f 20 64 65 73 74 49 66 4e 75 6c 6c 2e  p to destIfNull.
10b50 20 20 49 66 20 74 68 65 20 4c 48 53 20 69 73 20    If the LHS is 
10b60 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 77 69 74  contained.** wit
10b70 68 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e  hin the RHS then
10b80 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 2e 0a 2a   fall through..*
10b90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
10ba0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49 4e 28  lite3ExprCodeIN(
10bb0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10bc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10bd0 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
10be0 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
10bf0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
10c00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
10c10 65 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  e IN expression 
10c20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 46  */.  int destIfF
10c30 61 6c 73 65 2c 20 20 20 20 20 20 2f 2a 20 4a 75  alse,      /* Ju
10c40 6d 70 20 68 65 72 65 20 69 66 20 4c 48 53 20 69  mp here if LHS i
10c50 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20  s not contained 
10c60 69 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20  in the RHS */.  
10c70 69 6e 74 20 64 65 73 74 49 66 4e 75 6c 6c 20 20  int destIfNull  
10c80 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
10c90 72 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  re if the result
10ca0 73 20 61 72 65 20 75 6e 6b 6e 6f 77 6e 20 64 75  s are unknown du
10cb0 65 20 74 6f 20 4e 55 4c 4c 73 20 2a 2f 0a 29 7b  e to NULLs */.){
10cc0 0a 20 20 69 6e 74 20 72 52 68 73 48 61 73 4e 75  .  int rRhsHasNu
10cd0 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20 52 65 67 69  ll = 0;  /* Regi
10ce0 73 74 65 72 20 74 68 61 74 20 69 73 20 74 72 75  ster that is tru
10cf0 65 20 69 66 20 52 48 53 20 63 6f 6e 74 61 69 6e  e if RHS contain
10d00 73 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 2a 2f  s NULL values */
10d10 0a 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79  .  char affinity
10d20 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  ;        /* Comp
10d30 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20  arison affinity 
10d40 74 6f 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  to use */.  int 
10d50 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  eType;          
10d60 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 68 65    /* Type of the
10d70 20 52 48 53 20 2a 2f 0a 20 20 69 6e 74 20 72 31   RHS */.  int r1
10d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d90 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
10da0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 56   register */.  V
10db0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
10dc0 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
10dd0 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
10de0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  tion */..  /* Co
10df0 6d 70 75 74 65 20 74 68 65 20 52 48 53 2e 20 20  mpute the RHS.  
10e00 20 41 66 74 65 72 20 74 68 69 73 20 73 74 65 70   After this step
10e10 2c 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  , the table with
10e20 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 70 45 78   cursor.  ** pEx
10e30 70 72 2d 3e 69 54 61 62 6c 65 20 77 69 6c 6c 20  pr->iTable will 
10e40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
10e50 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
10e60 20 74 68 65 20 52 48 53 2e 0a 20 20 2a 2f 0a 20   the RHS..  */. 
10e70 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
10e80 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
10e90 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  =0 );       /* O
10ea0 4f 4d 20 64 65 74 65 63 74 65 64 20 70 72 69 6f  OM detected prio
10eb0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
10ec0 65 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43  e */.  VdbeNoopC
10ed0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 62 65 67 69  omment((v, "begi
10ee0 6e 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 20 20  n IN expr"));.  
10ef0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
10f00 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
10f10 65 2c 20 70 45 78 70 72 2c 0a 20 20 20 20 20 20  e, pExpr,.      
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f30 20 20 20 20 20 20 20 49 4e 5f 49 4e 44 45 58 5f         IN_INDEX_
10f40 4d 45 4d 42 45 52 53 48 49 50 20 7c 20 49 4e 5f  MEMBERSHIP | IN_
10f50 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 2c 0a 20  INDEX_NOOP_OK,. 
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
10f80 49 66 46 61 6c 73 65 3d 3d 64 65 73 74 49 66 4e  IfFalse==destIfN
10f90 75 6c 6c 20 3f 20 30 20 3a 20 26 72 52 68 73 48  ull ? 0 : &rRhsH
10fa0 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 46  asNull);..  /* F
10fb0 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66  igure out the af
10fc0 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f  finity to use to
10fd0 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72   create a key fr
10fe0 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  om the results. 
10ff0 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65   ** of the expre
11000 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53  ssion. affinityS
11010 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74  tr stores a stat
11020 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62  ic string suitab
11030 6c 65 20 66 6f 72 0a 20 20 2a 2a 20 50 34 20 6f  le for.  ** P4 o
11040 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
11050 0a 20 20 2a 2f 0a 20 20 61 66 66 69 6e 69 74 79  .  */.  affinity
11060 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66   = comparisonAff
11070 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a 20  inity(pExpr);.. 
11080 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 4c 48 53   /* Code the LHS
11090 2c 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  , the <expr> fro
110a0 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
110b0 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  .)"..  */.  sqli
110c0 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
110d0 28 70 50 61 72 73 65 29 3b 0a 20 20 72 31 20 3d  (pParse);.  r1 =
110e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
110f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
11100 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
11110 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
11120 66 74 2c 20 72 31 29 3b 0a 0a 20 20 2f 2a 20 49  ft, r1);..  /* I
11130 66 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49  f sqlite3FindInI
11140 6e 64 65 78 28 29 20 64 69 64 20 6e 6f 74 20 66  ndex() did not f
11150 69 6e 64 20 6f 72 20 63 72 65 61 74 65 20 61 6e  ind or create an
11160 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 20   index that is. 
11170 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72   ** suitable for
11180 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
11190 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65  IN operator, the
111a0 6e 20 65 76 61 6c 75 61 74 65 20 75 73 69 6e 67  n evaluate using
111b0 20 61 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65   a.  ** sequence
111c0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e   of comparisons.
111d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
111e0 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50  e==IN_INDEX_NOOP
111f0 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
11200 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
11210 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 43 6f  >x.pList;.    Co
11220 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
11230 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
11240 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
11250 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 6e 74  >pLeft);.    int
11260 20 6c 61 62 65 6c 4f 6b 20 3d 20 73 71 6c 69 74   labelOk = sqlit
11270 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11280 76 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 2c 20  v);.    int r2, 
11290 72 65 67 54 6f 46 72 65 65 3b 0a 20 20 20 20 69  regToFree;.    i
112a0 6e 74 20 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 30  nt regCkNull = 0
112b0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
112c0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
112d0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
112e0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
112f0 29 3b 0a 20 20 20 20 69 66 28 20 64 65 73 74 49  );.    if( destI
11300 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66 46 61 6c  fNull!=destIfFal
11310 73 65 20 29 7b 0a 20 20 20 20 20 20 72 65 67 43  se ){.      regC
11320 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  kNull = sqlite3G
11330 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
11340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11350 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11360 5f 42 69 74 41 6e 64 2c 20 72 31 2c 20 72 31 2c  _BitAnd, r1, r1,
11370 20 72 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20   regCkNull);.   
11380 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
11390 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
113a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
113b0 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
113c0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
113d0 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78  pList->a[ii].pEx
113e0 70 72 2c 20 26 72 65 67 54 6f 46 72 65 65 29 3b  pr, &regToFree);
113f0 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 43 6b  .      if( regCk
11400 4e 75 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 45  Null && sqlite3E
11410 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 4c 69  xprCanBeNull(pLi
11420 73 74 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 29  st->a[ii].pExpr)
11430 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11440 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11450 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 65 67 43   OP_BitAnd, regC
11460 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72 65 67 43 6b  kNull, r2, regCk
11470 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Null);.      }. 
11480 20 20 20 20 20 69 66 28 20 69 69 3c 70 4c 69 73       if( ii<pLis
11490 74 2d 3e 6e 45 78 70 72 2d 31 20 7c 7c 20 64 65  t->nExpr-1 || de
114a0 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49 66  stIfNull!=destIf
114b0 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20 20  False ){.       
114c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
114d0 70 34 28 76 2c 20 4f 50 5f 45 71 2c 20 72 31 2c  p4(v, OP_Eq, r1,
114e0 20 6c 61 62 65 6c 4f 6b 2c 20 72 32 2c 0a 20 20   labelOk, r2,.  
114f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11500 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70          (void*)p
11510 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
11520 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
11530 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69 69 3c  overageIf(v, ii<
11540 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b  pList->nExpr-1);
11550 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
11560 65 72 61 67 65 49 66 28 76 2c 20 69 69 3d 3d 70  erageIf(v, ii==p
11570 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  List->nExpr-1);.
11580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11590 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 61  dbeChangeP5(v, a
115a0 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
115b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
115c0 73 73 65 72 74 28 20 64 65 73 74 49 66 4e 75 6c  ssert( destIfNul
115d0 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20 29  l==destIfFalse )
115e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
115f0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11600 50 5f 4e 65 2c 20 72 31 2c 20 64 65 73 74 49 66  P_Ne, r1, destIf
11610 46 61 6c 73 65 2c 20 72 32 2c 0a 20 20 20 20 20  False, r2,.     
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11630 20 20 20 20 20 28 76 6f 69 64 2a 29 70 43 6f 6c       (void*)pCol
11640 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 20  l, P4_COLLSEQ); 
11650 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11660 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11670 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
11680 61 66 66 69 6e 69 74 79 20 7c 20 53 51 4c 49 54  affinity | SQLIT
11690 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
116a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
116b0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
116c0 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6f  eg(pParse, regTo
116d0 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
116e0 20 69 66 28 20 72 65 67 43 6b 4e 75 6c 6c 20 29   if( regCkNull )
116f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
11700 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11710 49 73 4e 75 6c 6c 2c 20 72 65 67 43 6b 4e 75 6c  IsNull, regCkNul
11720 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20  l, destIfNull); 
11730 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11750 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11760 6f 74 6f 2c 20 30 2c 20 64 65 73 74 49 66 46 61  oto, 0, destIfFa
11770 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lse);.    }.    
11780 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11790 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
117a0 4f 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ok);.    sqlite3
117b0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
117c0 50 61 72 73 65 2c 20 72 65 67 43 6b 4e 75 6c 6c  Parse, regCkNull
117d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20  );.  }else{.  . 
117e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 48 53     /* If the LHS
117f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
11800 68 65 20 72 65 73 75 6c 74 20 69 73 20 65 69 74  he result is eit
11810 68 65 72 20 66 61 6c 73 65 20 6f 72 20 4e 55 4c  her false or NUL
11820 4c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20  L depending.    
11830 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ** on whether th
11840 65 20 52 48 53 20 69 73 20 65 6d 70 74 79 20 6f  e RHS is empty o
11850 72 20 6e 6f 74 2c 20 72 65 73 70 65 63 74 69 76  r not, respectiv
11860 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ely..    */.    
11870 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
11880 61 6e 42 65 4e 75 6c 6c 28 70 45 78 70 72 2d 3e  anBeNull(pExpr->
11890 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
118a0 69 66 28 20 64 65 73 74 49 66 4e 75 6c 6c 3d 3d  if( destIfNull==
118b0 64 65 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20  destIfFalse ){. 
118c0 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74 63         /* Shortc
118d0 75 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ut for the commo
118e0 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
118f0 20 66 61 6c 73 65 20 61 6e 64 20 4e 55 4c 4c 20   false and NULL 
11900 6f 75 74 63 6f 6d 65 73 20 61 72 65 0a 20 20 20  outcomes are.   
11910 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65       ** the same
11920 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
11930 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11940 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c  , OP_IsNull, r1,
11950 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 20 56 64   destIfNull); Vd
11960 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
11970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11980 20 20 20 20 69 6e 74 20 61 64 64 72 31 20 3d 20      int addr1 = 
11990 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
119a0 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  1(v, OP_NotNull,
119b0 20 72 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   r1); VdbeCovera
119c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
119d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
119e0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
119f0 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
11a00 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
11a10 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11a20 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
11a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11a40 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
11a50 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
11a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11a70 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
11a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11a90 20 20 0a 20 20 20 20 69 66 28 20 65 54 79 70 65    .    if( eType
11aa0 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  ==IN_INDEX_ROWID
11ab0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
11ac0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 52  this case, the R
11ad0 48 53 20 69 73 20 74 68 65 20 52 4f 57 49 44 20  HS is the ROWID 
11ae0 6f 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 0a  of table b-tree.
11af0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
11b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11b10 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
11b20 2c 20 72 31 2c 20 64 65 73 74 49 66 46 61 6c 73  , r1, destIfFals
11b30 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
11b40 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
11b50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11b60 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 70 45  OP_NotExists, pE
11b70 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
11b80 74 49 66 46 61 6c 73 65 2c 20 72 31 29 3b 0a 20  tIfFalse, r1);. 
11b90 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
11ba0 65 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(v);.    }else{
11bb0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
11bc0 73 20 63 61 73 65 2c 20 74 68 65 20 52 48 53 20  s case, the RHS 
11bd0 69 73 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  is an index b-tr
11be0 65 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ee..      */.   
11bf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11c00 64 4f 70 34 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp4(v, OP_Affin
11c10 69 74 79 2c 20 72 31 2c 20 31 2c 20 30 2c 20 26  ity, r1, 1, 0, &
11c20 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
11c30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
11c40 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69 70 20   set membership 
11c50 74 65 73 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  test fails, then
11c60 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
11c70 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 22 78 20  he .      ** "x 
11c80 49 4e 20 28 2e 2e 2e 29 22 20 65 78 70 72 65 73  IN (...)" expres
11c90 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 69 74  sion must be eit
11ca0 68 65 72 20 30 20 6f 72 20 4e 55 4c 4c 2e 20 49  her 0 or NULL. I
11cb0 66 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20  f the set.      
11cc0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 4e  ** contains no N
11cd0 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65 6e  ULL values, then
11ce0 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 30   the result is 0
11cf0 2e 20 49 66 20 74 68 65 20 73 65 74 20 0a 20 20  . If the set .  
11d00 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
11d10 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c  one or more NULL
11d20 20 76 61 6c 75 65 73 2c 20 74 68 65 6e 20 74 68   values, then th
11d30 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  e result of the.
11d40 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
11d50 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ion is also NULL
11d60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11d70 20 61 73 73 65 72 74 28 20 64 65 73 74 49 66 46   assert( destIfF
11d80 61 6c 73 65 21 3d 64 65 73 74 49 66 4e 75 6c 6c  alse!=destIfNull
11d90 20 7c 7c 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d   || rRhsHasNull=
11da0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
11db0 72 52 68 73 48 61 73 4e 75 6c 6c 3d 3d 30 20 29  rRhsHasNull==0 )
11dc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
11dd0 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
11de0 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 61 74 20   it is known at 
11df0 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 74 68 61  compile time tha
11e00 74 20 74 68 65 20 52 48 53 0a 20 20 20 20 20 20  t the RHS.      
11e10 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 63 6f 6e 74    ** cannot cont
11e20 61 69 6e 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e  ain NULL values.
11e30 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 61 73   This happens as
11e40 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
11e50 20 20 20 20 2a 2a 20 6f 66 20 61 20 22 4e 4f 54      ** of a "NOT
11e60 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
11e70 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
11e80 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 20 20  e schema..      
11e90 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
11ea0 41 6c 73 6f 20 72 75 6e 20 74 68 69 73 20 62 72  Also run this br
11eb0 61 6e 63 68 20 69 66 20 4e 55 4c 4c 20 69 73 20  anch if NULL is 
11ec0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 46 41  equivalent to FA
11ed0 4c 53 45 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  LSE.        ** f
11ee0 6f 72 20 74 68 69 73 20 70 61 72 74 69 63 75 6c  or this particul
11ef0 61 72 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a  ar IN operator..
11f00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11f10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11f20 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
11f30 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  tFound, pExpr->i
11f40 54 61 62 6c 65 2c 20 64 65 73 74 49 66 46 61 6c  Table, destIfFal
11f50 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  se, r1, 1);.    
11f60 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
11f70 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
11f80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20  {.        /* In 
11f90 74 68 69 73 20 62 72 61 6e 63 68 2c 20 74 68 65  this branch, the
11fa0 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6d   RHS of the IN m
11fb0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 20 4e  ight contain a N
11fc0 55 4c 4c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ULL and.        
11fd0 2a 2a 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  ** the presence 
11fe0 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e 20 74 68 65  of a NULL on the
11ff0 20 52 48 53 20 6d 61 6b 65 73 20 61 20 64 69 66   RHS makes a dif
12000 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 0a 20  ference in the. 
12010 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 63 6f 6d         ** outcom
12020 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
12030 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20        int j1;.  
12040 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  .        /* Firs
12050 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  t check to see i
12060 66 20 74 68 65 20 4c 48 53 20 69 73 20 63 6f 6e  f the LHS is con
12070 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52 48  tained in the RH
12080 53 2e 20 20 49 66 20 73 6f 2c 0a 20 20 20 20 20  S.  If so,.     
12090 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 61     ** then the a
120a0 6e 73 77 65 72 20 69 73 20 54 52 55 45 20 74 68  nswer is TRUE th
120b0 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20 4e 55  e presence of NU
120c0 4c 4c 73 20 69 6e 20 74 68 65 20 52 48 53 20 64  LLs in the RHS d
120d0 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  oes.        ** n
120e0 6f 74 20 6d 61 74 74 65 72 2e 20 20 49 66 20 74  ot matter.  If t
120f0 68 65 20 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f  he LHS is not co
12100 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 52  ntained in the R
12110 48 53 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  HS, then the.   
12120 20 20 20 20 20 2a 2a 20 61 6e 73 77 65 72 20 69       ** answer i
12130 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 52 48  s NULL if the RH
12140 53 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  S contains NULLs
12150 20 61 6e 64 20 74 68 65 20 61 6e 73 77 65 72 20   and the answer 
12160 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 46 41  is.        ** FA
12170 4c 53 45 20 69 66 20 74 68 65 20 52 48 53 20 69  LSE if the RHS i
12180 73 20 4e 55 4c 4c 2d 66 72 65 65 2e 0a 20 20 20  s NULL-free..   
12190 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
121a0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
121b0 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
121c0 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
121d0 61 62 6c 65 2c 20 30 2c 20 72 31 2c 20 31 29 3b  able, 0, r1, 1);
121e0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
121f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12210 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
12220 2c 20 72 52 68 73 48 61 73 4e 75 6c 6c 2c 20 64  , rRhsHasNull, d
12230 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
12240 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
12250 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
12260 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12270 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
12280 73 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20  stIfFalse);.    
12290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
122a0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
122b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
122c0 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
122d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
122e0 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
122f0 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61  ExprCachePop(pPa
12300 72 73 65 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  rse);.  VdbeComm
12310 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 49 4e 20  ent((v, "end IN 
12320 65 78 70 72 22 29 29 3b 0a 7d 0a 23 65 6e 64 69  expr"));.}.#endi
12330 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12340 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
12350 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 61 6e  .** Duplicate an
12360 20 38 2d 62 79 74 65 20 76 61 6c 75 65 0a 2a 2f   8-byte value.*/
12370 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 75  .static char *du
12380 70 38 62 79 74 65 73 28 56 64 62 65 20 2a 76 2c  p8bytes(Vdbe *v,
12390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 29   const char *in)
123a0 7b 0a 20 20 63 68 61 72 20 2a 6f 75 74 20 3d 20  {.  char *out = 
123b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
123c0 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44 62  aw(sqlite3VdbeDb
123d0 28 76 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 6f  (v), 8);.  if( o
123e0 75 74 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ut ){.    memcpy
123f0 28 6f 75 74 2c 20 69 6e 2c 20 38 29 3b 0a 20 20  (out, in, 8);.  
12400 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a  }.  return out;.
12410 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
12420 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
12430 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  POINT./*.** Gene
12440 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
12450 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
12460 74 20 74 68 65 20 66 6c 6f 61 74 69 6e 67 20 70  t the floating p
12470 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 64 65  oint.** value de
12480 73 63 72 69 62 65 64 20 62 79 20 7a 5b 30 2e 2e  scribed by z[0..
12490 6e 2d 31 5d 20 69 6e 74 6f 20 72 65 67 69 73 74  n-1] into regist
124a0 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er iMem..**.** T
124b0 68 65 20 7a 5b 5d 20 73 74 72 69 6e 67 20 77 69  he z[] string wi
124c0 6c 6c 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  ll probably not 
124d0 62 65 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74  be zero-terminat
124e0 65 64 2e 20 20 42 75 74 20 74 68 65 20 0a 2a 2a  ed.  But the .**
124f0 20 7a 5b 6e 5d 20 63 68 61 72 61 63 74 65 72 20   z[n] character 
12500 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
12510 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   be something th
12520 61 74 20 64 6f 65 73 20 6e 6f 74 20 6c 6f 6f 6b  at does not look
12530 0a 2a 2a 20 6c 69 6b 65 20 74 68 65 20 63 6f 6e  .** like the con
12540 74 69 6e 75 61 74 69 6f 6e 20 6f 66 20 74 68 65  tinuation of the
12550 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
12560 69 63 20 76 6f 69 64 20 63 6f 64 65 52 65 61 6c  ic void codeReal
12570 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
12580 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 65 67  char *z, int neg
12590 61 74 65 46 6c 61 67 2c 20 69 6e 74 20 69 4d 65  ateFlag, int iMe
125a0 6d 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  m){.  if( ALWAYS
125b0 28 7a 21 3d 30 29 20 29 7b 0a 20 20 20 20 64 6f  (z!=0) ){.    do
125c0 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 20 20  uble value;.    
125d0 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 73 71  char *zV;.    sq
125e0 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 76 61  lite3AtoF(z, &va
125f0 6c 75 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  lue, sqlite3Strl
12600 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f  en30(z), SQLITE_
12610 55 54 46 38 29 3b 0a 20 20 20 20 61 73 73 65 72  UTF8);.    asser
12620 74 28 20 21 73 71 6c 69 74 65 33 49 73 4e 61 4e  t( !sqlite3IsNaN
12630 28 76 61 6c 75 65 29 20 29 3b 20 2f 2a 20 54 68  (value) ); /* Th
12640 65 20 6e 65 77 20 41 74 6f 46 20 6e 65 76 65 72  e new AtoF never
12650 20 72 65 74 75 72 6e 73 20 4e 61 4e 20 2a 2f 0a   returns NaN */.
12660 20 20 20 20 69 66 28 20 6e 65 67 61 74 65 46 6c      if( negateFl
12670 61 67 20 29 20 76 61 6c 75 65 20 3d 20 2d 76 61  ag ) value = -va
12680 6c 75 65 3b 0a 20 20 20 20 7a 56 20 3d 20 64 75  lue;.    zV = du
12690 70 38 62 79 74 65 73 28 76 2c 20 28 63 68 61 72  p8bytes(v, (char
126a0 2a 29 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 73  *)&value);.    s
126b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
126c0 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
126d0 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f  iMem, 0, zV, P4_
126e0 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  REAL);.  }.}.#en
126f0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  dif.../*.** Gene
12700 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
12710 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
12720 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
12730 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
12740 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f  t z[0..n-1] into
12750 20 72 65 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a   register iMem..
12760 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75 2e 7a 54 6f  **.** Expr.u.zTo
12770 6b 65 6e 20 69 73 20 61 6c 77 61 79 73 20 55 54  ken is always UT
12780 46 38 20 61 6e 64 20 7a 65 72 6f 2d 74 65 72 6d  F8 and zero-term
12790 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  inated..*/.stati
127a0 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
127b0 65 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  er(Parse *pParse
127c0 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
127d0 6e 74 20 6e 65 67 46 6c 61 67 2c 20 69 6e 74 20  nt negFlag, int 
127e0 69 4d 65 6d 29 7b 0a 20 20 56 64 62 65 20 2a 76  iMem){.  Vdbe *v
127f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12800 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
12810 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
12820 75 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  ue ){.    int i 
12830 3d 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  = pExpr->u.iValu
12840 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e;.    assert( i
12850 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >=0 );.    if( n
12860 65 67 46 6c 61 67 20 29 20 69 20 3d 20 2d 69 3b  egFlag ) i = -i;
12870 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12880 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
12890 65 67 65 72 2c 20 69 2c 20 69 4d 65 6d 29 3b 0a  eger, i, iMem);.
128a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
128b0 20 63 3b 0a 20 20 20 20 69 36 34 20 76 61 6c 75   c;.    i64 valu
128c0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
128d0 72 20 2a 7a 20 3d 20 70 45 78 70 72 2d 3e 75 2e  r *z = pExpr->u.
128e0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 61 73 73 65  zToken;.    asse
128f0 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20 20 20 20  rt( z!=0 );.    
12900 63 20 3d 20 73 71 6c 69 74 65 33 44 65 63 4f 72  c = sqlite3DecOr
12910 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76 61 6c  HexToI64(z, &val
12920 75 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ue);.    if( c==
12930 30 20 7c 7c 20 28 63 3d 3d 32 20 26 26 20 6e 65  0 || (c==2 && ne
12940 67 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 20 20  gFlag) ){.      
12950 63 68 61 72 20 2a 7a 56 3b 0a 20 20 20 20 20 20  char *zV;.      
12960 69 66 28 20 6e 65 67 46 6c 61 67 20 29 7b 20 76  if( negFlag ){ v
12970 61 6c 75 65 20 3d 20 63 3d 3d 32 20 3f 20 53 4d  alue = c==2 ? SM
12980 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 2d  ALLEST_INT64 : -
12990 76 61 6c 75 65 3b 20 7d 0a 20 20 20 20 20 20 7a  value; }.      z
129a0 56 20 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c  V = dup8bytes(v,
129b0 20 28 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b   (char*)&value);
129c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
129d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
129e0 6e 74 36 34 2c 20 30 2c 20 69 4d 65 6d 2c 20 30  nt64, 0, iMem, 0
129f0 2c 20 7a 56 2c 20 50 34 5f 49 4e 54 36 34 29 3b  , zV, P4_INT64);
12a00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  .    }else{.#ifd
12a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
12a20 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
12a30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12a40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 76 65  Msg(pParse, "ove
12a50 72 73 69 7a 65 64 20 69 6e 74 65 67 65 72 3a 20  rsized integer: 
12a60 25 73 25 73 22 2c 20 6e 65 67 46 6c 61 67 20 3f  %s%s", negFlag ?
12a70 20 22 2d 22 20 3a 20 22 22 2c 20 7a 29 3b 0a 23   "-" : "", z);.#
12a80 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
12a90 49 54 45 5f 4f 4d 49 54 5f 48 45 58 5f 49 4e 54  ITE_OMIT_HEX_INT
12aa0 45 47 45 52 0a 20 20 20 20 20 20 69 66 28 20 73  EGER.      if( s
12ab0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
12ac0 7a 2c 22 30 78 22 2c 32 29 3d 3d 30 20 29 7b 0a  z,"0x",2)==0 ){.
12ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12ae0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
12af0 22 68 65 78 20 6c 69 74 65 72 61 6c 20 74 6f 6f  "hex literal too
12b00 20 62 69 67 3a 20 25 73 22 2c 20 7a 29 3b 0a 20   big: %s", z);. 
12b10 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
12b20 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
12b30 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 7a 2c    codeReal(v, z,
12b40 20 6e 65 67 46 6c 61 67 2c 20 69 4d 65 6d 29 3b   negFlag, iMem);
12b50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
12b60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12b70 2a 2a 20 43 6c 65 61 72 20 61 20 63 61 63 68 65  ** Clear a cache
12b80 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69   entry..*/.stati
12b90 63 20 76 6f 69 64 20 63 61 63 68 65 45 6e 74 72  c void cacheEntr
12ba0 79 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  yClear(Parse *pP
12bb0 61 72 73 65 2c 20 73 74 72 75 63 74 20 79 43 6f  arse, struct yCo
12bc0 6c 43 61 63 68 65 20 2a 70 29 7b 0a 20 20 69 66  lCache *p){.  if
12bd0 28 20 70 2d 3e 74 65 6d 70 52 65 67 20 29 7b 0a  ( p->tempReg ){.
12be0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
12bf0 6e 54 65 6d 70 52 65 67 3c 41 72 72 61 79 53 69  nTempReg<ArraySi
12c00 7a 65 28 70 50 61 72 73 65 2d 3e 61 54 65 6d 70  ze(pParse->aTemp
12c10 52 65 67 29 20 29 7b 0a 20 20 20 20 20 20 70 50  Reg) ){.      pP
12c20 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b 70  arse->aTempReg[p
12c30 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 2b  Parse->nTempReg+
12c40 2b 5d 20 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20  +] = p->iReg;.  
12c50 20 20 7d 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52    }.    p->tempR
12c60 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eg = 0;.  }.}...
12c70 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 69 6e 20  /*.** Record in 
12c80 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
12c90 20 74 68 61 74 20 61 20 70 61 72 74 69 63 75 6c   that a particul
12ca0 61 72 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  ar column from a
12cb0 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 20 74  .** particular t
12cc0 61 62 6c 65 20 69 73 20 73 74 6f 72 65 64 20 69  able is stored i
12cd0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 72  n a particular r
12ce0 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64  egister..*/.void
12cf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
12d00 65 53 74 6f 72 65 28 50 61 72 73 65 20 2a 70 50  eStore(Parse *pP
12d10 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 2c 20  arse, int iTab, 
12d20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e 74 20 69 52  int iCol, int iR
12d30 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  eg){.  int i;.  
12d40 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a 20 20 69 6e  int minLru;.  in
12d50 74 20 69 64 78 4c 72 75 3b 0a 20 20 73 74 72 75  t idxLru;.  stru
12d60 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
12d70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 67  ..  assert( iReg
12d80 3e 30 20 29 3b 20 20 2f 2a 20 52 65 67 69 73 74  >0 );  /* Regist
12d90 65 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  er numbers are a
12da0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 20 2a  lways positive *
12db0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  /.  assert( iCol
12dc0 3e 3d 2d 31 20 26 26 20 69 43 6f 6c 3c 33 32 37  >=-1 && iCol<327
12dd0 36 38 20 29 3b 20 20 2f 2a 20 46 69 6e 69 74 65  68 );  /* Finite
12de0 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   column numbers 
12df0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  */..  /* The SQL
12e00 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
12e10 66 6c 61 67 20 64 69 73 61 62 6c 65 73 20 74 68  flag disables th
12e20 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 20  e column cache. 
12e30 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
12e40 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 6f  ** for testing o
12e50 6e 6c 79 20 2d 20 74 6f 20 76 65 72 69 66 79 20  nly - to verify 
12e60 74 68 61 74 20 53 51 4c 69 74 65 20 61 6c 77 61  that SQLite alwa
12e70 79 73 20 67 65 74 73 20 74 68 65 20 73 61 6d 65  ys gets the same
12e80 20 61 6e 73 77 65 72 0a 20 20 2a 2a 20 77 69 74   answer.  ** wit
12e90 68 20 61 6e 64 20 77 69 74 68 6f 75 74 20 74 68  h and without th
12ea0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
12eb0 20 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d    */.  if( Optim
12ec0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
12ed0 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49  pParse->db, SQLI
12ee0 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 29 20  TE_ColumnCache) 
12ef0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
12f00 46 69 72 73 74 20 72 65 70 6c 61 63 65 20 61 6e  First replace an
12f10 79 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  y existing entry
12f20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ..  **.  ** Actu
12f30 61 6c 6c 79 2c 20 74 68 65 20 77 61 79 20 74 68  ally, the way th
12f40 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 69  e column cache i
12f50 73 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65 64  s currently used
12f60 2c 20 77 65 20 61 72 65 20 67 75 61 72 61 6e 74  , we are guarant
12f70 65 65 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  eed.  ** that th
12f80 65 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 6e 65  e object will ne
12f90 76 65 72 20 61 6c 72 65 61 64 79 20 62 65 20 69  ver already be i
12fa0 6e 20 63 61 63 68 65 2e 20 20 56 65 72 69 66 79  n cache.  Verify
12fb0 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 2e   this guarantee.
12fc0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
12fd0 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 2c 20  EBUG.  for(i=0, 
12fe0 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  p=pParse->aColCa
12ff0 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f  che; i<SQLITE_N_
13000 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70  COLCACHE; i++, p
13010 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
13020 20 70 2d 3e 69 52 65 67 3d 3d 30 20 7c 7c 20 70   p->iReg==0 || p
13030 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61 62 20 7c  ->iTable!=iTab |
13040 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43  | p->iColumn!=iC
13050 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ol );.  }.#endif
13060 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 6e 20 65  ..  /* Find an e
13070 6d 70 74 79 20 73 6c 6f 74 20 61 6e 64 20 72 65  mpty slot and re
13080 70 6c 61 63 65 20 69 74 20 2a 2f 0a 20 20 66 6f  place it */.  fo
13090 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d  r(i=0, p=pParse-
130a0 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51  >aColCache; i<SQ
130b0 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
130c0 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20   i++, p++){.    
130d0 69 66 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20 29  if( p->iReg==0 )
130e0 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 65 76 65  {.      p->iLeve
130f0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
13100 68 65 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 70  heLevel;.      p
13110 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 3b  ->iTable = iTab;
13120 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
13130 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
13140 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b 0a  p->iReg = iReg;.
13150 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
13160 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 6c   = 0;.      p->l
13170 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61  ru = pParse->iCa
13180 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  cheCnt++;.      
13190 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
131a0 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  }..  /* Replace 
131b0 74 68 65 20 6c 61 73 74 20 72 65 63 65 6e 74 6c  the last recentl
131c0 79 20 75 73 65 64 20 2a 2f 0a 20 20 6d 69 6e 4c  y used */.  minL
131d0 72 75 20 3d 20 30 78 37 66 66 66 66 66 66 66 3b  ru = 0x7fffffff;
131e0 0a 20 20 69 64 78 4c 72 75 20 3d 20 2d 31 3b 0a  .  idxLru = -1;.
131f0 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
13200 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
13210 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
13220 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
13230 20 20 20 20 69 66 28 20 70 2d 3e 6c 72 75 3c 6d      if( p->lru<m
13240 69 6e 4c 72 75 20 29 7b 0a 20 20 20 20 20 20 69  inLru ){.      i
13250 64 78 4c 72 75 20 3d 20 69 3b 0a 20 20 20 20 20  dxLru = i;.     
13260 20 6d 69 6e 4c 72 75 20 3d 20 70 2d 3e 6c 72 75   minLru = p->lru
13270 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13280 28 20 41 4c 57 41 59 53 28 69 64 78 4c 72 75 3e  ( ALWAYS(idxLru>
13290 3d 30 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 26  =0) ){.    p = &
132a0 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
132b0 65 5b 69 64 78 4c 72 75 5d 3b 0a 20 20 20 20 70  e[idxLru];.    p
132c0 2d 3e 69 4c 65 76 65 6c 20 3d 20 70 50 61 72 73  ->iLevel = pPars
132d0 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a  e->iCacheLevel;.
132e0 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
132f0 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 43 6f  iTab;.    p->iCo
13300 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  lumn = iCol;.   
13310 20 70 2d 3e 69 52 65 67 20 3d 20 69 52 65 67 3b   p->iReg = iReg;
13320 0a 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20  .    p->tempReg 
13330 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 72 75 20  = 0;.    p->lru 
13340 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  = pParse->iCache
13350 43 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  Cnt++;.    retur
13360 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n;.  }.}../*.** 
13370 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 72 65  Indicate that re
13380 67 69 73 74 65 72 73 20 62 65 74 77 65 65 6e 20  gisters between 
13390 69 52 65 67 2e 2e 69 52 65 67 2b 6e 52 65 67 2d  iReg..iReg+nReg-
133a0 31 20 61 72 65 20 62 65 69 6e 67 20 6f 76 65 72  1 are being over
133b0 77 72 69 74 74 65 6e 2e 0a 2a 2a 20 50 75 72 67  written..** Purg
133c0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 72  e the range of r
133d0 65 67 69 73 74 65 72 73 20 66 72 6f 6d 20 74 68  egisters from th
133e0 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
133f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
13400 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 50  xprCacheRemove(P
13410 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
13420 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67  t iReg, int nReg
13430 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
13440 74 20 69 4c 61 73 74 20 3d 20 69 52 65 67 20 2b  t iLast = iReg +
13450 20 6e 52 65 67 20 2d 20 31 3b 0a 20 20 73 74 72   nReg - 1;.  str
13460 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
13470 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
13480 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
13490 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
134a0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
134b0 7b 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d  {.    int r = p-
134c0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72  >iReg;.    if( r
134d0 3e 3d 69 52 65 67 20 26 26 20 72 3c 3d 69 4c 61  >=iReg && r<=iLa
134e0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68  st ){.      cach
134f0 65 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72  eEntryClear(pPar
13500 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d  se, p);.      p-
13510 3e 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d  >iReg = 0;.    }
13520 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
13530 6d 65 6d 62 65 72 20 74 68 65 20 63 75 72 72 65  member the curre
13540 6e 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  nt column cache 
13550 63 6f 6e 74 65 78 74 2e 20 20 41 6e 79 20 6e 65  context.  Any ne
13560 77 20 65 6e 74 72 69 65 73 20 61 64 64 65 64 0a  w entries added.
13570 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ** added to the 
13580 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 66 74  column cache aft
13590 65 72 20 74 68 69 73 20 63 61 6c 6c 20 61 72 65  er this call are
135a0 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 20 74 68   removed when th
135b0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
135c0 6e 67 20 70 6f 70 20 6f 63 63 75 72 73 2e 0a 2a  ng pop occurs..*
135d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
135e0 70 72 43 61 63 68 65 50 75 73 68 28 50 61 72 73  prCachePush(Pars
135f0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
13600 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
13610 6c 2b 2b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  l++;.#ifdef SQLI
13620 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
13630 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
13640 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
13650 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
13660 70 72 69 6e 74 66 28 22 50 55 53 48 20 74 6f 20  printf("PUSH to 
13670 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 69  %d\n", pParse->i
13680 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20 7d  CacheLevel);.  }
13690 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
136a0 20 52 65 6d 6f 76 65 20 66 72 6f 6d 20 74 68 65   Remove from the
136b0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 61 6e   column cache an
136c0 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  y entries that w
136d0 65 72 65 20 61 64 64 65 64 20 73 69 6e 63 65 20  ere added since 
136e0 74 68 65 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  the.** the previ
136f0 6f 75 73 20 73 71 6c 69 74 65 33 45 78 70 72 43  ous sqlite3ExprC
13700 61 63 68 65 50 75 73 68 20 6f 70 65 72 61 74 69  achePush operati
13710 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  on.  In other wo
13720 72 64 73 2c 20 72 65 73 74 6f 72 65 0a 2a 2a 20  rds, restore.** 
13730 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
13740 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
13750 20 70 72 69 6f 72 20 74 68 65 20 6d 6f 73 74 20   prior the most 
13760 72 65 63 65 6e 74 20 50 75 73 68 2e 0a 2a 2f 0a  recent Push..*/.
13770 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
13780 43 61 63 68 65 50 6f 70 28 50 61 72 73 65 20 2a  CachePop(Parse *
13790 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  pParse){.  int i
137a0 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43  ;.  struct yColC
137b0 61 63 68 65 20 2a 70 3b 0a 20 20 61 73 73 65 72  ache *p;.  asser
137c0 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
137d0 65 4c 65 76 65 6c 3e 3d 31 20 29 3b 0a 20 20 70  eLevel>=1 );.  p
137e0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
137f0 65 6c 2d 2d 3b 0a 23 69 66 64 65 66 20 53 51 4c  el--;.#ifdef SQL
13800 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
13810 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
13820 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
13830 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
13840 20 70 72 69 6e 74 66 28 22 50 4f 50 20 20 74 6f   printf("POP  to
13850 20 25 64 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e   %d\n", pParse->
13860 69 43 61 63 68 65 4c 65 76 65 6c 29 3b 0a 20 20  iCacheLevel);.  
13870 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
13880 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
13890 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
138a0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
138b0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, p++){.    if(
138c0 20 70 2d 3e 69 52 65 67 20 26 26 20 70 2d 3e 69   p->iReg && p->i
138d0 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
138e0 61 63 68 65 4c 65 76 65 6c 20 29 7b 0a 20 20 20  acheLevel ){.   
138f0 20 20 20 63 61 63 68 65 45 6e 74 72 79 43 6c 65     cacheEntryCle
13900 61 72 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  ar(pParse, p);. 
13910 20 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 30       p->iReg = 0
13920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13930 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 63 61 63 68  *.** When a cach
13940 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 75  ed column is reu
13950 73 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  sed, make sure t
13960 68 61 74 20 69 74 73 20 72 65 67 69 73 74 65 72  hat its register
13970 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72   is.** no longer
13980 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 20   available as a 
13990 74 65 6d 70 20 72 65 67 69 73 74 65 72 2e 20 20  temp register.  
139a0 74 69 63 6b 65 74 20 23 33 38 37 39 3a 20 20 74  ticket #3879:  t
139b0 68 61 74 20 73 61 6d 65 0a 2a 2a 20 72 65 67 69  hat same.** regi
139c0 73 74 65 72 20 6d 69 67 68 74 20 62 65 20 69 6e  ster might be in
139d0 20 74 68 65 20 63 61 63 68 65 20 69 6e 20 6d 75   the cache in mu
139e0 6c 74 69 70 6c 65 20 70 6c 61 63 65 73 2c 20 73  ltiple places, s
139f0 6f 20 62 65 20 73 75 72 65 20 74 6f 0a 2a 2a 20  o be sure to.** 
13a00 67 65 74 20 74 68 65 6d 20 61 6c 6c 2e 0a 2a 2f  get them all..*/
13a10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
13a20 69 74 65 33 45 78 70 72 43 61 63 68 65 50 69 6e  ite3ExprCachePin
13a30 52 65 67 69 73 74 65 72 28 50 61 72 73 65 20 2a  Register(Parse *
13a40 70 50 61 72 73 65 2c 20 69 6e 74 20 69 52 65 67  pParse, int iReg
13a50 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
13a60 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
13a70 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d  p;.  for(i=0, p=
13a80 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
13a90 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f  e; i<SQLITE_N_CO
13aa0 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b  LCACHE; i++, p++
13ab0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52  ){.    if( p->iR
13ac0 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20 20  eg==iReg ){.    
13ad0 20 20 70 2d 3e 74 65 6d 70 52 65 67 20 3d 20 30    p->tempReg = 0
13ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
13af0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
13b00 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
13b10 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  e value of the i
13b20 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
13b30 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
13b40 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
13b50 65 47 65 74 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c  eGetColumnOfTabl
13b60 65 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  e(.  Vdbe *v,   
13b70 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
13b80 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
13b90 69 6f 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ion */.  Table *
13ba0 70 54 61 62 2c 20 20 20 20 2f 2a 20 54 68 65 20  pTab,    /* The 
13bb0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
13bc0 20 74 68 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20   the value */.  
13bd0 69 6e 74 20 69 54 61 62 43 75 72 2c 20 20 20 20  int iTabCur,    
13be0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 63 75 72  /* The table cur
13bf0 73 6f 72 2e 20 20 4f 72 20 74 68 65 20 50 4b 20  sor.  Or the PK 
13c00 63 75 72 73 6f 72 20 66 6f 72 20 57 49 54 48 4f  cursor for WITHO
13c10 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20 20 69 6e  UT ROWID */.  in
13c20 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 2f 2a  t iCol,       /*
13c30 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f   Index of the co
13c40 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
13c50 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20  */.  int regOut 
13c60 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
13c70 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  the value into t
13c80 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
13c90 29 7b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20  ){.  if( iCol<0 
13ca0 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  || iCol==pTab->i
13cb0 50 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  PKey ){.    sqli
13cc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13cd0 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 43   OP_Rowid, iTabC
13ce0 75 72 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d  ur, regOut);.  }
13cf0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6f 70  else{.    int op
13d00 20 3d 20 49 73 56 69 72 74 75 61 6c 28 70 54 61   = IsVirtual(pTa
13d10 62 29 20 3f 20 4f 50 5f 56 43 6f 6c 75 6d 6e 20  b) ? OP_VColumn 
13d20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  : OP_Column;.   
13d30 20 69 6e 74 20 78 20 3d 20 69 43 6f 6c 3b 0a 20   int x = iCol;. 
13d40 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
13d50 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
13d60 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
13d70 6e 4f 66 49 6e 64 65 78 28 73 71 6c 69 74 65 33  nOfIndex(sqlite3
13d80 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
13d90 70 54 61 62 29 2c 20 69 43 6f 6c 29 3b 0a 20 20  pTab), iCol);.  
13da0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
13db0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
13dc0 20 69 54 61 62 43 75 72 2c 20 78 2c 20 72 65 67   iTabCur, x, reg
13dd0 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Out);.  }.  if( 
13de0 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 73  iCol>=0 ){.    s
13df0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
13e00 75 6c 74 28 76 2c 20 70 54 61 62 2c 20 69 43 6f  ult(v, pTab, iCo
13e10 6c 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a  l, regOut);.  }.
13e20 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13e30 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
13e40 20 65 78 74 72 61 63 74 20 74 68 65 20 69 43 6f   extract the iCo
13e50 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75 6d 6e 20 66  lumn-th column f
13e60 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65 20 70 54 61  rom.** table pTa
13e70 62 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  b and store the 
13e80 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20  column value in 
13e90 61 20 72 65 67 69 73 74 65 72 2e 20 20 41 6e 20  a register.  An 
13ea0 65 66 66 6f 72 74 0a 2a 2a 20 69 73 20 6d 61 64  effort.** is mad
13eb0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63  e to store the c
13ec0 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 6e 20 72  olumn value in r
13ed0 65 67 69 73 74 65 72 20 69 52 65 67 2c 20 62 75  egister iReg, bu
13ee0 74 20 74 68 69 73 20 69 73 0a 2a 2a 20 6e 6f 74  t this is.** not
13ef0 20 67 75 61 72 61 6e 74 65 65 64 2e 20 20 54 68   guaranteed.  Th
13f00 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
13f10 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  e column value i
13f20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
13f30 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
13f40 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  an open cursor t
13f50 6f 20 70 54 61 62 20 69 6e 20 69 54 61 62 6c 65  o pTab in iTable
13f60 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
13f70 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  ne.** is called.
13f80 20 20 49 66 20 69 43 6f 6c 75 6d 6e 3c 30 20 74    If iColumn<0 t
13f90 68 65 6e 20 63 6f 64 65 20 69 73 20 67 65 6e 65  hen code is gene
13fa0 72 61 74 65 64 20 74 68 61 74 20 65 78 74 72 61  rated that extra
13fb0 63 74 73 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  cts the rowid..*
13fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
13fd0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 0a  rCodeGetColumn(.
13fe0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13ff0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
14000 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
14010 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
14020 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
14030 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
14040 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
14050 72 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  re reading from 
14060 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
14070 2c 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  ,     /* Index o
14080 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75  f the table colu
14090 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  mn */.  int iTab
140a0 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  le,      /* The 
140b0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
140c0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  to the table */.
140d0 20 20 69 6e 74 20 69 52 65 67 2c 20 20 20 20 20    int iReg,     
140e0 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75     /* Store resu
140f0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20 75 38  lts here */.  u8
14100 20 70 35 20 20 20 20 20 20 20 20 20 20 20 20 2f   p5            /
14110 2a 20 50 35 20 76 61 6c 75 65 20 66 6f 72 20 4f  * P5 value for O
14120 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  P_Column */.){. 
14130 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
14140 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14150 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f 6c  i;.  struct yCol
14160 43 61 63 68 65 20 2a 70 3b 0a 0a 20 20 66 6f 72  Cache *p;..  for
14170 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e  (i=0, p=pParse->
14180 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c  aColCache; i<SQL
14190 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20  ITE_N_COLCACHE; 
141a0 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 69  i++, p++){.    i
141b0 66 28 20 70 2d 3e 69 52 65 67 3e 30 20 26 26 20  f( p->iReg>0 && 
141c0 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  p->iTable==iTabl
141d0 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3d  e && p->iColumn=
141e0 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  =iColumn ){.    
141f0 20 20 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73    p->lru = pPars
14200 65 2d 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a  e->iCacheCnt++;.
14210 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14220 72 43 61 63 68 65 50 69 6e 52 65 67 69 73 74 65  rCachePinRegiste
14230 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 69 52 65  r(pParse, p->iRe
14240 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
14250 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 7d 0a   p->iReg;.    }.
14260 20 20 7d 20 20 0a 20 20 61 73 73 65 72 74 28 20    }  .  assert( 
14270 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
14280 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
14290 6d 6e 4f 66 54 61 62 6c 65 28 76 2c 20 70 54 61  mnOfTable(v, pTa
142a0 62 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f 6c 75  b, iTable, iColu
142b0 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 69 66 28  mn, iReg);.  if(
142c0 20 70 35 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   p5 ){.    sqlit
142d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
142e0 2c 20 70 35 29 3b 0a 20 20 7d 65 6c 73 65 7b 20  , p5);.  }else{ 
142f0 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78    .    sqlite3Ex
14300 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
14310 72 73 65 2c 20 69 54 61 62 6c 65 2c 20 69 43 6f  rse, iTable, iCo
14320 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20 20 7d  lumn, iReg);.  }
14330 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
14340 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
14350 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  ll column cache 
14360 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 76 6f 69 64  entries..*/.void
14370 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
14380 65 43 6c 65 61 72 28 50 61 72 73 65 20 2a 70 50  eClear(Parse *pP
14390 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  arse){.  int i;.
143a0 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
143b0 68 65 20 2a 70 3b 0a 0a 23 69 66 20 53 51 4c 49  he *p;..#if SQLI
143c0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
143d0 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
143e0 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
143f0 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
14400 70 72 69 6e 74 66 28 22 43 4c 45 41 52 5c 6e 22  printf("CLEAR\n"
14410 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14420 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73  for(i=0, p=pPars
14430 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c  e->aColCache; i<
14440 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48  SQLITE_N_COLCACH
14450 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20  E; i++, p++){.  
14460 20 20 69 66 28 20 70 2d 3e 69 52 65 67 20 29 7b    if( p->iReg ){
14470 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
14480 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
14490 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
144a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
144b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
144c0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 61 6e  the fact that an
144d0 20 61 66 66 69 6e 69 74 79 20 63 68 61 6e 67 65   affinity change
144e0 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e   has occurred on
144f0 20 69 43 6f 75 6e 74 0a 2a 2a 20 72 65 67 69 73   iCount.** regis
14500 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 77 69  ters starting wi
14510 74 68 20 69 53 74 61 72 74 2e 0a 2a 2f 0a 76 6f  th iStart..*/.vo
14520 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  id sqlite3ExprCa
14530 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
14540 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
14550 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74   int iStart, int
14560 20 69 43 6f 75 6e 74 29 7b 0a 20 20 73 71 6c 69   iCount){.  sqli
14570 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
14580 76 65 28 70 50 61 72 73 65 2c 20 69 53 74 61 72  ve(pParse, iStar
14590 74 2c 20 69 43 6f 75 6e 74 29 3b 0a 7d 0a 0a 2f  t, iCount);.}../
145a0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
145b0 64 65 20 74 6f 20 6d 6f 76 65 20 63 6f 6e 74 65  de to move conte
145c0 6e 74 20 66 72 6f 6d 20 72 65 67 69 73 74 65 72  nt from register
145d0 73 20 69 46 72 6f 6d 2e 2e 2e 69 46 72 6f 6d 2b  s iFrom...iFrom+
145e0 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76 65 72 20 74  nReg-1.** over t
145f0 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e 52 65 67 2d  o iTo..iTo+nReg-
14600 31 2e 20 4b 65 65 70 20 74 68 65 20 63 6f 6c 75  1. Keep the colu
14610 6d 6e 20 63 61 63 68 65 20 75 70 2d 74 6f 2d 64  mn cache up-to-d
14620 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ate..*/.void sql
14630 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
14640 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14650 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69  int iFrom, int i
14660 54 6f 2c 20 69 6e 74 20 6e 52 65 67 29 7b 0a 20  To, int nReg){. 
14670 20 61 73 73 65 72 74 28 20 69 46 72 6f 6d 3e 3d   assert( iFrom>=
14680 69 54 6f 2b 6e 52 65 67 20 7c 7c 20 69 46 72 6f  iTo+nReg || iFro
14690 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20 29 3b 0a 20  m+nReg<=iTo );. 
146a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
146b0 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  p3(pParse->pVdbe
146c0 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69 46 72 6f 6d  , OP_Move, iFrom
146d0 2c 20 69 54 6f 2c 20 6e 52 65 67 29 3b 0a 20 20  , iTo, nReg);.  
146e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
146f0 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
14700 46 72 6f 6d 2c 20 6e 52 65 67 29 3b 0a 7d 0a 0a  From, nReg);.}..
14710 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14720 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
14730 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
14740 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
14750 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
14760 61 6e 79 20 72 65 67 69 73 74 65 72 20 69 6e 20  any register in 
14770 74 68 65 20 72 61 6e 67 65 20 69 46 72 6f 6d 2e  the range iFrom.
14780 2e 69 54 6f 20 28 69 6e 63 6c 75 73 69 76 65 29  .iTo (inclusive)
14790 0a 2a 2a 20 69 73 20 75 73 65 64 20 61 73 20 70  .** is used as p
147a0 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  art of the colum
147b0 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  n cache..**.** T
147c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
147d0 73 65 64 20 77 69 74 68 69 6e 20 61 73 73 65 72  sed within asser
147e0 74 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65  t() and testcase
147f0 28 29 20 6d 61 63 72 6f 73 20 6f 6e 6c 79 0a 2a  () macros only.*
14800 2a 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 61  * and does not a
14810 70 70 65 61 72 20 69 6e 20 61 20 6e 6f 72 6d 61  ppear in a norma
14820 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  l build..*/.stat
14830 69 63 20 69 6e 74 20 75 73 65 64 41 73 43 6f 6c  ic int usedAsCol
14840 75 6d 6e 43 61 63 68 65 28 50 61 72 73 65 20 2a  umnCache(Parse *
14850 70 50 61 72 73 65 2c 20 69 6e 74 20 69 46 72 6f  pParse, int iFro
14860 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 69  m, int iTo){.  i
14870 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
14880 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 66  ColCache *p;.  f
14890 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
148a0 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
148b0 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
148c0 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
148d0 20 69 6e 74 20 72 20 3d 20 70 2d 3e 69 52 65 67   int r = p->iReg
148e0 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 69 46 72  ;.    if( r>=iFr
148f0 6f 6d 20 26 26 20 72 3c 3d 69 54 6f 20 29 20 72  om && r<=iTo ) r
14900 65 74 75 72 6e 20 31 3b 20 20 20 20 2f 2a 4e 4f  eturn 1;    /*NO
14910 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a 20 20 72 65  _TEST*/.  }.  re
14920 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
14930 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
14940 20 7c 7c 20 53 51 4c 49 54 45 5f 43 4f 56 45 52   || SQLITE_COVER
14950 41 47 45 5f 54 45 53 54 20 2a 2f 0a 0a 2f 2a 0a  AGE_TEST */../*.
14960 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 65 78  ** Convert an ex
14970 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 74 6f  pression node to
14980 20 61 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 2a   a TK_REGISTER.*
14990 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
149a0 70 72 54 6f 52 65 67 69 73 74 65 72 28 45 78 70  prToRegister(Exp
149b0 72 20 2a 70 2c 20 69 6e 74 20 69 52 65 67 29 7b  r *p, int iReg){
149c0 0a 20 20 70 2d 3e 6f 70 32 20 3d 20 70 2d 3e 6f  .  p->op2 = p->o
149d0 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  p;.  p->op = TK_
149e0 52 45 47 49 53 54 45 52 3b 0a 20 20 70 2d 3e 69  REGISTER;.  p->i
149f0 54 61 62 6c 65 20 3d 20 69 52 65 67 3b 0a 20 20  Table = iReg;.  
14a00 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74  ExprClearPropert
14a10 79 28 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 7d  y(p, EP_Skip);.}
14a20 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
14a30 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
14a40 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
14a50 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
14a60 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.** expression.
14a70 20 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 6f    Attempt to sto
14a80 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
14a90 6e 20 72 65 67 69 73 74 65 72 20 22 74 61 72 67  n register "targ
14aa0 65 74 22 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  et"..** Return t
14ab0 68 65 20 72 65 67 69 73 74 65 72 20 77 68 65 72  he register wher
14ac0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
14ad0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ored..**.** With
14ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
14af0 68 65 72 65 20 69 73 20 6e 6f 20 67 75 61 72 61  here is no guara
14b00 6e 74 65 65 20 74 68 61 74 20 72 65 73 75 6c 74  ntee that result
14b10 73 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 73 74 6f  s will.** be sto
14b20 72 65 64 20 69 6e 20 74 61 72 67 65 74 2e 20 20  red in target.  
14b30 54 68 65 20 72 65 73 75 6c 74 20 6d 69 67 68 74  The result might
14b40 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 73 6f   be stored in so
14b50 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 72 65 67 69  me other.** regi
14b60 73 74 65 72 20 69 66 20 69 74 20 69 73 20 63 6f  ster if it is co
14b70 6e 76 65 6e 69 65 6e 74 20 74 6f 20 64 6f 20 73  nvenient to do s
14b80 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
14b90 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  function.** must
14ba0 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
14bb0 6e 20 63 6f 64 65 20 61 6e 64 20 6d 6f 76 65 20  n code and move 
14bc0 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
14bd0 68 65 20 64 65 73 69 72 65 64 0a 2a 2a 20 72 65  he desired.** re
14be0 67 69 73 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  gister..*/.int s
14bf0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
14c00 72 67 65 74 28 50 61 72 73 65 20 2a 70 50 61 72  rget(Parse *pPar
14c10 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
14c20 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a 20 20   int target){.  
14c30 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
14c40 2d 3e 70 56 64 62 65 3b 20 20 2f 2a 20 54 68 65  ->pVdbe;  /* The
14c50 20 56 4d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72   VM under constr
14c60 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
14c70 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
14c90 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ode being coded 
14ca0 2a 2f 0a 20 20 69 6e 74 20 69 6e 52 65 67 20 3d  */.  int inReg =
14cb0 20 74 61 72 67 65 74 3b 20 20 20 20 20 20 20 2f   target;       /
14cc0 2a 20 52 65 73 75 6c 74 73 20 73 74 6f 72 65 64  * Results stored
14cd0 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 6e 52   in register inR
14ce0 65 67 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46  eg */.  int regF
14cf0 72 65 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ree1 = 0;       
14d00 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
14d10 20 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f   free this tempo
14d20 72 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f  rary register */
14d30 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 32 20  .  int regFree2 
14d40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
14d50 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 66 72 65 65  If non-zero free
14d60 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
14d70 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
14d80 74 20 72 31 2c 20 72 32 2c 20 72 33 2c 20 72 34  t r1, r2, r3, r4
14d90 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  ;       /* Vario
14da0 75 73 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  us register numb
14db0 65 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ers */.  sqlite3
14dc0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14dd0 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
14de0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
14df0 0a 20 20 45 78 70 72 20 74 65 6d 70 58 3b 20 20  .  Expr tempX;  
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e10 54 65 6d 70 6f 72 61 72 79 20 65 78 70 72 65 73  Temporary expres
14e20 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20  sion node */..  
14e30 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30  assert( target>0
14e40 20 26 26 20 74 61 72 67 65 74 3c 3d 70 50 61 72   && target<=pPar
14e50 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20 20 69 66  se->nMem );.  if
14e60 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ( v==0 ){.    as
14e70 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
14e80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14ea0 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72    }..  if( pExpr
14eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20  ==0 ){.    op = 
14ec0 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  TK_NULL;.  }else
14ed0 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78 70 72  {.    op = pExpr
14ee0 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77 69 74  ->op;.  }.  swit
14ef0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
14f00 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
14f10 3a 20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66  : {.      AggInf
14f20 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20 70 45  o *pAggInfo = pE
14f30 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 20  xpr->pAggInfo;. 
14f40 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
14f50 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
14f60 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b  &pAggInfo->aCol[
14f70 70 45 78 70 72 2d 3e 69 41 67 67 5d 3b 0a 20 20  pExpr->iAgg];.  
14f80 20 20 20 20 69 66 28 20 21 70 41 67 67 49 6e 66      if( !pAggInf
14f90 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 29 7b  o->directMode ){
14fa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14fb0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e 30 20 29 3b   pCol->iMem>0 );
14fc0 0a 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d  .        inReg =
14fd0 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20   pCol->iMem;.   
14fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 41 67 67    }else if( pAgg
15000 49 6e 66 6f 2d 3e 75 73 65 53 6f 72 74 69 6e 67  Info->useSorting
15010 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Idx ){.        s
15020 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15030 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70  (v, OP_Column, p
15040 41 67 67 49 6e 66 6f 2d 3e 73 6f 72 74 69 6e 67  AggInfo->sorting
15050 49 64 78 50 54 61 62 2c 0a 20 20 20 20 20 20 20  IdxPTab,.       
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f         pCol->iSo
15080 72 74 65 72 43 6f 6c 75 6d 6e 2c 20 74 61 72 67  rterColumn, targ
15090 65 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  et);.        bre
150a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
150b0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
150c0 66 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74  fall thru into t
150d0 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e 20 63 61 73  he TK_COLUMN cas
150e0 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
150f0 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
15100 0a 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 20  .      int iTab 
15110 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  = pExpr->iTable;
15120 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 3c  .      if( iTab<
15130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
15140 20 70 50 61 72 73 65 2d 3e 63 6b 42 61 73 65 3e   pParse->ckBase>
15150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
15160 2a 20 47 65 6e 65 72 61 74 69 6e 67 20 43 48 45  * Generating CHE
15170 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  CK constraints o
15180 72 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f  r inserting into
15190 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 2a   partial index *
151a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 52 65  /.          inRe
151b0 67 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  g = pExpr->iColu
151c0 6d 6e 20 2b 20 70 50 61 72 73 65 2d 3e 63 6b 42  mn + pParse->ckB
151d0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ase;.          b
151e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
151f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
15200 2a 20 44 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20  * Deleting from 
15210 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  a partial index 
15220 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 54 61  */.          iTa
15230 62 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 61 72  b = pParse->iPar
15240 74 49 64 78 54 61 62 3b 0a 20 20 20 20 20 20 20  tIdxTab;.       
15250 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15260 20 69 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33   inReg = sqlite3
15270 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
15280 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  n(pParse, pExpr-
15290 3e 70 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  >pTab,.         
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
152c0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 74 61 72 67  lumn, iTab, targ
152d0 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 29 3b 0a     pExpr->op2);.
15300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15310 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
15320 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
15330 63 6f 64 65 49 6e 74 65 67 65 72 28 70 50 61 72  codeInteger(pPar
15340 73 65 2c 20 70 45 78 70 72 2c 20 30 2c 20 74 61  se, pExpr, 0, ta
15350 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
15360 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
15370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
15380 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
15390 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
153a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
153b0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
153c0 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
153d0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 63 6f  lue) );.      co
153e0 64 65 52 65 61 6c 28 76 2c 20 70 45 78 70 72 2d  deReal(v, pExpr-
153f0 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 2c 20 74 61  >u.zToken, 0, ta
15400 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
15410 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
15420 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
15430 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ING: {.      ass
15440 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
15450 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
15460 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
15470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15480 64 4f 70 34 28 76 2c 20 4f 50 5f 53 74 72 69 6e  dOp4(v, OP_Strin
15490 67 38 2c 20 30 2c 20 74 61 72 67 65 74 2c 20 30  g8, 0, target, 0
154a0 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
154b0 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  n, 0);.      bre
154c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
154d0 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
154e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
154f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
15500 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  , 0, target);.  
15510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15530 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
15540 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
15550 4f 42 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OB: {.      int 
15560 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
15570 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 68  har *z;.      ch
15580 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20 20 20 20 20  ar *zBlob;.     
15590 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
155a0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
155b0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
155c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
155d0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  Expr->u.zToken[0
155e0 5d 3d 3d 27 78 27 20 7c 7c 20 70 45 78 70 72 2d  ]=='x' || pExpr-
155f0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 58  >u.zToken[0]=='X
15600 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ' );.      asser
15610 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
15620 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20  en[1]=='\'' );. 
15630 20 20 20 20 20 7a 20 3d 20 26 70 45 78 70 72 2d       z = &pExpr-
15640 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d 3b 0a 20 20  >u.zToken[2];.  
15650 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
15660 74 72 6c 65 6e 33 30 28 7a 29 20 2d 20 31 3b 0a  trlen30(z) - 1;.
15670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 5b        assert( z[
15680 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a 20 20 20 20  n]=='\'' );.    
15690 20 20 7a 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    zBlob = sqlite
156a0 33 48 65 78 54 6f 42 6c 6f 62 28 73 71 6c 69 74  3HexToBlob(sqlit
156b0 65 33 56 64 62 65 44 62 28 76 29 2c 20 7a 2c 20  e3VdbeDb(v), z, 
156c0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
156d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
156e0 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c 20 74 61 72  P_Blob, n/2, tar
156f0 67 65 74 2c 20 30 2c 20 7a 42 6c 6f 62 2c 20 50  get, 0, zBlob, P
15700 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
15710 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
15720 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
15730 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
15740 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
15750 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
15760 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
15770 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15780 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ( pExpr->u.zToke
15790 6e 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  n!=0 );.      as
157a0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
157b0 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20 29 3b 0a 20  Token[0]!=0 );. 
157c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
157d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 56 61 72  AddOp2(v, OP_Var
157e0 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43  iable, pExpr->iC
157f0 6f 6c 75 6d 6e 2c 20 74 61 72 67 65 74 29 3b 0a  olumn, target);.
15800 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
15810 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d 21 3d 30 20  >u.zToken[1]!=0 
15820 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
15830 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
15840 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a 20 20 20 20  en[0]=='?' .    
15850 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63           || strc
15860 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  mp(pExpr->u.zTok
15870 65 6e 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  en, pParse->azVa
15880 72 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  r[pExpr->iColumn
15890 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  -1])==0 );.     
158a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
158b0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 70 50  angeP4(v, -1, pP
158c0 61 72 73 65 2d 3e 61 7a 56 61 72 5b 70 45 78 70  arse->azVar[pExp
158d0 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31 5d 2c 20 50  r->iColumn-1], P
158e0 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  4_STATIC);.     
158f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
15900 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
15910 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
15920 20 20 20 20 69 6e 52 65 67 20 3d 20 70 45 78 70      inReg = pExp
15930 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  r->iTable;.     
15940 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15950 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a    case TK_AS: {.
15960 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
15970 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72  lite3ExprCodeTar
15980 67 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  get(pParse, pExp
15990 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74  r->pLeft, target
159a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
159b0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
159c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
159d0 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a     case TK_CAST:
159e0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72   {.      /* Expr
159f0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
15a00 6f 72 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66  orm:   CAST(pLef
15a10 74 20 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20  t AS token) */. 
15a20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
15a30 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
15a40 65 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  et(pParse, pExpr
15a50 2d 3e 70 4c 65 66 74 2c 20 74 61 72 67 65 74 29  ->pLeft, target)
15a60 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
15a70 67 21 3d 74 61 72 67 65 74 20 29 7b 0a 20 20 20  g!=target ){.   
15a80 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15a90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
15aa0 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67 65  py, inReg, targe
15ab0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  t);.        inRe
15ac0 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20  g = target;.    
15ad0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15ae0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15af0 50 5f 43 61 73 74 2c 20 74 61 72 67 65 74 2c 0a  P_Cast, target,.
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
15b20 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78 70  ffinityType(pExp
15b30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29 29  r->u.zToken, 0))
15b40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15b50 28 20 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61  ( usedAsColumnCa
15b60 63 68 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65  che(pParse, inRe
15b70 67 2c 20 69 6e 52 65 67 29 20 29 3b 0a 20 20 20  g, inReg) );.   
15b80 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
15b90 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
15ba0 65 28 70 50 61 72 73 65 2c 20 69 6e 52 65 67 2c  e(pParse, inReg,
15bb0 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
15bc0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
15bd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  * SQLITE_OMIT_CA
15be0 53 54 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  ST */.    case T
15bf0 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
15c00 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
15c10 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
15c20 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
15c30 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
15c40 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 72 31  K_EQ: {.      r1
15c50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15c60 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15c70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65  Expr->pLeft, &re
15c80 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 72  gFree1);.      r
15c90 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  2 = sqlite3ExprC
15ca0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
15cb0 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 26  pExpr->pRight, &
15cc0 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20 20  regFree2);.     
15cd0 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
15ce0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
15cf0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
15d00 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
15d10 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
15d20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54  inReg, SQLITE_ST
15d30 4f 52 45 50 32 29 3b 0a 20 20 20 20 20 20 61 73  OREP2);.      as
15d40 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c  sert(TK_LT==OP_L
15d50 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
15d60 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Lt); VdbeCov
15d70 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
15d80 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Lt);.      asse
15d90 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29  rt(TK_LE==OP_Le)
15da0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
15db0 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Le); VdbeCover
15dc0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
15dd0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
15de0 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20  (TK_GT==OP_Gt); 
15df0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
15e00 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Gt); VdbeCoverag
15e10 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29  eIf(v,op==OP_Gt)
15e20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
15e30 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65  K_GE==OP_Ge); te
15e40 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65  stcase(op==OP_Ge
15e50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
15e60 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a  f(v,op==OP_Ge);.
15e70 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
15e80 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74  EQ==OP_Eq); test
15e90 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b  case(op==OP_Eq);
15ea0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
15eb0 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20  v,op==OP_Eq);.  
15ec0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45      assert(TK_NE
15ed0 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61  ==OP_Ne); testca
15ee0 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56  se(op==OP_Ne); V
15ef0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
15f00 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20  op==OP_Ne);.    
15f10 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
15f20 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
15f30 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
15f40 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
15f50 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
15f60 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
15f70 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
15f80 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
15f90 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ( op==TK_IS );. 
15fa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
15fb0 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
15fc0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
15fd0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
15fe0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
15ff0 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a  ft, &regFree1);.
16000 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
16010 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16020 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
16030 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
16040 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70  ;.      op = (op
16050 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51  ==TK_IS) ? TK_EQ
16060 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20   : TK_NE;.      
16070 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
16080 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
16090 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
160a0 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20   op,.           
160b0 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20 69         r1, r2, i
160c0 6e 52 65 67 2c 20 53 51 4c 49 54 45 5f 53 54 4f  nReg, SQLITE_STO
160d0 52 45 50 32 20 7c 20 53 51 4c 49 54 45 5f 4e 55  REP2 | SQLITE_NU
160e0 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  LLEQ);.      Vdb
160f0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
16100 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20  p==TK_EQ);.     
16110 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16120 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20  v, op==TK_NE);. 
16130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
16140 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
16150 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
16160 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
16170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16180 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
16190 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
161a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
161b0 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
161c0 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
161d0 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
161e0 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73   TK_REM:.    cas
161f0 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20  e TK_BITAND:.   
16200 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a   case TK_BITOR:.
16210 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
16220 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  H:.    case TK_L
16230 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
16240 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20  TK_RSHIFT: .    
16250 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
16260 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16270 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29  TK_AND==OP_And )
16280 3b 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ;            tes
16290 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 41 4e  tcase( op==TK_AN
162a0 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
162b0 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
162c0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
162d0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b  testcase( op==TK
162e0 5f 4f 52 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OR );.      ass
162f0 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
16300 5f 41 64 64 20 29 3b 20 20 20 20 20 20 20 20 20  _Add );         
16310 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16320 54 4b 5f 50 4c 55 53 20 29 3b 0a 20 20 20 20 20  TK_PLUS );.     
16330 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55   assert( TK_MINU
16340 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29  S==OP_Subtract )
16350 3b 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;     testcase( 
16360 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 3b 0a  op==TK_MINUS );.
16370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16380 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
16390 65 72 20 29 3b 20 20 20 20 20 20 74 65 73 74 63  er );      testc
163a0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 52 45 4d 20  ase( op==TK_REM 
163b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
163c0 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42   TK_BITAND==OP_B
163d0 69 74 41 6e 64 20 29 3b 20 20 20 20 20 20 74 65  itAnd );      te
163e0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42  stcase( op==TK_B
163f0 49 54 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  ITAND );.      a
16400 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d  ssert( TK_BITOR=
16410 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 20 20 20 20  =OP_BitOr );    
16420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16430 3d 3d 54 4b 5f 42 49 54 4f 52 20 29 3b 0a 20 20  ==TK_BITOR );.  
16440 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53      assert( TK_S
16450 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20  LASH==OP_Divide 
16460 29 3b 20 20 20 20 20 20 20 74 65 73 74 63 61 73  );       testcas
16470 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c 41 53 48 20  e( op==TK_SLASH 
16480 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16490 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_LSHIFT==OP_S
164a0 68 69 66 74 4c 65 66 74 20 29 3b 20 20 20 74 65  hiftLeft );   te
164b0 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4c  stcase( op==TK_L
164c0 53 48 49 46 54 20 29 3b 0a 20 20 20 20 20 20 61  SHIFT );.      a
164d0 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
164e0 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
164f0 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 6f 70  );  testcase( op
16500 3d 3d 54 4b 5f 52 53 48 49 46 54 20 29 3b 0a 20  ==TK_RSHIFT );. 
16510 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16520 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
16530 74 20 29 3b 20 20 20 20 20 20 74 65 73 74 63 61  t );      testca
16540 73 65 28 20 6f 70 3d 3d 54 4b 5f 43 4f 4e 43 41  se( op==TK_CONCA
16550 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
16560 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
16570 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
16580 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
16590 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
165a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
165b0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
165c0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
165d0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 73 71  Free2);.      sq
165e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
165f0 76 2c 20 6f 70 2c 20 72 32 2c 20 72 31 2c 20 74  v, op, r2, r1, t
16600 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 74 65  arget);.      te
16610 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16620 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
16630 74 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d  tcase( regFree2=
16640 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
16650 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16660 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
16670 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
16680 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
16690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
166a0 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
166b0 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
166c0 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
166d0 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 70     codeInteger(p
166e0 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 31 2c  Parse, pLeft, 1,
166f0 20 74 61 72 67 65 74 29 3b 0a 23 69 66 6e 64 65   target);.#ifnde
16700 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
16710 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
16720 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
16730 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
16740 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16750 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
16760 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
16770 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
16780 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20      codeReal(v, 
16790 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pLeft->u.zToken,
167a0 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 65 6e   1, target);.#en
167b0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
167c0 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 6f  .        tempX.o
167d0 70 20 3d 20 54 4b 5f 49 4e 54 45 47 45 52 3b 0a  p = TK_INTEGER;.
167e0 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 66 6c          tempX.fl
167f0 61 67 73 20 3d 20 45 50 5f 49 6e 74 56 61 6c 75  ags = EP_IntValu
16800 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 3b 0a  e|EP_TokenOnly;.
16810 20 20 20 20 20 20 20 20 74 65 6d 70 58 2e 75 2e          tempX.u.
16820 69 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  iValue = 0;.    
16830 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
16840 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
16850 72 73 65 2c 20 26 74 65 6d 70 58 2c 20 26 72 65  rse, &tempX, &re
16860 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20  gFree1);.       
16870 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
16880 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
16890 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
168a0 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
168b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
168c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
168d0 72 61 63 74 2c 20 72 32 2c 20 72 31 2c 20 74 61  ract, r2, r1, ta
168e0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 74  rget);.        t
168f0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
16900 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  2==0 );.      }.
16910 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 74 61        inReg = ta
16920 72 67 65 74 3b 0a 20 20 20 20 20 20 62 72 65 61  rget;.      brea
16930 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
16940 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
16950 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
16960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
16970 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
16980 6f 74 20 29 3b 20 20 20 74 65 73 74 63 61 73 65  ot );   testcase
16990 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4e 4f 54 20  ( op==TK_BITNOT 
169a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
169b0 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
169c0 29 3b 20 20 20 20 20 20 20 20 20 74 65 73 74 63  );         testc
169d0 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 20  ase( op==TK_NOT 
169e0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
169f0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16a00 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
16a10 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
16a20 31 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1);.      testca
16a30 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
16a40 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
16a50 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20 73   target;.      s
16a60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16a70 28 76 2c 20 6f 70 2c 20 72 31 2c 20 69 6e 52 65  (v, op, r1, inRe
16a80 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
16a90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16aa0 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63  TK_ISNULL:.    c
16ab0 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20  ase TK_NOTNULL: 
16ac0 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
16ad0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16ae0 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73  TK_ISNULL==OP_Is
16af0 4e 75 6c 6c 20 29 3b 20 20 20 74 65 73 74 63 61  Null );   testca
16b00 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  se( op==TK_ISNUL
16b10 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
16b20 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
16b30 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 20 74 65 73  P_NotNull ); tes
16b40 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f  tcase( op==TK_NO
16b50 54 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73  TNULL );.      s
16b60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16b70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
16b80 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
16b90 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
16ba0 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
16bb0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
16bc0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
16bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16be0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
16bf0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
16c00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 6f 70  VdbeAddOp1(v, op
16c10 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
16c20 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
16c30 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 20  p==TK_ISNULL);. 
16c40 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
16c50 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 4f  eIf(v, op==TK_NO
16c60 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71  TNULL);.      sq
16c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16c80 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
16c90 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16ca0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
16cb0 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
16cc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16cd0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
16ce0 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
16cf0 20 20 20 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e      AggInfo *pIn
16d00 66 6f 20 3d 20 70 45 78 70 72 2d 3e 70 41 67 67  fo = pExpr->pAgg
16d10 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
16d20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  pInfo==0 ){.    
16d30 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
16d40 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16d50 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
16d60 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
16d70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16d80 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61  se, "misuse of a
16d90 67 67 72 65 67 61 74 65 3a 20 25 73 28 29 22 2c  ggregate: %s()",
16da0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
16db0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16dc0 20 20 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20          inReg = 
16dd0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 70 45 78  pInfo->aFunc[pEx
16de0 70 72 2d 3e 69 41 67 67 5d 2e 69 4d 65 6d 3b 0a  pr->iAgg].iMem;.
16df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
16e00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16e10 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
16e20 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
16e30 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20  t *pFarg;       
16e40 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74  /* List of funct
16e50 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
16e60 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 61 72 67  .      int nFarg
16e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16e80 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6e 63 74   Number of funct
16e90 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
16ea0 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
16eb0 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  pDef;         /*
16ec0 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65   The function de
16ed0 66 69 6e 69 74 69 6f 6e 20 6f 62 6a 65 63 74 20  finition object 
16ee0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  */.      int nId
16ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f00 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
16f10 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69   function name i
16f20 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
16f30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
16f40 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;       /* The f
16f50 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
16f60 20 20 20 20 20 20 75 33 32 20 63 6f 6e 73 74 4d        u32 constM
16f70 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ask = 0;     /* 
16f80 4d 61 73 6b 20 6f 66 20 66 75 6e 63 74 69 6f 6e  Mask of function
16f90 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61 74 20   arguments that 
16fa0 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 2a 2f 0a  are constant */.
16fb0 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fd0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
16fe0 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
16ff0 4e 43 28 64 62 29 3b 20 20 20 20 20 20 2f 2a 20  NC(db);      /* 
17000 54 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  The text encodin
17010 67 20 75 73 65 64 20 62 79 20 74 68 69 73 20 64  g used by this d
17020 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
17030 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
17040 3d 20 30 3b 20 20 20 20 2f 2a 20 41 20 63 6f 6c  = 0;    /* A col
17050 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
17060 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
17070 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
17080 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
17090 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
170a0 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
170b0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
170c0 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  okenOnly) ){.   
170d0 20 20 20 20 20 70 46 61 72 67 20 3d 20 30 3b 0a       pFarg = 0;.
170e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
170f0 20 20 20 20 20 70 46 61 72 67 20 3d 20 70 45 78       pFarg = pEx
17100 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
17110 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 61 72 67     }.      nFarg
17120 20 3d 20 70 46 61 72 67 20 3f 20 70 46 61 72 67   = pFarg ? pFarg
17130 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
17140 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
17150 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
17160 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
17170 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70  );.      zId = p
17180 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
17190 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69        nId = sqli
171a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29  te3Strlen30(zId)
171b0 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
171c0 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
171d0 6f 6e 28 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  on(db, zId, nId,
171e0 20 6e 46 61 72 67 2c 20 65 6e 63 2c 20 30 29 3b   nFarg, enc, 0);
171f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
17200 3d 30 20 7c 7c 20 70 44 65 66 2d 3e 78 46 75 6e  =0 || pDef->xFun
17210 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
17220 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17230 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
17240 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 28   function: %.*s(
17250 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20  )", nId, zId);. 
17260 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17270 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17280 41 74 74 65 6d 70 74 20 61 20 64 69 72 65 63 74  Attempt a direct
17290 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
172a0 6f 66 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  of the built-in 
172b0 43 4f 41 4c 45 53 43 45 28 29 20 61 6e 64 0a 20  COALESCE() and. 
172c0 20 20 20 20 20 2a 2a 20 49 46 4e 55 4c 4c 28 29       ** IFNULL()
172d0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69   functions.  Thi
172e0 73 20 61 76 6f 69 64 73 20 75 6e 6e 65 63 65 73  s avoids unneces
172f0 73 61 72 79 20 65 76 61 6c 75 61 74 69 6f 6e 20  sary evaluation 
17300 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  of.      ** argu
17310 6d 65 6e 74 73 20 70 61 73 74 20 74 68 65 20 66  ments past the f
17320 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  irst non-NULL ar
17330 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  gument..      */
17340 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d  .      if( pDef-
17350 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
17360 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c 45 53 43  ITE_FUNC_COALESC
17370 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
17380 20 65 6e 64 43 6f 61 6c 65 73 63 65 20 3d 20 73   endCoalesce = s
17390 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
173a0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
173b0 61 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 32  assert( nFarg>=2
173c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
173d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
173e0 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  se, pFarg->a[0].
173f0 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a  pExpr, target);.
17400 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
17410 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29 7b 0a   i<nFarg; i++){.
17420 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17430 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17440 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61 72 67 65  P_NotNull, targe
17450 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63 65 29 3b  t, endCoalesce);
17460 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
17470 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
17480 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17490 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
174a0 72 73 65 2c 20 74 61 72 67 65 74 2c 20 31 29 3b  rse, target, 1);
174b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
174c0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
174d0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
174e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
174f0 64 65 28 70 50 61 72 73 65 2c 20 70 46 61 72 67  de(pParse, pFarg
17500 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 74 61  ->a[i].pExpr, ta
17510 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
17520 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17530 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
17540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17550 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17560 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 43 6f  veLabel(v, endCo
17570 61 6c 65 73 63 65 29 3b 0a 20 20 20 20 20 20 20  alesce);.       
17580 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17590 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 4e  .      /* The UN
175a0 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63 74 69 6f  LIKELY() functio
175b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 54  n is a no-op.  T
175c0 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
175d0 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
175e0 6f 66 20 74 68 65 20 66 69 72 73 74 20 61 72 67  of the first arg
175f0 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ument..      */.
17600 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
17610 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
17620 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59  TE_FUNC_UNLIKELY
17630 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17640 72 74 28 20 6e 46 61 72 67 3e 3d 31 20 29 3b 0a  rt( nFarg>=1 );.
17650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17660 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
17670 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70  pFarg->a[0].pExp
17680 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  r, target);.    
17690 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
176a0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
176b0 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b 29  0; i<nFarg; i++)
176c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  {.        if( i<
176d0 33 32 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  32 && sqlite3Exp
176e0 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 46 61 72  rIsConstant(pFar
176f0 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  g->a[i].pExpr) )
17700 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
17710 63 61 73 65 28 20 69 3d 3d 33 31 20 29 3b 0a 20  case( i==31 );. 
17720 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 4d 61           constMa
17730 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 33 32 28  sk |= MASKBIT32(
17740 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
17750 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d        if( (pDef-
17760 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
17770 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
17780 4c 29 21 3d 30 20 26 26 20 21 70 43 6f 6c 6c 20  L)!=0 && !pColl 
17790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
177a0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
177b0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
177c0 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70  pFarg->a[i].pExp
177d0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
177e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
177f0 70 46 61 72 67 20 29 7b 0a 20 20 20 20 20 20 20  pFarg ){.       
17800 20 69 66 28 20 63 6f 6e 73 74 4d 61 73 6b 20 29   if( constMask )
17810 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d  {.          r1 =
17820 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
17830 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
17840 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46 61 72 67  e->nMem += nFarg
17850 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17860 0a 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20  .          r1 = 
17870 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
17880 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 46 61 72  nge(pParse, nFar
17890 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  g);.        }.. 
178a0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 65         /* For le
178b0 6e 67 74 68 28 29 20 61 6e 64 20 74 79 70 65 6f  ngth() and typeo
178c0 66 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 77 69  f() functions wi
178d0 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 72 67 75  th a column argu
178e0 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ment,.        **
178f0 20 73 65 74 20 74 68 65 20 50 35 20 70 61 72 61   set the P5 para
17900 6d 65 74 65 72 20 74 6f 20 74 68 65 20 4f 50 5f  meter to the OP_
17910 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65 20 74 6f  Column opcode to
17920 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52   OPFLAG_LENGTHAR
17930 47 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  G.        ** or 
17940 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
17950 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 74   respectively, t
17960 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
17970 61 72 79 20 64 61 74 61 0a 20 20 20 20 20 20 20  ary data.       
17980 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a 20 20 20   ** loading..   
17990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
179a0 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
179b0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
179c0 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51 4c 49 54  UNC_LENGTH|SQLIT
179d0 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 29 29 21  E_FUNC_TYPEOF))!
179e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
179f0 75 38 20 65 78 70 72 4f 70 3b 0a 20 20 20 20 20  u8 exprOp;.     
17a00 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 46 61       assert( nFa
17a10 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  rg==1 );.       
17a20 20 20 20 61 73 73 65 72 74 28 20 70 46 61 72 67     assert( pFarg
17a30 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21 3d 30 20  ->a[0].pExpr!=0 
17a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  );.          exp
17a50 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e 61 5b 30  rOp = pFarg->a[0
17a60 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20  ].pExpr->op;.   
17a70 20 20 20 20 20 20 20 69 66 28 20 65 78 70 72 4f         if( exprO
17a80 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p==TK_COLUMN || 
17a90 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47 47 5f 43  exprOp==TK_AGG_C
17aa0 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
17ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
17ac0 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 3d  ITE_FUNC_LENGTH=
17ad0 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54 48 41 52  =OPFLAG_LENGTHAR
17ae0 47 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  G );.           
17af0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17b00 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d 4f 50 46  FUNC_TYPEOF==OPF
17b10 4c 41 47 5f 54 59 50 45 4f 46 41 52 47 20 29 3b  LAG_TYPEOFARG );
17b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
17b30 74 63 61 73 65 28 20 70 44 65 66 2d 3e 66 75 6e  tcase( pDef->fun
17b40 63 46 6c 61 67 73 20 26 20 4f 50 46 4c 41 47 5f  cFlags & OPFLAG_
17b50 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a 20 20 20  LENGTHARG );.   
17b60 20 20 20 20 20 20 20 20 20 70 46 61 72 67 2d 3e           pFarg->
17b70 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 32 20  a[0].pExpr->op2 
17b80 3d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
17b90 20 20 20 20 20 70 44 65 66 2d 3e 66 75 6e 63 46       pDef->funcF
17ba0 6c 61 67 73 20 26 20 28 4f 50 46 4c 41 47 5f 4c  lags & (OPFLAG_L
17bb0 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c 41 47 5f  ENGTHARG|OPFLAG_
17bc0 54 59 50 45 4f 46 41 52 47 29 3b 0a 20 20 20 20  TYPEOFARG);.    
17bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17be0 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  }..        sqlit
17bf0 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
17c00 70 50 61 72 73 65 29 3b 20 20 20 20 20 2f 2a 20  pParse);     /* 
17c10 54 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33  Ticket 2ea2425d3
17c20 34 62 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  4be */.        s
17c30 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
17c40 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
17c50 46 61 72 67 2c 20 72 31 2c 0a 20 20 20 20 20 20  Farg, r1,.      
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17c80 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c 49 54 45  _ECEL_DUP|SQLITE
17c90 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29 3b 0a 20  _ECEL_FACTOR);. 
17ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
17cb0 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
17cc0 65 29 3b 20 20 20 20 20 20 2f 2a 20 54 69 63 6b  e);      /* Tick
17cd0 65 74 20 32 65 61 32 34 32 35 64 33 34 62 65 20  et 2ea2425d34be 
17ce0 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  */.      }else{.
17cf0 20 20 20 20 20 20 20 20 72 31 20 3d 20 30 3b 0a          r1 = 0;.
17d00 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
17d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
17d20 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 2f  UALTABLE.      /
17d30 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76 65 72 6c  * Possibly overl
17d40 6f 61 64 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  oad the function
17d50 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
17d60 67 75 6d 65 6e 74 20 69 73 0a 20 20 20 20 20 20  gument is.      
17d70 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ** a virtual tab
17d80 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  le column..     
17d90 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
17da0 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f 6e 73   infix functions
17db0 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c 20 52 45   (LIKE, GLOB, RE
17dc0 47 45 58 50 2c 20 61 6e 64 20 4d 41 54 43 48 29  GEXP, and MATCH)
17dd0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 2a   use the.      *
17de0 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
17df0 74 2c 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  t, not the first
17e00 2c 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e  , as the argumen
17e10 74 20 74 6f 20 74 65 73 74 20 74 6f 0a 20 20 20  t to test to.   
17e20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
17e30 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  is a column in a
17e40 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
17e50 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
17e60 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74  cause.      ** t
17e70 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20  he left operand 
17e80 6f 66 20 69 6e 66 69 78 20 66 75 6e 63 74 69 6f  of infix functio
17e90 6e 73 20 28 74 68 65 20 6f 70 65 72 61 6e 64 20  ns (the operand 
17ea0 77 65 20 77 61 6e 74 20 74 6f 0a 20 20 20 20 20  we want to.     
17eb0 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f 76 65 72   ** control over
17ec0 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73 20 75 70  loading) ends up
17ed0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
17ee0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  rgument to the. 
17ef0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
17f00 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
17f10 6e 20 22 41 20 67 6c 6f 62 20 42 22 20 69 73 20  n "A glob B" is 
17f20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a 20  equivalent to . 
17f30 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62 28 42 2c       ** "glob(B,
17f40 41 29 2e 20 20 57 65 20 77 61 6e 74 20 74 6f 20  A).  We want to 
17f50 75 73 65 20 74 68 65 20 41 20 69 6e 20 22 41 20  use the A in "A 
17f60 67 6c 6f 62 20 42 22 20 74 6f 20 74 65 73 74 0a  glob B" to test.
17f70 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 66 75 6e        ** for fun
17f80 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61 64 69 6e  ction overloadin
17f90 67 2e 20 20 42 75 74 20 77 65 20 75 73 65 20 74  g.  But we use t
17fa0 68 65 20 42 20 74 65 72 6d 20 69 6e 20 22 67 6c  he B term in "gl
17fb0 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20 20 20 20  ob(B,A)"..      
17fc0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 46 61  */.      if( nFa
17fd0 72 67 3e 3d 32 20 26 26 20 28 70 45 78 70 72 2d  rg>=2 && (pExpr-
17fe0 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 66 69  >flags & EP_Infi
17ff0 78 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  xFunc) ){.      
18000 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
18010 56 74 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63  VtabOverloadFunc
18020 74 69 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e  tion(db, pDef, n
18030 46 61 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 31  Farg, pFarg->a[1
18040 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
18050 7d 65 6c 73 65 20 69 66 28 20 6e 46 61 72 67 3e  }else if( nFarg>
18060 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
18070 66 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 4f  f = sqlite3VtabO
18080 76 65 72 6c 6f 61 64 46 75 6e 63 74 69 6f 6e 28  verloadFunction(
18090 64 62 2c 20 70 44 65 66 2c 20 6e 46 61 72 67 2c  db, pDef, nFarg,
180a0 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78   pFarg->a[0].pEx
180b0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  pr);.      }.#en
180c0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 44  dif.      if( pD
180d0 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
180e0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
180f0 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
18100 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
18110 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
18120 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c  ll; .        sql
18130 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
18140 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
18150 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
18160 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
18170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18180 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18190 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f  p4(v, OP_Functio
181a0 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c 20 72 31  n, constMask, r1
181b0 2c 20 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20  , target,.      
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50    (char*)pDef, P
181e0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
181f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18200 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 46 61  ngeP5(v, (u8)nFa
18210 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rg);.      if( n
18220 46 61 72 67 20 26 26 20 63 6f 6e 73 74 4d 61 73  Farg && constMas
18230 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
18240 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
18250 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
18260 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20 20 20 20  r1, nFarg);.    
18270 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
18280 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
18290 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
182a0 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
182b0 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
182c0 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
182d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
182e0 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 20  ==TK_EXISTS );. 
182f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f       testcase( o
18300 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 3b 0a  p==TK_SELECT );.
18310 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71        inReg = sq
18320 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
18330 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
18340 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
18350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18360 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
18370 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 46 61      int destIfFa
18380 6c 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  lse = sqlite3Vdb
18390 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
183a0 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e       int destIfN
183b0 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
183c0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
183d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
183e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
183f0 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
18400 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
18410 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
18420 45 78 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73  Expr, destIfFals
18430 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  e, destIfNull);.
18440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18450 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
18460 74 65 67 65 72 2c 20 31 2c 20 74 61 72 67 65 74  teger, 1, target
18470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18480 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18490 28 76 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29  (v, destIfFalse)
184a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
184b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
184c0 41 64 64 49 6d 6d 2c 20 74 61 72 67 65 74 2c 20  AddImm, target, 
184d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
184e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
184f0 6c 28 76 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29  l(v, destIfNull)
18500 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18510 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
18520 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18530 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20 2f 2a 0a  ERY */...    /*.
18540 20 20 20 20 2a 2a 20 20 20 20 78 20 42 45 54 57      **    x BETW
18550 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20 20 20 20  EEN y AND z.    
18560 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  **.    ** This i
18570 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
18580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
18590 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 20   x>=y AND x<=z. 
185a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 58 20 69     **.    ** X i
185b0 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
185c0 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a  r->pLeft..    **
185d0 20 59 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Y is stored in 
185e0 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
185f0 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2a  0].pExpr..    **
18600 20 5a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   Z is stored in 
18610 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
18620 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20 20 2a 2f  1].pExpr..    */
18630 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
18640 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
18650 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
18660 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
18670 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
18680 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
18690 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
186a0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
186b0 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70  ight = pLItem->p
186c0 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 72 31 20  Expr;..      r1 
186d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
186e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 4c  eTemp(pParse, pL
186f0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
18700 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
18710 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
18720 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
18730 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
18740 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
18750 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
18760 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
18770 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
18780 72 33 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r3 = sqlite3GetT
18790 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
187a0 20 20 20 20 20 20 72 34 20 3d 20 73 71 6c 69 74        r4 = sqlit
187b0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
187c0 72 73 65 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  rse);.      code
187d0 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
187e0 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
187f0 50 5f 47 65 2c 0a 20 20 20 20 20 20 20 20 20 20  P_Ge,.          
18800 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
18810 72 33 2c 20 53 51 4c 49 54 45 5f 53 54 4f 52 45  r3, SQLITE_STORE
18820 50 32 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  P2);  VdbeCovera
18830 67 65 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 49  ge(v);.      pLI
18840 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
18850 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
18860 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
18870 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
18880 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
18890 32 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  2);.      r2 = s
188a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
188b0 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
188c0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
188d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
188e0 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
188f0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
18900 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
18910 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 72 31  Right, OP_Le, r1
18920 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c 49 54 45  , r2, r4, SQLITE
18930 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20 20  _STOREP2);.     
18940 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18950 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18960 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18970 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20 74 61 72  And, r3, r4, tar
18980 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
18990 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
189a0 67 28 70 50 61 72 73 65 2c 20 72 33 29 3b 0a 20  g(pParse, r3);. 
189b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
189c0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
189d0 65 2c 20 72 34 29 3b 0a 20 20 20 20 20 20 62 72  e, r4);.      br
189e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
189f0 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20  ase TK_COLLATE: 
18a00 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
18a10 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65  US: {.      inRe
18a20 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  g = sqlite3ExprC
18a30 6f 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65  odeTarget(pParse
18a40 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
18a50 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62  target);.      b
18a60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
18a70 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
18a80 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
18a90 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
18aa0 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
18ab0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
18ac0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
18ad0 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
18ae0 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
18af0 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
18b00 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
18b10 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
18b20 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
18b30 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
18b40 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
18b50 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
18b60 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
18b70 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
18b80 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
18b90 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
18ba0 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
18bb0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
18bc0 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
18bd0 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
18be0 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
18bf0 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
18c00 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
18c10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
18c20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
18c30 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
18c40 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d 20 6f 70  g an OP_Param op
18c50 63 6f 64 65 2e 20 54 68 65 20 70 31 0a 20 20 20  code. The p1.   
18c60 20 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 20     ** parameter 
18c70 69 73 20 73 65 74 20 74 6f 20 30 20 66 6f 72 20  is set to 0 for 
18c80 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20 72 65 66  an old.rowid ref
18c90 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f 20 28 69  erence, or to (i
18ca0 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  +1).      ** to 
18cb0 72 65 66 65 72 65 6e 63 65 20 61 6e 6f 74 68 65  reference anothe
18cc0 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  r column of the 
18cd0 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74 61 62  old.* pseudo-tab
18ce0 6c 65 2c 20 77 68 65 72 65 20 0a 20 20 20 20 20  le, where .     
18cf0 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
18d00 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
18d10 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72 6f 77 69  . For a new.rowi
18d20 64 20 72 65 66 65 72 65 6e 63 65 2c 20 70 31 20  d reference, p1 
18d30 69 73 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  is.      ** set 
18d40 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65 72 65 20  to (n+1), where 
18d50 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
18d60 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 65 61  of columns in ea
18d70 63 68 20 70 73 65 75 64 6f 2d 74 61 62 6c 65 2e  ch pseudo-table.
18d80 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 20  .      ** For a 
18d90 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79  reference to any
18da0 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 20 69 6e   other column in
18db0 20 74 68 65 20 6e 65 77 2e 2a 20 70 73 65 75 64   the new.* pseud
18dc0 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20 20 20 20  o-table, p1.    
18dd0 20 20 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 28    ** is set to (
18de0 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65 20 6e 20  n+2+i), where n 
18df0 61 6e 64 20 69 20 61 72 65 20 61 73 20 64 65 66  and i are as def
18e00 69 6e 65 64 20 70 72 65 76 69 6f 75 73 6c 79 2e  ined previously.
18e10 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a 20 65 78   For.      ** ex
18e20 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 74 61  ample, if the ta
18e30 62 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 72 69  ble on which tri
18e40 67 67 65 72 73 20 61 72 65 20 62 65 69 6e 67 20  ggers are being 
18e50 66 69 72 65 64 20 69 73 0a 20 20 20 20 20 20 2a  fired is.      *
18e60 2a 20 64 65 63 6c 61 72 65 64 20 61 73 3a 0a 20  * declared as:. 
18e70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18e80 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
18e90 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
18ea0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  **.      ** Then
18eb0 20 70 31 20 69 73 20 69 6e 74 65 72 70 72 65 74   p1 is interpret
18ec0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  ed as follows:. 
18ed0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18ee0 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e 20 20 20     p1==0   ->   
18ef0 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20 20 20 70   old.rowid     p
18f00 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20 6e 65 77  1==3   ->    new
18f10 2e 72 6f 77 69 64 0a 20 20 20 20 20 20 2a 2a 20  .rowid.      ** 
18f20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20 20 20 20    p1==1   ->    
18f30 6f 6c 64 2e 61 20 20 20 20 20 20 20 20 20 70 31  old.a         p1
18f40 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e  ==4   ->    new.
18f50 61 0a 20 20 20 20 20 20 2a 2a 20 20 20 70 31 3d  a.      **   p1=
18f60 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c 64 2e 62  =2   ->    old.b
18f70 20 20 20 20 20 20 20 20 20 70 31 3d 3d 35 20 20           p1==5  
18f80 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20 20 20 20   ->    new.b    
18f90 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20     .      */.   
18fa0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
18fb0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
18fc0 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 45 78      int p1 = pEx
18fd0 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20 28 70 54  pr->iTable * (pT
18fe0 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b 20 31 20  ab->nCol+1) + 1 
18ff0 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  + pExpr->iColumn
19000 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
19010 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
19020 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  0 || pExpr->iTab
19030 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 61  le==1 );.      a
19040 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43  ssert( pExpr->iC
19050 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20 70 45 78  olumn>=-1 && pEx
19060 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 54 61 62  pr->iColumn<pTab
19070 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
19080 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 69 50  assert( pTab->iP
19090 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70 72 2d 3e  Key<0 || pExpr->
190a0 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62 2d 3e 69  iColumn!=pTab->i
190b0 50 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 61 73  PKey );.      as
190c0 73 65 72 74 28 20 70 31 3e 3d 30 20 26 26 20 70  sert( p1>=0 && p
190d0 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c 2a 32 2b  1<(pTab->nCol*2+
190e0 32 29 20 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  2) );..      sql
190f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19100 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70 31 2c 20  , OP_Param, p1, 
19110 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 56  target);.      V
19120 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
19130 25 73 2e 25 73 20 2d 3e 20 24 25 64 22 2c 0a 20  %s.%s -> $%d",. 
19140 20 20 20 20 20 20 20 28 70 45 78 70 72 2d 3e 69         (pExpr->i
19150 54 61 62 6c 65 20 3f 20 22 6e 65 77 22 20 3a 20  Table ? "new" : 
19160 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20  "old"),.        
19170 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c  (pExpr->iColumn<
19180 30 20 3f 20 22 72 6f 77 69 64 22 20 3a 20 70 45  0 ? "rowid" : pE
19190 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  xpr->pTab->aCol[
191a0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pExpr->iColumn].
191b0 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20  zName),.        
191c0 74 61 72 67 65 74 0a 20 20 20 20 20 20 29 29 3b  target.      ));
191d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
191e0 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
191f0 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a 20 49 66  OINT.      /* If
19200 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
19210 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
19220 74 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  t may currently 
19230 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 6e 0a  be stored as an.
19240 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72        ** integer
19250 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c 41 66 66  . Use OP_RealAff
19260 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 73 75  inity to make su
19270 72 65 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  re it is really 
19280 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  real.  */.      
19290 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
192a0 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26 26  mn>=0 .       &&
192b0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70   pTab->aCol[pExp
192c0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69  r->iColumn].affi
192d0 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
192e0 5f 52 45 41 4c 0a 20 20 20 20 20 20 29 7b 0a 20  _REAL.      ){. 
192f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19300 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
19310 65 61 6c 41 66 66 69 6e 69 74 79 2c 20 74 61 72  ealAffinity, tar
19320 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  get);.      }.#e
19330 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
19340 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
19350 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20 41 3a 0a  .    ** Form A:.
19360 20 20 20 20 2a 2a 20 20 20 43 41 53 45 20 78 20      **   CASE x 
19370 57 48 45 4e 20 65 31 20 54 48 45 4e 20 72 31 20  WHEN e1 THEN r1 
19380 57 48 45 4e 20 65 32 20 54 48 45 4e 20 72 32 20  WHEN e2 THEN r2 
19390 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54 48 45 4e  ... WHEN eN THEN
193a0 20 72 4e 20 45 4c 53 45 20 79 20 45 4e 44 0a 20   rN ELSE y END. 
193b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
193c0 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41  m B:.    **   CA
193d0 53 45 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20  SE WHEN e1 THEN 
193e0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
193f0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
19400 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
19410 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
19420 46 6f 72 6d 20 41 20 69 73 20 63 61 6e 20 62 65  Form A is can be
19430 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   transformed int
19440 6f 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  o the equivalent
19450 20 66 6f 72 6d 20 42 20 61 73 20 66 6f 6c 6c 6f   form B as follo
19460 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53  ws:.    **   CAS
19470 45 20 57 48 45 4e 20 78 3d 65 31 20 54 48 45 4e  E WHEN x=e1 THEN
19480 20 72 31 20 57 48 45 4e 20 78 3d 65 32 20 54 48   r1 WHEN x=e2 TH
19490 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20 20 2a 2a  EN r2 ....    **
194a0 20 20 20 20 20 20 20 20 57 48 45 4e 20 78 3d 65          WHEN x=e
194b0 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
194c0 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
194d0 2a 2a 20 58 20 28 69 66 20 69 74 20 65 78 69 73  ** X (if it exis
194e0 74 73 29 20 69 73 20 69 6e 20 70 45 78 70 72 2d  ts) is in pExpr-
194f0 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59  >pLeft..    ** Y
19500 20 69 73 20 69 6e 20 74 68 65 20 6c 61 73 74 20   is in the last 
19510 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45 78 70 72  element of pExpr
19520 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20 70 45 78  ->x.pList if pEx
19530 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
19540 70 72 20 69 73 0a 20 20 20 20 2a 2a 20 6f 64 64  pr is.    ** odd
19550 2e 20 20 54 68 65 20 59 20 69 73 20 61 6c 73 6f  .  The Y is also
19560 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 66 20 74   optional.  If t
19570 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
19580 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c 69 73 74  ments in x.pList
19590 0a 20 20 20 20 2a 2a 20 69 73 20 65 76 65 6e 2c  .    ** is even,
195a0 20 74 68 65 6e 20 59 20 69 73 20 6f 6d 69 74 74   then Y is omitt
195b0 65 64 20 61 6e 64 20 74 68 65 20 22 6f 74 68 65  ed and the "othe
195c0 72 77 69 73 65 22 20 72 65 73 75 6c 74 20 69 73  rwise" result is
195d0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 45 69   NULL..    ** Ei
195e0 20 69 73 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c   is in pExpr->pL
195f0 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61 6e 64 20  ist->a[i*2] and 
19600 52 69 20 69 73 20 70 45 78 70 72 2d 3e 70 4c 69  Ri is pExpr->pLi
19610 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e 0a 20 20  st->a[i*2+1]..  
19620 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19630 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78  result of the ex
19640 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
19650 52 69 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  Ri for the first
19660 20 6d 61 74 63 68 69 6e 67 20 45 69 2c 0a 20 20   matching Ei,.  
19670 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 72 65    ** or if there
19680 20 69 73 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   is no matching 
19690 45 69 2c 20 74 68 65 20 45 4c 53 45 20 74 65 72  Ei, the ELSE ter
196a0 6d 20 59 2c 20 6f 72 20 69 66 20 74 68 65 72 65  m Y, or if there
196b0 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 45 4c   is.    ** no EL
196c0 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c 2e 0a 20  SE term, NULL.. 
196d0 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
196e0 74 3a 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  t: assert( op==T
196f0 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20 20 20 20  K_CASE ); {.    
19700 20 20 69 6e 74 20 65 6e 64 4c 61 62 65 6c 3b 20    int endLabel; 
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65      /* GOTO labe
19730 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20 43 41 53  l for end of CAS
19740 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20 20 20 20  E stmt */.      
19750 69 6e 74 20 6e 65 78 74 43 61 73 65 3b 20 20 20  int nextCase;   
19760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19770 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62 65 6c 20    /* GOTO label 
19780 66 6f 72 20 6e 65 78 74 20 57 48 45 4e 20 63 6c  for next WHEN cl
19790 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
197a0 74 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20  t nExpr;        
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20 6f 66 20  /* 2x number of 
197d0 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  WHEN terms */.  
197e0 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19810 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45  unter */.      E
19820 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57 48 45 4e   /* List of WHEN
19850 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 20 20   terms */.      
19860 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19870 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b  item *aListelem;
19880 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 57 48    /* Array of WH
19890 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  EN terms */.    
198a0 20 20 45 78 70 72 20 6f 70 43 6f 6d 70 61 72 65    Expr opCompare
198b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
198c0 20 20 20 20 2f 2a 20 54 68 65 20 58 3d 3d 45 69      /* The X==Ei
198d0 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
198e0 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20 20       Expr *pX;  
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19900 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 20         /* The X 
19910 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19920 20 20 20 20 45 78 70 72 20 2a 70 54 65 73 74 20      Expr *pTest 
19930 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
19940 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45 69 20 28        /* X==Ei (
19950 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75 73 74 20  form A) or just 
19960 45 69 20 28 66 6f 72 6d 20 42 29 20 2a 2f 0a 20  Ei (form B) */. 
19970 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69       VVA_ONLY( i
19980 6e 74 20 69 43 61 63 68 65 4c 65 76 65 6c 20 3d  nt iCacheLevel =
19990 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c   pParse->iCacheL
199a0 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20 20 20 61  evel; )..      a
199b0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
199c0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
199d0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 26 26 20  P_xIsSelect) && 
199e0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 29  pExpr->x.pList )
199f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
19a00 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
19a10 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20  Expr > 0);.     
19a20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   pEList = pExpr-
19a30 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  >x.pList;.      
19a40 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
19a50 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
19a60 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
19a70 70 72 3b 0a 20 20 20 20 20 20 65 6e 64 4c 61 62  pr;.      endLab
19a80 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
19a90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19aa0 20 20 20 20 69 66 28 20 28 70 58 20 3d 20 70 45      if( (pX = pE
19ab0 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d 30 20 29  xpr->pLeft)!=0 )
19ac0 7b 0a 20 20 20 20 20 20 20 20 74 65 6d 70 58 20  {.        tempX 
19ad0 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 74  = *pX;.        t
19ae0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 6f 70 3d  estcase( pX->op=
19af0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
19b00 20 20 20 20 20 20 65 78 70 72 54 6f 52 65 67 69        exprToRegi
19b10 73 74 65 72 28 26 74 65 6d 70 58 2c 20 73 71 6c  ster(&tempX, sql
19b20 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
19b30 28 70 50 61 72 73 65 2c 20 70 58 2c 20 26 72 65  (pParse, pX, &re
19b40 67 46 72 65 65 31 29 29 3b 0a 20 20 20 20 20 20  gFree1));.      
19b50 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
19b60 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
19b70 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 6f 70 20     opCompare.op 
19b80 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20  = TK_EQ;.       
19b90 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c 65 66 74   opCompare.pLeft
19ba0 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20 20 20 20   = &tempX;.     
19bb0 20 20 20 70 54 65 73 74 20 3d 20 26 6f 70 43 6f     pTest = &opCo
19bc0 6d 70 61 72 65 3b 0a 20 20 20 20 20 20 20 20 2f  mpare;.        /
19bd0 2a 20 54 69 63 6b 65 74 20 62 33 35 31 64 39 35  * Ticket b351d95
19be0 66 39 63 64 35 65 66 31 37 65 39 64 39 64 62 61  f9cd5ef17e9d9dba
19bf0 65 31 38 66 35 63 61 38 36 31 31 31 39 30 30 30  e18f5ca861119000
19c00 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  1:.        ** Th
19c10 65 20 76 61 6c 75 65 20 69 6e 20 72 65 67 46 72  e value in regFr
19c20 65 65 31 20 6d 69 67 68 74 20 67 65 74 20 53 43  ee1 might get SC
19c30 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74 68 65 20  opy-ed into the 
19c40 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a 20 20 20  file result..   
19c50 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61 6b 65 20       ** So make 
19c60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
19c70 67 46 72 65 65 31 20 72 65 67 69 73 74 65 72 20  gFree1 register 
19c80 69 73 20 6e 6f 74 20 72 65 75 73 65 64 20 66 6f  is not reused fo
19c90 72 20 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20  r other.        
19ca0 2a 2a 20 70 75 72 70 6f 73 65 73 20 61 6e 64 20  ** purposes and 
19cb0 70 6f 73 73 69 62 6c 79 20 6f 76 65 72 77 72 69  possibly overwri
19cc0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  tten.  */.      
19cd0 20 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 0a    regFree1 = 0;.
19ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
19cf0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 2d 31  r(i=0; i<nExpr-1
19d00 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
19d10 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19d20 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a  hePush(pParse);.
19d30 20 20 20 20 20 20 20 20 69 66 28 20 70 58 20 29          if( pX )
19d40 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
19d50 72 74 28 20 70 54 65 73 74 21 3d 30 20 29 3b 0a  rt( pTest!=0 );.
19d60 20 20 20 20 20 20 20 20 20 20 6f 70 43 6f 6d 70            opComp
19d70 61 72 65 2e 70 52 69 67 68 74 20 3d 20 61 4c 69  are.pRight = aLi
19d80 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 3b  stelem[i].pExpr;
19d90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
19da0 20 20 20 20 20 20 20 20 20 20 70 54 65 73 74 20            pTest 
19db0 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  = aListelem[i].p
19dc0 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Expr;.        }.
19dd0 20 20 20 20 20 20 20 20 6e 65 78 74 43 61 73 65          nextCase
19de0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
19df0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
19e00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
19e10 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  est->op==TK_COLU
19e20 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  MN );.        sq
19e30 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
19e40 28 70 50 61 72 73 65 2c 20 70 54 65 73 74 2c 20  (pParse, pTest, 
19e50 6e 65 78 74 43 61 73 65 2c 20 53 51 4c 49 54 45  nextCase, SQLITE
19e60 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
19e70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19e80 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70  aListelem[i+1].p
19e90 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
19ea0 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73  UMN );.        s
19eb0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
19ec0 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
19ed0 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20 74 61 72  [i+1].pExpr, tar
19ee0 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  get);.        sq
19ef0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
19f00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65  v, OP_Goto, 0, e
19f10 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  ndLabel);.      
19f20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
19f30 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
19f40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
19f50 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19f60 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a 20 20 20  , nextCase);.   
19f70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
19f80 6e 45 78 70 72 26 31 29 21 3d 30 20 29 7b 0a 20  nExpr&1)!=0 ){. 
19f90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
19fa0 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
19fb0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
19fc0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
19fd0 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 6e  rse, pEList->a[n
19fe0 45 78 70 72 2d 31 5d 2e 70 45 78 70 72 2c 20 74  Expr-1].pExpr, t
19ff0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
1a000 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
1a010 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Pop(pParse);.   
1a020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a040 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1a050 30 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  0, target);.    
1a060 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1a070 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1a080 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
1a090 72 72 3e 30 20 0a 20 20 20 20 20 20 20 20 20 20  rr>0 .          
1a0a0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69 43 61 63   || pParse->iCac
1a0b0 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63 68 65 4c  heLevel==iCacheL
1a0c0 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  evel );.      sq
1a0d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1a0e0 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c 61 62 65  Label(v, endLabe
1a0f0 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
1a100 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1a110 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
1a120 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
1a130 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 61 73  AISE: {.      as
1a140 73 65 72 74 28 20 70 45 78 70 72 2d 3e 61 66 66  sert( pExpr->aff
1a150 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c 6c 62 61  inity==OE_Rollba
1a160 63 6b 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ck .           |
1a170 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  | pExpr->affinit
1a180 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20 20 20 20  y==OE_Abort.    
1a190 20 20 20 20 20 20 20 7c 7c 20 70 45 78 70 72 2d         || pExpr-
1a1a0 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 46 61  >affinity==OE_Fa
1a1b0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  il.           ||
1a1c0 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1a1d0 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20 20 20 20  ==OE_Ignore.    
1a1e0 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
1a1f0 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
1a200 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1a210 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1a220 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1a240 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20  AISE() may only 
1a250 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  be used within a
1a260 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d   trigger-program
1a270 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
1a280 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1a290 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 61      if( pExpr->a
1a2a0 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72  ffinity==OE_Abor
1a2b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1a2c0 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
1a2d0 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rse);.      }.  
1a2e0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
1a2f0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1a300 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
1a310 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
1a320 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f  xpr->affinity==O
1a330 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20  E_Ignore ){.    
1a340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a350 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20 20  ddOp4(.         
1a360 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53     v, OP_Halt, S
1a370 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f 49 67 6e  QLITE_OK, OE_Ign
1a380 6f 72 65 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  ore, 0, pExpr->u
1a390 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20 20 20 20  .zToken,0);.    
1a3a0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1a3b0 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
1a3c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a3d0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1a3e0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 43  pParse, SQLITE_C
1a3f0 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
1a400 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
1a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a420 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1a430 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
1a440 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  n, 0, 0);.      
1a450 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
1a460 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1a470 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
1a480 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
1a490 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
1a4a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a4b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
1a4c0 72 65 65 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ree2);.  return 
1a4d0 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  inReg;.}../*.** 
1a4e0 46 61 63 74 6f 72 20 6f 75 74 20 74 68 65 20 63  Factor out the c
1a4f0 6f 64 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ode of the given
1a500 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 69   expression to i
1a510 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 69  nitialization ti
1a520 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1a530 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1a540 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
1a550 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
1a560 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1a570 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
1a580 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1a590 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68 65 6e 20  on to code when 
1a5a0 74 68 65 20 56 44 42 45 20 69 6e 69 74 69 61 6c  the VDBE initial
1a5b0 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  izes */.  int re
1a5c0 67 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 53  gDest,      /* S
1a5d0 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69  tore the value i
1a5e0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
1a5f0 2a 2f 0a 20 20 75 38 20 72 65 75 73 61 62 6c 65  */.  u8 reusable
1a600 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1a610 66 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  f this expressio
1a620 6e 20 69 73 20 72 65 75 73 61 62 6c 65 20 2a 2f  n is reusable */
1a630 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  .){.  ExprList *
1a640 70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 6f 6e  p;.  assert( Con
1a650 73 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73  stFactorOk(pPars
1a660 65 29 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  e) );.  p = pPar
1a670 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
1a680 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1a690 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
1a6a0 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  >db, pExpr, 0);.
1a6b0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
1a6c0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1a6d0 73 65 2c 20 70 2c 20 70 45 78 70 72 29 3b 0a 20  se, p, pExpr);. 
1a6e0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 73   if( p ){.     s
1a6f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1a700 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1a710 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a  >a[p->nExpr-1];.
1a720 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 69 43       pItem->u.iC
1a730 6f 6e 73 74 45 78 70 72 52 65 67 20 3d 20 72 65  onstExprReg = re
1a740 67 44 65 73 74 3b 0a 20 20 20 20 20 70 49 74 65  gDest;.     pIte
1a750 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d 20 72 65  m->reusable = re
1a760 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 70 50  usable;.  }.  pP
1a770 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
1a780 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47   = p;.}../*.** G
1a790 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a7a0 65 76 61 6c 75 61 74 65 20 61 6e 20 65 78 70 72  evaluate an expr
1a7b0 65 73 73 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65  ession and store
1a7c0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
1a7d0 69 6e 74 6f 20 61 20 72 65 67 69 73 74 65 72 2e  into a register.
1a7e0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67    Return the reg
1a7f0 69 73 74 65 72 20 6e 75 6d 62 65 72 20 77 68 65  ister number whe
1a800 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  re the results.*
1a810 2a 20 61 72 65 20 73 74 6f 72 65 64 2e 0a 2a 2a  * are stored..**
1a820 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 67 69 73  .** If the regis
1a830 74 65 72 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ter is a tempora
1a840 72 79 20 72 65 67 69 73 74 65 72 20 74 68 61 74  ry register that
1a850 20 63 61 6e 20 62 65 20 64 65 61 6c 6c 6f 63 61   can be dealloca
1a860 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69  ted,.** then wri
1a870 74 65 20 69 74 73 20 6e 75 6d 62 65 72 20 69 6e  te its number in
1a880 74 6f 20 2a 70 52 65 67 2e 20 20 49 66 20 74 68  to *pReg.  If th
1a890 65 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  e result registe
1a8a0 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 74 65  r is not.** a te
1a8b0 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e 20 73 65  mporary, then se
1a8c0 74 20 2a 70 52 65 67 20 74 6f 20 7a 65 72 6f 2e  t *pReg to zero.
1a8d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20  .**.** If pExpr 
1a8e0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 2c 20 74  is a constant, t
1a8f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1a900 20 6d 69 67 68 74 20 67 65 6e 65 72 61 74 65 20   might generate 
1a910 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  this.** code to 
1a920 66 69 6c 6c 20 74 68 65 20 72 65 67 69 73 74 65  fill the registe
1a930 72 20 69 6e 20 74 68 65 20 69 6e 69 74 69 61 6c  r in the initial
1a940 69 7a 61 74 69 6f 6e 20 73 65 63 74 69 6f 6e 20  ization section 
1a950 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  of the.** VDBE p
1a960 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72 64 65 72  rogram, in order
1a970 20 74 6f 20 66 61 63 74 6f 72 20 69 74 20 6f 75   to factor it ou
1a980 74 20 6f 66 20 74 68 65 20 65 76 61 6c 75 61 74  t of the evaluat
1a990 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a 69 6e 74  ion loop..*/.int
1a9a0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1a9b0 54 65 6d 70 28 50 61 72 73 65 20 2a 70 50 61 72  Temp(Parse *pPar
1a9c0 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1a9d0 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a 20 20 69   int *pReg){.  i
1a9e0 6e 74 20 72 32 3b 0a 20 20 70 45 78 70 72 20 3d  nt r2;.  pExpr =
1a9f0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
1aa00 43 6f 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a  Collate(pExpr);.
1aa10 20 20 69 66 28 20 43 6f 6e 73 74 46 61 63 74 6f    if( ConstFacto
1aa20 72 4f 6b 28 70 50 61 72 73 65 29 0a 20 20 20 26  rOk(pParse).   &
1aa30 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  & pExpr->op!=TK_
1aa40 52 45 47 49 53 54 45 52 0a 20 20 20 26 26 20 73  REGISTER.   && s
1aa50 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1aa60 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70 45 78 70  tantNotJoin(pExp
1aa70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45 78 70 72  r).  ){.    Expr
1aa80 4c 69 73 74 20 2a 70 20 3d 20 70 50 61 72 73 65  List *p = pParse
1aa90 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20  ->pConstExpr;.  
1aaa0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 2a 70 52    int i;.    *pR
1aab0 65 67 20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  eg  = 0;.    if(
1aac0 20 70 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75   p ){.      stru
1aad0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1aae0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
1aaf0 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61 2c 20 69  or(pItem=p->a, i
1ab00 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e 30 3b 20  =p->nExpr; i>0; 
1ab10 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29 7b 0a 20  pItem++, i--){. 
1ab20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1ab30 2d 3e 72 65 75 73 61 62 6c 65 20 26 26 20 73 71  ->reusable && sq
1ab40 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
1ab50 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 70 45  (pItem->pExpr,pE
1ab60 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  xpr,-1)==0 ){.  
1ab70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1ab80 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73 74 45 78  Item->u.iConstEx
1ab90 70 72 52 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  prReg;.        }
1aba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1abb0 20 20 20 72 32 20 3d 20 2b 2b 70 50 61 72 73 65     r2 = ++pParse
1abc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
1abd0 74 65 33 45 78 70 72 43 6f 64 65 41 74 49 6e 69  te3ExprCodeAtIni
1abe0 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  t(pParse, pExpr,
1abf0 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65   r2, 1);.  }else
1ac00 7b 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73  {.    int r1 = s
1ac10 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
1ac20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 32  (pParse);.    r2
1ac30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ac40 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1ac50 20 70 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20   pExpr, r1);.   
1ac60 20 69 66 28 20 72 32 3d 3d 72 31 20 29 7b 0a 20   if( r2==r1 ){. 
1ac70 20 20 20 20 20 2a 70 52 65 67 20 3d 20 72 31 3b       *pReg = r1;
1ac80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ac90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1aca0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1acb0 72 31 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 67  r1);.      *pReg
1acc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1acd0 20 20 72 65 74 75 72 6e 20 72 32 3b 0a 7d 0a 0a    return r2;.}..
1ace0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1acf0 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
1ad00 61 6c 75 61 74 65 20 65 78 70 72 65 73 73 69 6f  aluate expressio
1ad10 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74 6f 72  n pExpr and stor
1ad20 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  e the.** results
1ad30 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1ad40 67 65 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74  get.  The result
1ad50 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1ad60 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e   to appear.** in
1ad70 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65 74   register target
1ad80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ad90 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
1ada0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1adb0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1adc0 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65 67 3b 0a  ){.  int inReg;.
1add0 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67 65  .  assert( targe
1ade0 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d 70  t>0 && target<=p
1adf0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
1ae00 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 45   if( pExpr && pE
1ae10 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
1ae20 53 54 45 52 20 29 7b 0a 20 20 20 20 73 71 6c 69  STER ){.    sqli
1ae30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70 50  te3VdbeAddOp2(pP
1ae40 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f  arse->pVdbe, OP_
1ae50 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  Copy, pExpr->iTa
1ae60 62 6c 65 2c 20 74 61 72 67 65 74 29 3b 0a 20 20  ble, target);.  
1ae70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 52 65 67  }else{.    inReg
1ae80 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
1ae90 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
1aea0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1aeb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1aec0 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c 20 70 50  rse->pVdbe || pP
1aed0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
1aee0 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
1aef0 28 20 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20  ( inReg!=target 
1af00 26 26 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  && pParse->pVdbe
1af10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1af20 33 56 64 62 65 41 64 64 4f 70 32 28 70 50 61 72  3VdbeAddOp2(pPar
1af30 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 53 43  se->pVdbe, OP_SC
1af40 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74 61 72 67  opy, inReg, targ
1af50 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  et);.    }.  }.}
1af60 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1af70 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1af80 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73 73  evaluate express
1af90 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73 74  ion pExpr and st
1afa0 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  ore the.** resul
1afb0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ts in register t
1afc0 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73 75  arget.  The resu
1afd0 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lts are guarante
1afe0 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a 20  ed to appear.** 
1aff0 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67  in register targ
1b000 65 74 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  et.  If the expr
1b010 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
1b020 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  nt, then this ro
1b030 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 63  utine.** might c
1b040 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65 20 74 68  hoose to code th
1b050 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 74 20  e expression at 
1b060 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74  initialization t
1b070 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1b080 69 74 65 33 45 78 70 72 43 6f 64 65 46 61 63 74  ite3ExprCodeFact
1b090 6f 72 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  orable(Parse *pP
1b0a0 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
1b0b0 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29 7b 0a  r, int target){.
1b0c0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6b    if( pParse->ok
1b0d0 43 6f 6e 73 74 46 61 63 74 6f 72 20 26 26 20 73  ConstFactor && s
1b0e0 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
1b0f0 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20  tant(pExpr) ){. 
1b100 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1b110 64 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c  deAtInit(pParse,
1b120 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 2c 20   pExpr, target, 
1b130 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1b140 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1b150 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
1b160 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  target);.  }.}..
1b170 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1b180 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61 74  ode that evaluat
1b190 65 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  es the given exp
1b1a0 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75 74 73  ression and puts
1b1b0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
1b1c0 6e 20 72 65 67 69 73 74 65 72 20 74 61 72 67 65  n register targe
1b1d0 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 6d 61  t..**.** Also ma
1b1e0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
1b1f0 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 73 75   expression resu
1b200 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72  lts into another
1b210 20 22 63 61 63 68 65 22 20 72 65 67 69 73 74 65   "cache" registe
1b220 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66 79 20  r.** and modify 
1b230 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 73  the expression s
1b240 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
1b250 74 69 6d 65 20 69 74 20 69 73 20 65 76 61 6c 75  time it is evalu
1b260 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72 65 73  ated,.** the res
1b270 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ult is a copy of
1b280 20 74 68 65 20 63 61 63 68 65 20 72 65 67 69 73   the cache regis
1b290 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
1b2a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1b2b0 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  for expressions 
1b2c0 74 68 61 74 20 61 72 65 20 75 73 65 64 20 6d 75  that are used mu
1b2d0 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d 65 73  ltiple .** times
1b2e0 2e 20 20 54 68 65 79 20 61 72 65 20 65 76 61 6c  .  They are eval
1b2f0 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64 20 74  uated once and t
1b300 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
1b310 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
1b320 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 76  are reused..*/.v
1b330 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
1b340 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72 73  odeAndCache(Pars
1b350 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
1b360 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67  *pExpr, int targ
1b370 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  et){.  Vdbe *v =
1b380 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
1b390 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20 20 61    int iMem;..  a
1b3a0 73 73 65 72 74 28 20 74 61 72 67 65 74 3e 30 20  ssert( target>0 
1b3b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
1b3c0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47 49 53  pr->op!=TK_REGIS
1b3d0 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  TER );.  sqlite3
1b3e0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
1b3f0 20 70 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b   pExpr, target);
1b400 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  .  iMem = ++pPar
1b410 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
1b420 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b430 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67 65 74   OP_Copy, target
1b440 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70 72 54  , iMem);.  exprT
1b450 6f 52 65 67 69 73 74 65 72 28 70 45 78 70 72 2c  oRegister(pExpr,
1b460 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66 20 64   iMem);.}..#if d
1b470 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1b480 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
1b490 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
1b4a0 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
1b4b0 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  le explanation o
1b4c0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
1b4d0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
1b4e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1b4f0 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70  (Vdbe *pOut, Exp
1b500 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
1b510 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1b520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
1b530 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64 65 64  code being coded
1b540 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b550 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20 20 20   *zBinOp = 0;   
1b560 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72 61 74  /* Binary operat
1b570 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
1b580 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30 3b 20  ar *zUniOp = 0; 
1b590 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65 72 61    /* Unary opera
1b5a0 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  tor */.  if( pEx
1b5b0 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 20  pr==0 ){.    op 
1b5c0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d 65 6c  = TK_NULL;.  }el
1b5d0 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70 45 78  se{.    op = pEx
1b5e0 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20 73 77  pr->op;.  }.  sw
1b5f0 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
1b600 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  case TK_AGG_COLU
1b610 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MN: {.      sqli
1b620 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b630 28 70 4f 75 74 2c 20 22 41 47 47 7b 25 64 3a 25  (pOut, "AGG{%d:%
1b640 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d}",.           
1b650 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1b660 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1b670 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b680 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1b690 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
1b6a0 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
1b6b0 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e<0 ){.        /
1b6c0 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
1b6d0 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e 67 20  ens when coding 
1b6e0 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69 6e 74  check constraint
1b6f0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  s */.        sql
1b700 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b710 66 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d 4e 28  f(pOut, "COLUMN(
1b720 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69 43 6f  %d)", pExpr->iCo
1b730 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
1b740 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1b750 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b760 28 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64 7d 22  (pOut, "{%d:%d}"
1b770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b790 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45  Expr->iTable, pE
1b7a0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
1b7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
1b7c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1b7d0 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
1b7e0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1b7f0 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e 74  ->flags & EP_Int
1b800 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Value ){.       
1b810 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1b820 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 64 22  rintf(pOut, "%d"
1b830 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  , pExpr->u.iValu
1b840 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
1b850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b860 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1b870 75 74 2c 20 22 25 73 22 2c 20 70 45 78 70 72 2d  ut, "%s", pExpr-
1b880 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1b890 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1b8a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1b8b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1b8c0 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 63 61  ING_POINT.    ca
1b8d0 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
1b8e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1b8f0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1b900 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %s", pExpr->u.zT
1b910 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
1b920 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1b930 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
1b940 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ING: {.      sql
1b950 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1b960 66 28 70 4f 75 74 2c 22 25 51 22 2c 20 70 45 78  f(pOut,"%Q", pEx
1b970 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1b980 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b990 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  }.    case TK_NU
1b9a0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
1b9b0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1b9c0 28 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  (pOut,"NULL");. 
1b9d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b9e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1b9f0 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
1ba00 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
1ba10 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LOB: {.      sql
1ba20 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1ba30 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70 45 78  f(pOut,"%s", pEx
1ba40 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1ba50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ba60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1ba70 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
1ba80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1ba90 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1baa0 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c 25 64  ,"VARIABLE(%s,%d
1bab0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1bad0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1bae0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1baf0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bb00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1bb10 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20  REGISTER: {.    
1bb20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1bb30 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 52 45 47  Printf(pOut,"REG
1bb40 49 53 54 45 52 28 25 64 29 22 2c 20 70 45 78 70  ISTER(%d)", pExp
1bb50 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r->iTable);.    
1bb60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bb70 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
1bb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1bb90 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1bba0 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
1bbb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bbc0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1bbd0 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20 20 63  _OMIT_CAST.    c
1bbe0 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b 0a 20  ase TK_CAST: {. 
1bbf0 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
1bc00 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ons of the form:
1bc10 20 20 20 43 41 53 54 28 70 4c 65 66 74 20 41 53     CAST(pLeft AS
1bc20 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20 20 20   token) */.     
1bc30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 66   const char *zAf
1bc40 66 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20  f = "unk";.     
1bc50 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
1bc60 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 45 78  AffinityType(pEx
1bc70 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30 29  pr->u.zToken, 0)
1bc80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
1bc90 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
1bca0 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 54 45 58  :    zAff = "TEX
1bcb0 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
1bcc0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1bcd0 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20 20  TE_AFF_NONE:    
1bce0 7a 41 66 66 20 3d 20 22 4e 4f 4e 45 22 3b 20 20  zAff = "NONE";  
1bcf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bd00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46    case SQLITE_AF
1bd10 46 5f 4e 55 4d 45 52 49 43 3a 20 7a 41 66 66 20  F_NUMERIC: zAff 
1bd20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20 20 62 72  = "NUMERIC";  br
1bd30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
1bd40 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  e SQLITE_AFF_INT
1bd50 45 47 45 52 3a 20 7a 41 66 66 20 3d 20 22 49 4e  EGER: zAff = "IN
1bd60 54 45 47 45 52 22 3b 20 20 62 72 65 61 6b 3b 0a  TEGER";  break;.
1bd70 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1bd80 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 20 20 20  ITE_AFF_REAL:   
1bd90 20 7a 41 66 66 20 3d 20 22 52 45 41 4c 22 3b 20   zAff = "REAL"; 
1bda0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bdb0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1bdc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1bdd0 75 74 2c 20 22 43 41 53 54 2d 25 73 28 22 2c 20  ut, "CAST-%s(", 
1bde0 7a 41 66 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  zAff);.      sql
1bdf0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1be00 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  pOut, pExpr->pLe
1be10 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
1be20 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1be30 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1be40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1be50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1be60 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20  OMIT_CAST */.   
1be70 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
1be80 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54 22 3b    zBinOp = "LT";
1be90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bea0 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
1beb0 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22 3b 20   zBinOp = "LE"; 
1bec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1bed0 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
1bee0 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b 20 20  zBinOp = "GT";  
1bef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1bf00 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a  se TK_GE:      z
1bf10 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20 20 20  BinOp = "GE";   
1bf20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1bf30 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 42  e TK_NE:      zB
1bf40 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20  inOp = "NE";    
1bf50 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1bf60 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 42 69   TK_EQ:      zBi
1bf70 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  nOp = "EQ";     
1bf80 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bf90 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42 69 6e  TK_IS:      zBin
1bfa0 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 62  Op = "IS";     b
1bfb0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1bfc0 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f  K_ISNOT:   zBinO
1bfd0 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 62 72  p = "ISNOT";  br
1bfe0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1bff0 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _AND:     zBinOp
1c000 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62 72 65   = "AND";    bre
1c010 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c020 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20  OR:      zBinOp 
1c030 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72 65 61  = "OR";     brea
1c040 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  k;.    case TK_P
1c050 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d  LUS:    zBinOp =
1c060 20 22 41 44 44 22 3b 20 20 20 20 62 72 65 61 6b   "ADD";    break
1c070 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
1c080 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  AR:    zBinOp = 
1c090 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  "MUL";    break;
1c0a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
1c0b0 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22  US:   zBinOp = "
1c0c0 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  SUB";    break;.
1c0d0 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
1c0e0 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52       zBinOp = "R
1c0f0 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  EM";    break;. 
1c100 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
1c110 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49  D:  zBinOp = "BI
1c120 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a 20 20  TAND"; break;.  
1c130 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
1c140 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42 49 54     zBinOp = "BIT
1c150 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OR";  break;.   
1c160 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
1c170 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49 56 22    zBinOp = "DIV"
1c180 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1c190 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20  case TK_LSHIFT: 
1c1a0 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48 49 46   zBinOp = "LSHIF
1c1b0 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  T"; break;.    c
1c1c0 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20  ase TK_RSHIFT:  
1c1d0 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49 46 54  zBinOp = "RSHIFT
1c1e0 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
1c1f0 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a  se TK_CONCAT:  z
1c200 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22  BinOp = "CONCAT"
1c210 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61  ; break;..    ca
1c220 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a  se TK_UMINUS:  z
1c230 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55 53 22  UniOp = "UMINUS"
1c240 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1c250 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 55  e TK_UPLUS:   zU
1c260 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22 3b 20  niOp = "UPLUS"; 
1c270 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c280 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 55 6e   TK_BITNOT:  zUn
1c290 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20  iOp = "BITNOT"; 
1c2a0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c2b0 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55 6e 69  TK_NOT:     zUni
1c2c0 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 62  Op = "NOT";    b
1c2d0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c2e0 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e 69 4f  K_ISNULL:  zUniO
1c2f0 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 62 72  p = "ISNULL"; br
1c300 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c310 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69 4f 70  _NOTNULL: zUniOp
1c320 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72   = "NOTNULL"; br
1c330 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  eak;..    case T
1c340 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20 20 20  K_COLLATE: {.   
1c350 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c360 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1c370 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1c380 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c390 72 69 6e 74 66 28 70 4f 75 74 2c 22 2e 43 4f 4c  rintf(pOut,".COL
1c3a0 4c 41 54 45 28 25 73 29 22 2c 70 45 78 70 72 2d  LATE(%s)",pExpr-
1c3b0 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  >u.zToken);.    
1c3c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c3d0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
1c3e0 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
1c3f0 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
1c400 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
1c410 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20 20 2f   *pFarg;       /
1c420 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63 74 69  * List of functi
1c430 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
1c440 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
1c450 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c460 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29   EP_TokenOnly) )
1c470 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1c480 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1c490 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20  {.        pFarg 
1c4a0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1c4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c4c0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  if( op==TK_AGG_F
1c4d0 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 20  UNCTION ){.     
1c4e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c4f0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 41  nPrintf(pOut, "A
1c500 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a 25 73  GG_FUNCTION%d:%s
1c510 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (",.            
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70 45 78   pExpr->op2, pEx
1c540 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
1c550 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c560 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c570 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c580 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c 20 70  FUNCTION:%s(", p
1c590 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1c5a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c5b0 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
1c5c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c5d0 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c  inExprList(pOut,
1c5e0 20 70 46 61 72 67 29 3b 0a 20 20 20 20 20 20 7d   pFarg);.      }
1c5f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c600 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c610 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72  , ")");.      br
1c620 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1c630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1c640 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
1c650 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a 20 20   TK_EXISTS: {.  
1c660 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c670 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c680 45 58 49 53 54 53 28 22 29 3b 0a 20 20 20 20 20  EXISTS(");.     
1c690 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
1c6a0 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70  elect(pOut, pExp
1c6b0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
1c6c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c6d0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1c6e0 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  )");.      break
1c6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c700 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
1c710 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c720 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c730 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (");.      sqlit
1c740 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
1c750 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pOut, pExpr->x.p
1c760 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
1c770 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1c780 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a  ntf(pOut, ")");.
1c790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c7a0 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
1c7b0 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  N: {.      sqlit
1c7c0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1c7d0 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a 20 20  pOut, "IN(");.  
1c7e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c7f0 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78  inExpr(pOut, pEx
1c800 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
1c810 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c820 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22  Printf(pOut, ","
1c830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
1c840 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1c850 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
1c860 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1c870 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63  ite3ExplainSelec
1c880 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1c890 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
1c8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c8b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1c8c0 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70 45 78  prList(pOut, pEx
1c8d0 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1c8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c8f0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1c900 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20  (pOut, ")");.   
1c910 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c920 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c930 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
1c940 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  /..    /*.    **
1c950 20 20 20 20 78 20 42 45 54 57 45 45 4e 20 79 20      x BETWEEN y 
1c960 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20 20 20  AND z.    **.   
1c970 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71 75 69   ** This is equi
1c980 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20 2a 2a  valent to.    **
1c990 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d 79 20  .    **    x>=y 
1c9a0 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a 2a 0a  AND x<=z.    **.
1c9b0 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74 6f 72      ** X is stor
1c9c0 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70 4c 65  ed in pExpr->pLe
1c9d0 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69 73 20  ft..    ** Y is 
1c9e0 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1c9f0 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
1ca00 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69 73 20  pr..    ** Z is 
1ca10 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d  stored in pExpr-
1ca20 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
1ca30 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  pr..    */.    c
1ca40 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
1ca50 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
1ca60 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
1ca70 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 59 20  .      Expr *pY 
1ca80 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1ca90 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
1caa0 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d 20 70      Expr *pZ = p
1cab0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
1cac0 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
1cad0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1cae0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 42 45 54  rintf(pOut, "BET
1caf0 57 45 45 4e 28 22 29 3b 0a 20 20 20 20 20 20 73  WEEN(");.      s
1cb00 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1cb10 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20 20 20  r(pOut, pX);.   
1cb20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1cb30 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1cb40 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1cb50 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75  3ExplainExpr(pOu
1cb60 74 2c 20 70 59 29 3b 0a 20 20 20 20 20 20 73 71  t, pY);.      sq
1cb70 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1cb80 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b 0a 20  tf(pOut, ",");. 
1cb90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1cba0 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 5a  ainExpr(pOut, pZ
1cbb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1cbc0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1cbd0 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  ut, ")");.      
1cbe0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cbf0 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47 45 52   case TK_TRIGGER
1cc00 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  : {.      /* If 
1cc10 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 54 4b  the opcode is TK
1cc20 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e 20 74  _TRIGGER, then t
1cc30 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
1cc40 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20   a reference.   
1cc50 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c 75 6d     ** to a colum
1cc60 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 6f  n in the new.* o
1cc70 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d 74  r old.* pseudo-t
1cc80 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
1cc90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72 69 67  to.      ** trig
1cca0 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 49 6e  ger programs. In
1ccb0 20 74 68 69 73 20 63 61 73 65 20 45 78 70 72 2e   this case Expr.
1ccc0 69 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  iTable is set to
1ccd0 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20   1 for the.     
1cce0 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75 64 6f   ** new.* pseudo
1ccf0 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66 6f 72  -table, or 0 for
1cd00 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64   the old.* pseud
1cd10 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e 69 43  o-table. Expr.iC
1cd20 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 69  olumn.      ** i
1cd30 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
1cd40 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65 75 64  umn of the pseud
1cd50 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61 64 2c  o-table to read,
1cd60 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20 20 20   or to -1 to.   
1cd70 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65 20 72     ** read the r
1cd80 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20 20 20  owid field..    
1cd90 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
1cda0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1cdb0 70 4f 75 74 2c 20 22 25 73 28 25 64 29 22 2c 20  pOut, "%s(%d)", 
1cdc0 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
1cdd0 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45 57 22  ->iTable ? "NEW"
1cde0 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70 72 2d   : "OLD", pExpr-
1cdf0 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
1ce00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce10 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
1ce20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1ce30 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75  xplainPrintf(pOu
1ce40 74 2c 20 22 43 41 53 45 28 22 29 3b 0a 20 20 20  t, "CASE(");.   
1ce50 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1ce60 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1ce70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
1ce80 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1ce90 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29  rintf(pOut, ",")
1cea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1ceb0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
1cec0 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c  Out, pExpr->x.pL
1ced0 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ist);.      brea
1cee0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1cef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
1cf00 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b  GGER.    case TK
1cf10 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
1cf20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
1cf30 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20 20 20  e = "unk";.     
1cf40 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
1cf50 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20  affinity ){.    
1cf60 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f 6c 6c      case OE_Roll
1cf70 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20 3d 20  back:   zType = 
1cf80 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62 72 65  "rollback";  bre
1cf90 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1cfa0 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20 20 20   OE_Abort:      
1cfb0 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74 22 3b  zType = "abort";
1cfc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cfd0 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61 69 6c      case OE_Fail
1cfe0 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  :       zType = 
1cff0 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62 72 65  "fail";      bre
1d000 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
1d010 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20 20 20   OE_Ignore:     
1d020 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72 65 22  zType = "ignore"
1d030 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
1d040 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1d050 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d060 4f 75 74 2c 20 22 52 41 49 53 45 2d 25 73 28 25  Out, "RAISE-%s(%
1d070 73 29 22 2c 20 7a 54 79 70 65 2c 20 70 45 78 70  s)", zType, pExp
1d080 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1d090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d0a0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
1d0b0 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20 20 20  ( zBinOp ){.    
1d0c0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1d0d0 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28 22 2c  intf(pOut,"%s(",
1d0e0 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20 73 71   zBinOp);.    sq
1d0f0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1d100 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 4c  (pOut, pExpr->pL
1d110 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eft);.    sqlite
1d120 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1d130 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20 73 71  Out,",");.    sq
1d140 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1d150 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70 52  (pOut, pExpr->pR
1d160 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  ight);.    sqlit
1d170 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1d180 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d 65 6c  pOut,")");.  }el
1d190 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20 29 7b  se if( zUniOp ){
1d1a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1d1b0 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22  ainPrintf(pOut,"
1d1c0 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b 0a 20  %s(", zUniOp);. 
1d1d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d1e0 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45 78 70  nExpr(pOut, pExp
1d1f0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  r->pLeft);.    s
1d200 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1d210 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20  ntf(pOut,")");. 
1d220 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64   }.}.#endif /* d
1d230 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1d240 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
1d250 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  N) */..#if defin
1d260 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1d270 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
1d280 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1d290 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
1d2a0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 61 6e  xplanation of an
1d2b0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
1d2c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d2d0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
1d2e0 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45 78 70  (Vdbe *pOut, Exp
1d2f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
1d300 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1d310 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73 74 2d  ist==0 || pList-
1d320 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20  >nExpr==0 ){.   
1d330 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1d340 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28 65 6d  rintf(pOut, "(em
1d350 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20 20 20  pty-list)");.   
1d360 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
1d370 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
1d380 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==1 ){.    sqli
1d390 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1d3a0 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  Out, pList->a[0]
1d3b0 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65  .pExpr);.  }else
1d3c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1d3d0 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29 3b 0a  lainPush(pOut);.
1d3e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1d3f0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1d400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1d410 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1d420 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20 3d 20  ut, "item[%d] = 
1d430 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", i);.      sql
1d440 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
1d450 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  pOut);.      sql
1d460 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
1d470 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  pOut, pList->a[i
1d480 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1d490 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f  sqlite3ExplainPo
1d4a0 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  p(pOut);.      i
1d4b0 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
1d4c0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
1d4d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1d4e0 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 41 53 20  intf(pOut, " AS 
1d4f0 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  %s", pList->a[i]
1d500 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  .zName);.      }
1d510 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
1d520 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73 54 61  ->a[i].bSpanIsTa
1d530 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  b ){.        sql
1d540 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1d550 66 28 70 4f 75 74 2c 20 22 20 28 25 73 29 22 2c  f(pOut, " (%s)",
1d560 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
1d570 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  an);.      }.   
1d580 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d 3e     if( i<pList->
1d590 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20 20  nExpr-1 ){.     
1d5a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d5b0 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  nNL(pOut);.     
1d5c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
1d5d0 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
1d5e0 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Out);.  }.}.#end
1d5f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
1d600 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  UG */../*.** Gen
1d610 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1d620 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
1d630 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
1d640 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
1d650 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
1d660 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65 6e 63  t into a sequenc
1d670 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 62  e of registers b
1d680 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61 72 67  eginning at targ
1d690 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  et..**.** Return
1d6a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1d6b0 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61 74 65  lements evaluate
1d6c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  d..**.** The SQL
1d6d0 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66 6c 61  ITE_ECEL_DUP fla
1d6e0 67 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 61  g prevents the a
1d6f0 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 62 65  rguments from be
1d700 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20 75 73  ing.** filled us
1d710 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20 20 4f  ing OP_SCopy.  O
1d720 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65 20 75  P_Copy must be u
1d730 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
1d740 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 45 43  ** The SQLITE_EC
1d750 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75 6d 65  EL_FACTOR argume
1d760 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73 74 61  nt allows consta
1d770 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  nt arguments to 
1d780 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64 20 6f  be.** factored o
1d790 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61 6c 69  ut into initiali
1d7a0 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a 2f 0a  zation code..*/.
1d7b0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1d7c0 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
1d7d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d7e0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1d7f0 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
1d800 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
1d810 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
1d820 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
1d830 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65 74 2c  */.  int target,
1d840 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1d850 20 74 6f 20 77 72 69 74 65 20 72 65 73 75 6c 74   to write result
1d860 73 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67 73 20  s */.  u8 flags 
1d870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
1d880 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61 67 73  ITE_ECEL_* flags
1d890 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
1d8a0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1d8b0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e  Item;.  int i, n
1d8c0 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20 3d 20  ;.  u8 copyOp = 
1d8d0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1d8e0 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50 5f 43  ECEL_DUP) ? OP_C
1d8f0 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79 3b 0a  opy : OP_SCopy;.
1d900 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
1d910 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1d920 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20 61 73  target>0 );.  as
1d930 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 56  sert( pParse->pV
1d940 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20 4e 65  dbe!=0 );  /* Ne
1d950 76 65 72 20 67 65 74 73 20 74 68 69 73 20 66 61  ver gets this fa
1d960 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20  r otherwise */. 
1d970 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
1d980 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73 74 46  r;.  if( !ConstF
1d990 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 20  actorOk(pParse) 
1d9a0 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ) flags &= ~SQLI
1d9b0 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 3b 0a  TE_ECEL_FACTOR;.
1d9c0 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
1d9d0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
1d9e0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1d9f0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1da00 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
1da10 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1da20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54  SQLITE_ECEL_FACT
1da30 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69 74 65  OR)!=0 && sqlite
1da40 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
1da50 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
1da60 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
1da70 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45  tInit(pParse, pE
1da80 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c 20 30  xpr, target+i, 0
1da90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1daa0 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20 3d 20      int inReg = 
1dab0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1dac0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 45  arget(pParse, pE
1dad0 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a  xpr, target+i);.
1dae0 20 20 20 20 20 20 69 66 28 20 69 6e 52 65 67 21        if( inReg!
1daf0 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20 20 20  =target+i ){.   
1db00 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70       VdbeOp *pOp
1db10 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  ;.        Vdbe *
1db20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1db30 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  e;.        if( c
1db40 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79 0a 20  opyOp==OP_Copy. 
1db50 20 20 20 20 20 20 20 20 26 26 20 28 70 4f 70 3d          && (pOp=
1db60 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
1db70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f 64 65  (v, -1))->opcode
1db80 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20 20 20  ==OP_Copy.      
1db90 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b 70 4f     && pOp->p1+pO
1dba0 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67 0a 20  p->p3+1==inReg. 
1dbb0 20 20 20 20 20 20 20 20 26 26 20 70 4f 70 2d 3e          && pOp->
1dbc0 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d 74 61  p2+pOp->p3+1==ta
1dbd0 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20 20 29  rget+i.        )
1dbe0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
1dbf0 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  >p3++;.        }
1dc00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1dc10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dc20 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69 6e 52  2(v, copyOp, inR
1dc30 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b 0a 20  eg, target+i);. 
1dc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dc50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1dc60 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1dc70 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1dc80 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70 65 72  r a BETWEEN oper
1dc90 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 78  ator..**.**    x
1dca0 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a   BETWEEN y AND z
1dcb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
1dcc0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1dcd0 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e 3d 79  o .**.**    x>=y
1dce0 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a 2a 20   AND x<=z.**.** 
1dcf0 43 6f 64 65 20 69 74 20 61 73 20 73 75 63 68 2c  Code it as such,
1dd00 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
1dd10 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 75  do the common su
1dd20 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 65  bexpression.** e
1dd30 6c 69 6d 69 6e 61 74 69 6f 6e 20 6f 66 20 78 2e  limination of x.
1dd40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dd50 65 78 70 72 43 6f 64 65 42 65 74 77 65 65 6e 28  exprCodeBetween(
1dd60 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1dd70 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1dd80 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1dd90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1dda0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
1ddb0 20 20 20 2f 2a 20 54 68 65 20 42 45 54 57 45 45     /* The BETWEE
1ddc0 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  N expression */.
1ddd0 20 20 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20    int dest,     
1dde0 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
1ddf0 20 69 66 20 74 68 65 20 6a 75 6d 70 20 69 73 20   if the jump is 
1de00 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6a  taken */.  int j
1de10 75 6d 70 49 66 54 72 75 65 2c 20 20 20 2f 2a 20  umpIfTrue,   /* 
1de20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  Take the jump if
1de30 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20   the BETWEEN is 
1de40 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  true */.  int ju
1de50 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 54  mpIfNull    /* T
1de60 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20  ake the jump if 
1de70 74 68 65 20 42 45 54 57 45 45 4e 20 69 73 20 4e  the BETWEEN is N
1de80 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ULL */.){.  Expr
1de90 20 65 78 70 72 41 6e 64 3b 20 20 20 20 20 2f 2a   exprAnd;     /*
1dea0 20 54 68 65 20 41 4e 44 20 6f 70 65 72 61 74 6f   The AND operato
1deb0 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e 44 20 78  r in  x>=y AND x
1dec0 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70 72 20 63  <=z  */.  Expr c
1ded0 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f 2a 20 54  ompLeft;    /* T
1dee0 68 65 20 20 78 3e 3d 79 20 20 74 65 72 6d 20 2a  he  x>=y  term *
1def0 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70 52 69 67  /.  Expr compRig
1df00 68 74 3b 20 20 20 2f 2a 20 54 68 65 20 20 78 3c  ht;   /* The  x<
1df10 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20 20 45 78  =z  term */.  Ex
1df20 70 72 20 65 78 70 72 58 3b 20 20 20 20 20 20 20  pr exprX;       
1df30 2f 2a 20 54 68 65 20 20 78 20 20 73 75 62 65 78  /* The  x  subex
1df40 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e  pression */.  in
1df50 74 20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20  t regFree1 = 0; 
1df60 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 75 73 65  /* Temporary use
1df70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20 20   register */..  
1df80 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
1df90 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1dfa0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1dfb0 0a 20 20 65 78 70 72 58 20 3d 20 2a 70 45 78 70  .  exprX = *pExp
1dfc0 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65 78 70 72  r->pLeft;.  expr
1dfd0 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b  And.op = TK_AND;
1dfe0 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c 65 66 74  .  exprAnd.pLeft
1dff0 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b 0a 20 20   = &compLeft;.  
1e000 65 78 70 72 41 6e 64 2e 70 52 69 67 68 74 20 3d  exprAnd.pRight =
1e010 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a 20 20 63   &compRight;.  c
1e020 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20 54 4b 5f  ompLeft.op = TK_
1e030 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70  GE;.  compLeft.p
1e040 4c 65 66 74 20 3d 20 26 65 78 70 72 58 3b 0a 20  Left = &exprX;. 
1e050 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69 67 68 74   compLeft.pRight
1e060 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
1e070 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1e080 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70 20 3d 20   compRight.op = 
1e090 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70 52 69 67  TK_LE;.  compRig
1e0a0 68 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72  ht.pLeft = &expr
1e0b0 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 70  X;.  compRight.p
1e0c0 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78  Right = pExpr->x
1e0d0 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
1e0e0 70 72 3b 0a 20 20 65 78 70 72 54 6f 52 65 67 69  pr;.  exprToRegi
1e0f0 73 74 65 72 28 26 65 78 70 72 58 2c 20 73 71 6c  ster(&exprX, sql
1e100 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
1e110 28 70 50 61 72 73 65 2c 20 26 65 78 70 72 58 2c  (pParse, &exprX,
1e120 20 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20   &regFree1));.  
1e130 69 66 28 20 6a 75 6d 70 49 66 54 72 75 65 20 29  if( jumpIfTrue )
1e140 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1e150 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
1e160 26 65 78 70 72 41 6e 64 2c 20 64 65 73 74 2c 20  &exprAnd, dest, 
1e170 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 7d  jumpIfNull);.  }
1e180 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
1e190 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1e1a0 72 73 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64  rse, &exprAnd, d
1e1b0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1e1c0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  ;.  }.  sqlite3R
1e1d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1e1e0 61 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b  arse, regFree1);
1e1f0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 61 64  ..  /* Ensure ad
1e200 65 71 75 61 74 65 20 74 65 73 74 20 63 6f 76 65  equate test cove
1e210 72 61 67 65 20 2a 2f 0a 20 20 74 65 73 74 63 61  rage */.  testca
1e220 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1e230 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1e240 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d  =0 && regFree1==
1e250 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1e260 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1e270 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  & jumpIfNull==0 
1e280 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20 29  && regFree1!=0 )
1e290 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1e2a0 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e2b0 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1e2c0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
1e2d0 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e2e0 66 54 72 75 65 3d 3d 30 20 26 26 20 6a 75 6d 70  fTrue==0 && jump
1e2f0 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20 72 65 67  IfNull!=0 && reg
1e300 46 72 65 65 31 21 3d 30 20 29 3b 0a 20 20 74 65  Free1!=0 );.  te
1e310 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e320 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1e330 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1e340 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1==0 );.  testc
1e350 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1e360 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e370 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21  ==0 && regFree1!
1e380 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e390 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e3a0 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1e3b0 20 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20   && regFree1==0 
1e3c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a  );.  testcase( j
1e3d0 75 6d 70 49 66 54 72 75 65 21 3d 30 20 26 26 20  umpIfTrue!=0 && 
1e3e0 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26  jumpIfNull!=0 &&
1e3f0 20 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a   regFree1!=0 );.
1e400 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1e410 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1e420 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1e430 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1e440 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1e450 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1e460 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1e470 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78  n is true but ex
1e480 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
1e490 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
1e4a0 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
1e4b0 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a  sion is false..*
1e4c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1e4d0 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1e4e0 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1e4f0 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1e500 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20  ), then.** take 
1e510 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65 20  the jump if the 
1e520 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20  jumpIfNull flag 
1e530 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  is SQLITE_JUMPIF
1e540 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
1e550 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
1e560 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63   the fact that c
1e570 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c  ertain token val
1e580 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a  ues (ex: TK_EQ).
1e590 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ** are the same 
1e5a0 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73  as opcode values
1e5b0 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61   (ex: OP_Eq) tha
1e5c0 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  t implement the 
1e5d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1e5e0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65   operation.  Spe
1e5f0 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  cial comments in
1e600 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20   vdbe.c and the 
1e610 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63  mkopcodeh.awk sc
1e620 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d  ript in.** the m
1e630 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73  ake process caus
1e640 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74  e these values t
1e650 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74  o align.  Assert
1e660 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a  ()s in the code.
1e670 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20  ** below verify 
1e680 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73  that the numbers
1e690 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72   are aligned cor
1e6a0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  rectly..*/.void 
1e6b0 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1e6c0 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1e6d0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
1e6e0 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
1e6f0 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
1e700 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1e710 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
1e720 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31  ;.  int regFree1
1e730 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46   = 0;.  int regF
1e740 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ree2 = 0;.  int 
1e750 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72  r1, r2;..  asser
1e760 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53  t( jumpIfNull==S
1e770 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1e780 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d   || jumpIfNull==
1e790 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
1e7a0 28 76 3d 3d 30 29 20 29 20 20 20 20 20 72 65 74  (v==0) )     ret
1e7b0 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73 74 65 6e  urn;  /* Existen
1e7c0 63 65 20 6f 66 20 56 44 42 45 20 63 68 65 63 6b  ce of VDBE check
1e7d0 65 64 20 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a  ed by caller */.
1e7e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78 70    if( NEVER(pExp
1e7f0 72 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  r==0) ) return; 
1e800 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68 69 73 20   /* No way this 
1e810 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20  can happen */.  
1e820 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
1e830 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e840 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
1e850 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
1e860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1e870 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
1e880 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e890 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1e8a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1e8b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1e8c0 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 6a 75  pr->pLeft, d2,ju
1e8d0 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49 54 45 5f  mpIfNull^SQLITE_
1e8e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
1e8f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1e900 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
1e910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1e920 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
1e930 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
1e940 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1e950 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e960 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e970 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73  (v, d2);.      s
1e980 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1e990 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1e9a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e9b0 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
1e9c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e9d0 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
1e9e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1e9f0 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
1ea00 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ea10 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
1ea20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ea30 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
1ea40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1ea50 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
1ea60 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
1ea70 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
1ea80 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
1ea90 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
1eaa0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
1eab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1eac0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
1ead0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1eae0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1eaf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eb00 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
1eb10 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1eb20 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1eb30 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
1eb40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1eb50 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
1eb60 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
1eb70 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
1eb80 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
1eb90 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
1eba0 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
1ebb0 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
1ebc0 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
1ebd0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r1 = sqlite3Exp
1ebe0 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65  rCodeTemp(pParse
1ebf0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1ec00 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20  &regFree1);.    
1ec10 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78    r2 = sqlite3Ex
1ec20 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
1ec30 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1ec40 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20  , &regFree2);.  
1ec50 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
1ec60 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1ec70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
1ec80 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
1ec90 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
1eca0 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  2, dest, jumpIfN
1ecb0 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ull);.      asse
1ecc0 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 29  rt(TK_LT==OP_Lt)
1ecd0 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
1ece0 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Lt); VdbeCover
1ecf0 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c  ageIf(v,op==OP_L
1ed00 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
1ed10 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 29 3b 20  (TK_LE==OP_Le); 
1ed20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
1ed30 4c 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Le); VdbeCoverag
1ed40 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4c 65 29  eIf(v,op==OP_Le)
1ed50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
1ed60 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b 20 74 65  K_GT==OP_Gt); te
1ed70 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 74  stcase(op==OP_Gt
1ed80 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
1ed90 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74 29 3b 0a  f(v,op==OP_Gt);.
1eda0 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
1edb0 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74 65 73 74  GE==OP_Ge); test
1edc0 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47 65 29 3b  case(op==OP_Ge);
1edd0 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
1ede0 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b 0a 20 20  v,op==OP_Ge);.  
1edf0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 45 51      assert(TK_EQ
1ee00 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73 74 63 61  ==OP_Eq); testca
1ee10 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29 3b 20 56  se(op==OP_Eq); V
1ee20 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1ee30 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20 20 20 20  op==OP_Eq);.    
1ee40 20 20 61 73 73 65 72 74 28 54 4b 5f 4e 45 3d 3d    assert(TK_NE==
1ee50 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63 61 73 65  OP_Ne); testcase
1ee60 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20 56 64 62  (op==OP_Ne); Vdb
1ee70 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
1ee80 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20 20 20 20  ==OP_Ne);.      
1ee90 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1eea0 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
1eeb0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
1eec0 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
1eed0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1eee0 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63  ase TK_IS:.    c
1eef0 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a  ase TK_ISNOT: {.
1ef00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ef10 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
1ef20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ef30 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20  =TK_ISNOT );.   
1ef40 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1ef50 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1ef60 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
1ef70 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1ef80 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
1ef90 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1efa0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
1efb0 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ht, &regFree2);.
1efc0 20 20 20 20 20 20 6f 70 20 3d 20 28 6f 70 3d 3d        op = (op==
1efd0 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45 51 20 3a  TK_IS) ? TK_EQ :
1efe0 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20 20 63 6f   TK_NE;.      co
1eff0 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
1f000 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
1f010 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
1f020 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
1f030 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
1f040 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  t, SQLITE_NULLEQ
1f050 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
1f060 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
1f070 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62  K_EQ);.      Vdb
1f080 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
1f090 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20  p==TK_NE);.     
1f0a0 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
1f0b0 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee1==0 );.      
1f0c0 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f0d0 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e2==0 );.      b
1f0e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f0f0 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
1f100 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
1f110 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ULL: {.      ass
1f120 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d  ert( TK_ISNULL==
1f130 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74  OP_IsNull );   t
1f140 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
1f150 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  ISNULL );.      
1f160 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
1f170 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
1f180 3b 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d  ; testcase( op==
1f190 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20  TK_NOTNULL );.  
1f1a0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1f1b0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1f1c0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f1d0 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1f1e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1f1f0 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31  AddOp2(v, op, r1
1f200 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 56  , dest);.      V
1f210 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
1f220 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 29 3b   op==TK_ISNULL);
1f230 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
1f240 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f  ageIf(v, op==TK_
1f250 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  NOTNULL);.      
1f260 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
1f270 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  e1==0 );.      b
1f280 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f290 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
1f2a0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1f2b0 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  e( jumpIfNull==0
1f2c0 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f   );.      exprCo
1f2d0 64 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65  deBetween(pParse
1f2e0 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 31  , pExpr, dest, 1
1f2f0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
1f300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f310 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1f320 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1f330 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1f340 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
1f350 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
1f360 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1f370 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
1f380 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70 49 66 4e  IfNull = jumpIfN
1f390 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 64 65 73  ull ? dest : des
1f3a0 74 49 66 46 61 6c 73 65 3b 0a 20 20 20 20 20 20  tIfFalse;.      
1f3b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
1f3c0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
1f3d0 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 64 65   destIfFalse, de
1f3e0 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  stIfNull);.     
1f3f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1f400 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1f410 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
1f420 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1f430 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66  eLabel(v, destIf
1f440 46 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 62 72  False);.      br
1f450 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1f460 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
1f470 0a 20 20 20 20 20 20 69 66 28 20 65 78 70 72 41  .      if( exprA
1f480 6c 77 61 79 73 54 72 75 65 28 70 45 78 70 72 29  lwaysTrue(pExpr)
1f490 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f4a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f4b0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
1f4c0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
1f4d0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
1f4e0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
1f4f0 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 2a        /* No-op *
1f500 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
1f510 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69         r1 = sqli
1f520 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f530 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
1f540 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20  regFree1);.     
1f550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f560 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp3(v, OP_If, r
1f570 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  1, dest, jumpIfN
1f580 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  ull!=0);.       
1f590 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1f5a0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f5b0 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
1f5c0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1f5d0 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1f5e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
1f5f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f600 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
1f610 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
1f620 72 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a  rse, regFree1);.
1f630 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1f640 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1f650 72 65 67 46 72 65 65 32 29 3b 20 20 0a 7d 0a 0a  regFree2);  .}..
1f660 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1f670 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
1f680 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
1f690 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
1f6a0 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
1f6b0 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
1f6c0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1f6d0 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
1f6e0 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
1f6f0 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
1f700 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
1f710 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
1f720 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
1f730 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
1f740 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
1f750 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
1f760 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
1f770 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 53 51 4c  umpIfNull is SQL
1f780 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20 6f  ITE_JUMPIFNULL o
1f790 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
1f7a0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a 2a 2a 20  f jumpIfNull.** 
1f7b0 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  is 0..*/.void sq
1f7c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1f7d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f7e0 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
1f7f0 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
1f800 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
1f810 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1f820 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
1f830 0a 20 20 69 6e 74 20 72 65 67 46 72 65 65 31 20  .  int regFree1 
1f840 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1f850 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee2 = 0;.  int r
1f860 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73 65 72 74  1, r2;..  assert
1f870 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 53 51  ( jumpIfNull==SQ
1f880 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 20  LITE_JUMPIFNULL 
1f890 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30  || jumpIfNull==0
1f8a0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
1f8b0 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
1f8c0 2f 2a 20 45 78 69 73 74 65 6e 63 65 20 6f 66 20  /* Existence of 
1f8d0 56 44 42 45 20 63 68 65 63 6b 65 64 20 62 79 20  VDBE checked by 
1f8e0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  caller */.  if( 
1f8f0 70 45 78 70 72 3d 3d 30 20 29 20 20 20 20 72 65  pExpr==0 )    re
1f900 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
1f910 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
1f920 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
1f930 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
1f940 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1f950 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
1f960 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
1f970 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
1f980 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1f990 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
1f9a0 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
1f9b0 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
1f9c0 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
1f9d0 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
1f9e0 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
1f9f0 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
1fa00 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
1fa10 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
1fa20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
1fa30 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
1fa40 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
1fa50 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
1fa70 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
1fa80 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
1fa90 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
1faa0 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
1fab0 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
1fac0 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
1fad0 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
1fae0 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
1faf0 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
1fb00 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
1fb10 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
1fb20 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
1fb30 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
1fb40 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
1fb50 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
1fb60 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
1fb70 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
1fb80 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
1fb90 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
1fba0 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
1fbb0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
1fbc0 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
1fbd0 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
1fbe0 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
1fbf0 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
1fc00 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
1fc10 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
1fc20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
1fc30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
1fc40 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
1fc50 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
1fc60 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
1fc70 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
1fc80 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
1fc90 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
1fca0 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
1fcb0 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
1fcc0 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
1fcd0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
1fce0 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
1fcf0 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
1fd00 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
1fd10 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
1fd20 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
1fd30 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
1fd40 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
1fd50 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
1fd60 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
1fd70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
1fd80 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
1fd90 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
1fda0 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
1fdb0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
1fdc0 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 74 65  _AND: {.      te
1fdd0 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1fde0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ll==0 );.      s
1fdf0 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1fe00 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1fe10 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75  >pLeft, dest, ju
1fe20 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1fe30 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1fe40 65 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20  ePush(pParse);. 
1fe50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1fe60 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1fe70 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
1fe80 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
1fe90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fea0 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
1feb0 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  se);.      break
1fec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fed0 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
1fee0 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
1fef0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1ff00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ff10 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
1ff20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ff30 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1ff40 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
1ff50 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 5e   d2, jumpIfNull^
1ff60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1ff70 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  L);.      sqlite
1ff80 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
1ff90 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
1ffa0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1ffb0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
1ffc0 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
1ffd0 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
1ffe0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1fff0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b  lveLabel(v, d2);
20000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
20010 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72 73  prCachePop(pPars
20020 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
20030 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20040 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
20050 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66  testcase( jumpIf
20060 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Null==0 );.     
20070 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
20080 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
20090 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
200a0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
200b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
200c0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
200d0 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
200e0 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
200f0 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
20100 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
20110 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
20120 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20130 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20140 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
20150 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
20160 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
20170 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
20180 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
20190 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
201a0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
201b0 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
201c0 65 32 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  e2);.      codeC
201d0 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
201e0 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
201f0 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a  pr->pRight, op,.
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20210 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20    r1, r2, dest, 
20220 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
20230 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d     assert(TK_LT=
20240 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73  =OP_Lt); testcas
20250 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64  e(op==OP_Lt); Vd
20260 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f  beCoverageIf(v,o
20270 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20  p==OP_Lt);.     
20280 20 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f   assert(TK_LE==O
20290 50 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28  P_Le); testcase(
202a0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65  op==OP_Le); Vdbe
202b0 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d  CoverageIf(v,op=
202c0 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61  =OP_Le);.      a
202d0 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f  ssert(TK_GT==OP_
202e0 47 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Gt); testcase(op
202f0 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f  ==OP_Gt); VdbeCo
20300 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
20310 50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Gt);.      ass
20320 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65  ert(TK_GE==OP_Ge
20330 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
20340 4f 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Ge); VdbeCove
20350 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
20360 47 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Ge);.      asser
20370 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b  t(TK_EQ==OP_Eq);
20380 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
20390 5f 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Eq); VdbeCovera
203a0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71  geIf(v,op==OP_Eq
203b0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
203c0 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74  TK_NE==OP_Ne); t
203d0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e  estcase(op==OP_N
203e0 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
203f0 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b  If(v,op==OP_Ne);
20400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20410 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
20420 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20430 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20  regFree2==0 );. 
20440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20450 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
20460 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  :.    case TK_IS
20470 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  NOT: {.      tes
20480 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
20490 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20  ==TK_IS );.     
204a0 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
204b0 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29  ->op==TK_ISNOT )
204c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
204d0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
204e0 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
204f0 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31  pLeft, &regFree1
20500 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
20510 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
20520 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
20530 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72 65  >pRight, &regFre
20540 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20  e2);.      op = 
20550 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  (pExpr->op==TK_I
20560 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f  S) ? TK_NE : TK_
20570 45 51 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  EQ;.      codeCo
20580 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
20590 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
205a0 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20  r->pRight, op,. 
205b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205c0 20 72 31 2c 20 72 32 2c 20 64 65 73 74 2c 20 53   r1, r2, dest, S
205d0 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
205e0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
205f0 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51  eIf(v, op==TK_EQ
20600 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
20610 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
20620 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20 74 65 73  K_NE);.      tes
20630 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
20640 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =0 );.      test
20650 63 61 73 65 28 20 72 65 67 46 72 65 65 32 3d 3d  case( regFree2==
20660 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20680 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
20690 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
206a0 20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71   {.      r1 = sq
206b0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
206c0 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
206d0 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
206e0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
206f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f  3VdbeAddOp2(v, o
20700 70 2c 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20  p, r1, dest);.  
20710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
20720 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 20 20  ==TK_ISNULL );  
20730 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
20740 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
20750 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20760 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c  e( op==TK_NOTNUL
20770 4c 20 29 3b 20 20 56 64 62 65 43 6f 76 65 72 61  L );  VdbeCovera
20780 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e  geIf(v, op==TK_N
20790 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74  OTNULL);.      t
207a0 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
207b0 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  1==0 );.      br
207c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
207d0 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
207e0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
207f0 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20  ( jumpIfNull==0 
20800 29 3b 0a 20 20 20 20 20 20 65 78 70 72 43 6f 64  );.      exprCod
20810 65 42 65 74 77 65 65 6e 28 70 50 61 72 73 65 2c  eBetween(pParse,
20820 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 30 2c   pExpr, dest, 0,
20830 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20860 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
20870 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
20880 20 20 20 20 20 20 69 66 28 20 6a 75 6d 70 49 66        if( jumpIf
20890 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
208a0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
208b0 4e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  N(pParse, pExpr,
208c0 20 64 65 73 74 2c 20 64 65 73 74 29 3b 0a 20 20   dest, dest);.  
208d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208e0 20 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75 6c     int destIfNul
208f0 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  l = sqlite3VdbeM
20900 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
20910 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20920 43 6f 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70  CodeIN(pParse, p
20930 45 78 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74  Expr, dest, dest
20940 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  IfNull);.       
20950 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
20960 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73 74  lveLabel(v, dest
20970 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 7d  IfNull);.      }
20980 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20990 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
209a0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
209b0 69 66 28 20 65 78 70 72 41 6c 77 61 79 73 46 61  if( exprAlwaysFa
209c0 6c 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20  lse(pExpr) ){.  
209d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
209e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
209f0 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
20a00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 78      }else if( ex
20a10 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
20a20 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  pr) ){.        /
20a30 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
20a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20a50 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
20a60 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
20a70 20 70 45 78 70 72 2c 20 26 72 65 67 46 72 65 65   pExpr, &regFree
20a80 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
20a90 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
20aa0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31 2c 20 64   OP_IfNot, r1, d
20ab0 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 21  est, jumpIfNull!
20ac0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  =0);.        Vdb
20ad0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
20ae0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20af0 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
20b00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20b10 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29   jumpIfNull==0 )
20b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20b30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
20b40 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
20b50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
20b60 20 72 65 67 46 72 65 65 31 29 3b 0a 20 20 73 71   regFree1);.  sq
20b70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
20b80 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
20b90 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ree2);.}../*.** 
20ba0 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61 72  Do a deep compar
20bb0 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70 72  ison of two expr
20bc0 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20 52  ession trees.  R
20bd0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74  eturn 0 if the t
20be0 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  wo.** expression
20bf0 73 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c 79  s are completely
20c00 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 52 65 74   identical.  Ret
20c10 75 72 6e 20 31 20 69 66 20 74 68 65 79 20 64 69  urn 1 if they di
20c20 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20 62 79 20  ffer only.** by 
20c30 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  a COLLATE operat
20c40 6f 72 20 61 74 20 74 68 65 20 74 6f 70 20 6c 65  or at the top le
20c50 76 65 6c 2e 20 20 52 65 74 75 72 6e 20 32 20 69  vel.  Return 2 i
20c60 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
20c70 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74 68 65 72  erences.** other
20c80 20 74 68 61 6e 20 74 68 65 20 74 6f 70 2d 6c 65   than the top-le
20c90 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72  vel COLLATE oper
20ca0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ator..**.** If a
20cb0 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66  ny subelement of
20cc0 20 70 42 20 68 61 73 20 45 78 70 72 2e 69 54 61   pB has Expr.iTa
20cd0 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69  ble==(-1) then i
20ce0 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  t is allowed.** 
20cf0 74 6f 20 63 6f 6d 70 61 72 65 20 65 71 75 61 6c  to compare equal
20d00 20 74 6f 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   to an equivalen
20d10 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20  t element in pA 
20d20 77 69 74 68 20 45 78 70 72 2e 69 54 61 62 6c 65  with Expr.iTable
20d30 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68  ==iTab..**.** Th
20d40 65 20 70 41 20 73 69 64 65 20 6d 69 67 68 74 20  e pA side might 
20d50 62 65 20 75 73 69 6e 67 20 54 4b 5f 52 45 47 49  be using TK_REGI
20d60 53 54 45 52 2e 20 20 49 66 20 74 68 61 74 20 69  STER.  If that i
20d70 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 70  s the case and p
20d80 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75 73 69 6e  B is.** not usin
20d90 67 20 54 4b 5f 52 45 47 49 53 54 45 52 20 62 75  g TK_REGISTER bu
20da0 74 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 65  t is otherwise e
20db0 71 75 69 76 61 6c 65 6e 74 2c 20 74 68 65 6e 20  quivalent, then 
20dc0 73 74 69 6c 6c 20 72 65 74 75 72 6e 20 30 2e 0a  still return 0..
20dd0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
20de0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
20df0 6c 20 72 65 74 75 72 6e 20 32 20 65 76 65 6e 20  l return 2 even 
20e00 69 66 20 74 68 65 20 74 77 6f 20 65 78 70 72 65  if the two expre
20e10 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61 6c 6c 79  ssions.** really
20e20 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   are equivalent.
20e30 20 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 70    If we cannot p
20e40 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 65 78  rove that the ex
20e50 70 72 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a  pressions are.**
20e60 20 69 64 65 6e 74 69 63 61 6c 2c 20 77 65 20 72   identical, we r
20e70 65 74 75 72 6e 20 32 20 6a 75 73 74 20 74 6f 20  eturn 2 just to 
20e80 62 65 20 73 61 66 65 2e 20 20 53 6f 20 69 66 20  be safe.  So if 
20e90 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
20ea0 72 65 74 75 72 6e 73 20 32 2c 20 74 68 65 6e 20  returns 2, then 
20eb0 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c  you do not reall
20ec0 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65 72 74 61  y know for certa
20ed0 69 6e 20 69 66 20 74 68 65 20 74 77 6f 0a 2a 2a  in if the two.**
20ee0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
20ef0 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20   the same.  But 
20f00 69 66 20 79 6f 75 20 67 65 74 20 61 20 30 20 6f  if you get a 0 o
20f10 72 20 31 20 72 65 74 75 72 6e 2c 20 74 68 65 6e  r 1 return, then
20f20 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62 65 20 73   you.** can be s
20f30 75 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ure the expressi
20f40 6f 6e 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ons are the same
20f50 2e 20 20 49 6e 20 74 68 65 20 70 6c 61 63 65 73  .  In the places
20f60 20 77 68 65 72 65 0a 2a 2a 20 74 68 69 73 20 72   where.** this r
20f70 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 2c 20  outine is used, 
20f80 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
20f90 20 74 6f 20 67 65 74 20 61 6e 20 65 78 74 72 61   to get an extra
20fa0 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20 6a 75 73   2 - that.** jus
20fb0 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69  t might result i
20fc0 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74 6c 79 20  n some slightly 
20fd0 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20 20 42 75  slower code.  Bu
20fe0 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  t returning.** a
20ff0 6e 20 69 6e 63 6f 72 72 65 63 74 20 30 20 6f 72  n incorrect 0 or
21000 20 31 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f   1 could lead to
21010 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 2e 0a   a malfunction..
21020 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
21030 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
21040 70 41 2c 20 45 78 70 72 20 2a 70 42 2c 20 69 6e  pA, Expr *pB, in
21050 74 20 69 54 61 62 29 7b 0a 20 20 75 33 32 20 63  t iTab){.  u32 c
21060 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b 0a 20 20  ombinedFlags;.  
21070 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d  if( pA==0 || pB=
21080 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
21090 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a 20 32 3b   pB==pA ? 0 : 2;
210a0 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e 65 64 46  .  }.  combinedF
210b0 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c 61 67 73  lags = pA->flags
210c0 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b 0a 20 20   | pB->flags;.  
210d0 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67  if( combinedFlag
210e0 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  s & EP_IntValue 
210f0 29 7b 0a 20 20 20 20 69 66 28 20 28 70 41 2d 3e  ){.    if( (pA->
21100 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61 67 73 26  flags&pB->flags&
21110 45 50 5f 49 6e 74 56 61 6c 75 65 29 21 3d 30 20  EP_IntValue)!=0 
21120 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c 75 65 3d  && pA->u.iValue=
21130 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65 20 29 7b  =pB->u.iValue ){
21140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21150 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
21160 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 2;.  }.  if( p
21170 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 7b  A->op!=pB->op ){
21180 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 6f 70 3d  .    if( pA->op=
21190 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 73  =TK_COLLATE && s
211a0 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
211b0 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2c  e(pA->pLeft, pB,
211c0 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20 20   iTab)<2 ){.    
211d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
211e0 7d 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 6f 70  }.    if( pB->op
211f0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20  ==TK_COLLATE && 
21200 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
21210 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c 65 66 74  re(pA, pB->pLeft
21220 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20 20 20  , iTab)<2 ){.   
21230 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
21240 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b   }.    return 2;
21250 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f  .  }.  if( pA->o
21260 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
21270 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70 21 3d 54  ALWAYS(pA->op!=T
21280 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
21290 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b   pA->u.zToken ){
212a0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
212b0 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 70 42 2d  pA->u.zToken,pB-
212c0 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30 20 29 7b  >u.zToken)!=0 ){
212d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
212e0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
212f0 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20 20 7d 0a   ? 1 : 2;.    }.
21300 20 20 7d 0a 20 20 69 66 28 20 28 70 41 2d 3e 66    }.  if( (pA->f
21310 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
21320 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61 67 73 20  ct)!=(pB->flags 
21330 26 20 45 50 5f 44 69 73 74 69 6e 63 74 29 20 29  & EP_Distinct) )
21340 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69 66 28   return 2;.  if(
21350 20 41 4c 57 41 59 53 28 28 63 6f 6d 62 69 6e 65   ALWAYS((combine
21360 64 46 6c 61 67 73 20 26 20 45 50 5f 54 6f 6b 65  dFlags & EP_Toke
21370 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b 0a 20 20  nOnly)==0) ){.  
21380 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46 6c    if( combinedFl
21390 61 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65  ags & EP_xIsSele
213a0 63 74 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  ct ) return 2;. 
213b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
213c0 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
213d0 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 2c 20  eft, pB->pLeft, 
213e0 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
213f0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21400 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
21410 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69  >pRight, pB->pRi
21420 67 68 74 2c 20 69 54 61 62 29 20 29 20 72 65 74  ght, iTab) ) ret
21430 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73  urn 2;.    if( s
21440 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
21450 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70 4c 69 73  mpare(pA->x.pLis
21460 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73 74 2c 20  t, pB->x.pList, 
21470 69 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 32  iTab) ) return 2
21480 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  ;.    if( ALWAYS
21490 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 20  ((combinedFlags 
214a0 26 20 45 50 5f 52 65 64 75 63 65 64 29 3d 3d 30  & EP_Reduced)==0
214b0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
214c0 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e  A->iColumn!=pB->
214d0 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e  iColumn ) return
214e0 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   2;.      if( pA
214f0 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
21500 61 62 6c 65 20 0a 20 20 20 20 20 20 20 26 26 20  able .       && 
21510 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d 69 54 61  (pA->iTable!=iTa
21520 62 20 7c 7c 20 4e 45 56 45 52 28 70 42 2d 3e 69  b || NEVER(pB->i
21530 54 61 62 6c 65 3e 3d 30 29 29 20 29 20 72 65 74  Table>=0)) ) ret
21540 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 2;.    }.  }
21550 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21560 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
21570 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
21580 74 73 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ts.  Return 0 if
21590 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
215a0 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e 6f 6e 2d  cal and .** non-
215b0 7a 65 72 6f 20 69 66 20 74 68 65 79 20 64 69 66  zero if they dif
215c0 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
215d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 73 75 62  **.** If any sub
215e0 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42 20 68 61  element of pB ha
215f0 73 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 28  s Expr.iTable==(
21600 2d 31 29 20 74 68 65 6e 20 69 74 20 69 73 20 61  -1) then it is a
21610 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 63 6f 6d  llowed.** to com
21620 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 61 6e  pare equal to an
21630 20 65 71 75 69 76 61 6c 65 6e 74 20 65 6c 65 6d   equivalent elem
21640 65 6e 74 20 69 6e 20 70 41 20 77 69 74 68 20 45  ent in pA with E
21650 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69 54 61 62  xpr.iTable==iTab
21660 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21670 74 69 6e 65 20 6d 69 67 68 74 20 72 65 74 75 72  tine might retur
21680 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 65  n non-zero for e
21690 71 75 69 76 61 6c 65 6e 74 20 45 78 70 72 4c 69  quivalent ExprLi
216a0 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20 6f 6e 6c  sts.  The.** onl
216b0 79 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 77 69  y consequence wi
216c0 6c 6c 20 62 65 20 64 69 73 61 62 6c 65 64 20 6f  ll be disabled o
216d0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20 20 42  ptimizations.  B
216e0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ut this routine.
216f0 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72 20 72 65  ** must never re
21700 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
21710 6f 20 45 78 70 72 4c 69 73 74 20 6f 62 6a 65 63  o ExprList objec
21720 74 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  ts are different
21730 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c 66 75 6e  , or.** a malfun
21740 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ction will resul
21750 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  t..**.** Two NUL
21760 4c 20 70 6f 69 6e 74 65 72 73 20 61 72 65 20 63  L pointers are c
21770 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
21780 74 68 65 20 73 61 6d 65 2e 20 20 42 75 74 20 61  the same.  But a
21790 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 0a 2a 2a   NULL pointer.**
217a0 20 61 6c 77 61 79 73 20 64 69 66 66 65 72 73 20   always differs 
217b0 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  from a non-NULL 
217c0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
217d0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
217e0 6f 6d 70 61 72 65 28 45 78 70 72 4c 69 73 74 20  ompare(ExprList 
217f0 2a 70 41 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *pA, ExprList *p
21800 42 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  B, int iTab){.  
21810 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
21820 3d 30 20 26 26 20 70 42 3d 3d 30 20 29 20 72 65  =0 && pB==0 ) re
21830 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
21840 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20 29 20 72  ==0 || pB==0 ) r
21850 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
21860 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 6e 45  A->nExpr!=pB->nE
21870 78 70 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  xpr ) return 1;.
21880 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
21890 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
218a0 20 20 45 78 70 72 20 2a 70 45 78 70 72 41 20 3d    Expr *pExprA =
218b0 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b   pA->a[i].pExpr;
218c0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
218d0 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e 70 45 78  B = pB->a[i].pEx
218e0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e  pr;.    if( pA->
218f0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 21 3d  a[i].sortOrder!=
21900 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  pB->a[i].sortOrd
21910 65 72 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  er ) return 1;. 
21920 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
21930 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72 41  prCompare(pExprA
21940 2c 20 70 45 78 70 72 42 2c 20 69 54 61 62 29 20  , pExprB, iTab) 
21950 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
21960 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
21970 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
21980 20 69 66 20 77 65 20 63 61 6e 20 70 72 6f 76 65   if we can prove
21990 20 74 68 65 20 70 45 32 20 77 69 6c 6c 20 61 6c   the pE2 will al
219a0 77 61 79 73 20 62 65 20 74 72 75 65 20 69 66 20  ways be true if 
219b0 70 45 31 20 69 73 0a 2a 2a 20 74 72 75 65 2e 20  pE1 is.** true. 
219c0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
219d0 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6d 70 6c   we cannot compl
219e0 65 74 65 20 74 68 65 20 70 72 6f 6f 66 20 6f 72  ete the proof or
219f0 20 69 66 20 70 45 32 20 6d 69 67 68 74 0a 2a 2a   if pE2 might.**
21a00 20 62 65 20 66 61 6c 73 65 2e 20 20 45 78 61 6d   be false.  Exam
21a10 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
21a20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE1: x==5       
21a30 70 45 32 3a 20 78 3d 3d 35 20 20 20 20 20 20 20  pE2: x==5       
21a40 20 20 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72        Result: tr
21a50 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78  ue.**     pE1: x
21a60 3e 30 20 20 20 20 20 20 20 20 70 45 32 3a 20 78  >0        pE2: x
21a70 3d 3d 35 20 20 20 20 20 20 20 20 20 20 20 20 20  ==5             
21a80 52 65 73 75 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a  Result: false.**
21a90 20 20 20 20 20 70 45 31 3a 20 78 3d 32 31 20 20       pE1: x=21  
21aa0 20 20 20 20 20 70 45 32 3a 20 78 3d 32 31 20 4f       pE2: x=21 O
21ab0 52 20 79 3d 34 33 20 20 20 20 20 52 65 73 75 6c  R y=43     Resul
21ac0 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70  t: true.**     p
21ad0 45 31 3a 20 78 21 3d 31 32 33 20 20 20 20 20 70  E1: x!=123     p
21ae0 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c  E2: x IS NOT NUL
21af0 4c 20 20 20 20 52 65 73 75 6c 74 3a 20 74 72 75  L    Result: tru
21b00 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 21  e.**     pE1: x!
21b10 3d 3f 31 20 20 20 20 20 20 70 45 32 3a 20 78 20  =?1      pE2: x 
21b20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52  IS NOT NULL    R
21b30 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20  esult: true.**  
21b40 20 20 20 70 45 31 3a 20 78 20 49 53 20 4e 55 4c     pE1: x IS NUL
21b50 4c 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54  L  pE2: x IS NOT
21b60 20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a   NULL    Result:
21b70 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20 20 70 45   false.**     pE
21b80 31 3a 20 78 20 49 53 20 3f 32 20 20 20 20 70 45  1: x IS ?2    pE
21b90 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  2: x IS NOT NULL
21ba0 20 20 20 20 52 65 75 73 6c 74 3a 20 66 61 6c 73      Reuslt: fals
21bb0 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 63 6f 6d  e.**.** When com
21bc0 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c 55 4d 4e  paring TK_COLUMN
21bd0 20 6e 6f 64 65 73 20 62 65 74 77 65 65 6e 20 70   nodes between p
21be0 45 31 20 61 6e 64 20 70 45 32 2c 20 69 66 20 70  E1 and pE2, if p
21bf0 45 32 20 68 61 73 0a 2a 2a 20 45 78 70 72 2e 69  E2 has.** Expr.i
21c00 54 61 62 6c 65 3c 30 20 74 68 65 6e 20 61 73 73  Table<0 then ass
21c10 75 6d 65 20 61 20 74 61 62 6c 65 20 6e 75 6d 62  ume a table numb
21c20 65 72 20 67 69 76 65 6e 20 62 79 20 69 54 61 62  er given by iTab
21c30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 69 6e 20  ..**.** When in 
21c40 64 6f 75 62 74 2c 20 72 65 74 75 72 6e 20 66 61  doubt, return fa
21c50 6c 73 65 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  lse.  Returning 
21c60 74 72 75 65 20 6d 69 67 68 74 20 67 69 76 65 20  true might give 
21c70 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  a performance.**
21c80 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 20 20 52   improvement.  R
21c90 65 74 75 72 6e 69 6e 67 20 66 61 6c 73 65 20 6d  eturning false m
21ca0 69 67 68 74 20 63 61 75 73 65 20 61 20 70 65 72  ight cause a per
21cb0 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
21cc0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74 20 77 69  on, but.** it wi
21cd0 6c 6c 20 61 6c 77 61 79 73 20 67 69 76 65 20 74  ll always give t
21ce0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
21cf0 72 20 61 6e 64 20 69 73 20 68 65 6e 63 65 20 61  r and is hence a
21d00 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a 2f 0a 69  lways safe..*/.i
21d10 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  nt sqlite3ExprIm
21d20 70 6c 69 65 73 45 78 70 72 28 45 78 70 72 20 2a  pliesExpr(Expr *
21d30 70 45 31 2c 20 45 78 70 72 20 2a 70 45 32 2c 20  pE1, Expr *pE2, 
21d40 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 69 66 28  int iTab){.  if(
21d50 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
21d60 61 72 65 28 70 45 31 2c 20 70 45 32 2c 20 69 54  are(pE1, pE2, iT
21d70 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ab)==0 ){.    re
21d80 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
21d90 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  ( pE2->op==TK_OR
21da0 0a 20 20 20 26 26 20 28 73 71 6c 69 74 65 33 45  .   && (sqlite3E
21db0 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70  xprImpliesExpr(p
21dc0 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66 74 2c 20  E1, pE2->pLeft, 
21dd0 69 54 61 62 29 0a 20 20 20 20 20 20 20 20 20 20  iTab).          
21de0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70     || sqlite3Exp
21df0 72 49 6d 70 6c 69 65 73 45 78 70 72 28 70 45 31  rImpliesExpr(pE1
21e00 2c 20 70 45 32 2d 3e 70 52 69 67 68 74 2c 20 69  , pE2->pRight, i
21e10 54 61 62 29 20 29 0a 20 20 29 7b 0a 20 20 20 20  Tab) ).  ){.    
21e20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
21e30 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b 5f  if( pE2->op==TK_
21e40 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26 20 73 71  NOTNULL.   && sq
21e50 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
21e60 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20 70 45 32  (pE1->pLeft, pE2
21e70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 29 3d 3d  ->pLeft, iTab)==
21e80 30 0a 20 20 20 26 26 20 28 70 45 31 2d 3e 6f 70  0.   && (pE1->op
21e90 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26 26 20 70  !=TK_ISNULL && p
21ea0 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53 29 0a 20  E1->op!=TK_IS). 
21eb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
21ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
21ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  ;.}../*.** An in
21ee0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
21ef0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
21f00 65 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  e is used by the
21f10 20 74 72 65 65 20 77 61 6c 6b 65 72 0a 2a 2a 20   tree walker.** 
21f20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65 72 65 6e  to count referen
21f30 63 65 73 20 74 6f 20 74 61 62 6c 65 20 63 6f 6c  ces to table col
21f40 75 6d 6e 73 20 69 6e 20 74 68 65 20 61 72 67 75  umns in the argu
21f50 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a 2a 2a 20  ments of an .** 
21f60 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
21f70 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  on, in order to 
21f80 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 0a 2a 2a  implement the.**
21f90 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e   sqlite3Function
21fa0 54 68 69 73 53 72 63 28 29 20 72 6f 75 74 69 6e  ThisSrc() routin
21fb0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 72 63  e..*/.struct Src
21fc0 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63 4c 69 73  Count {.  SrcLis
21fd0 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 4f 6e  t *pSrc;   /* On
21fe0 65 20 70 61 72 74 69 63 75 6c 61 72 20 46 52 4f  e particular FRO
21ff0 4d 20 63 6c 61 75 73 65 20 69 6e 20 61 20 6e 65  M clause in a ne
22000 73 74 65 64 20 71 75 65 72 79 20 2a 2f 0a 20 20  sted query */.  
22010 69 6e 74 20 6e 54 68 69 73 3b 20 20 20 20 20 20  int nThis;      
22020 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
22030 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
22040 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  mns in pSrcList 
22050 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68 65 72 3b  */.  int nOther;
22060 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22070 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22080 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f 74 68 65   columns in othe
22090 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 2a  r FROM clauses *
220a0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  /.};../*.** Coun
220b0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
220c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f  references to co
220d0 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
220e0 20 69 6e 74 20 65 78 70 72 53 72 63 43 6f 75 6e   int exprSrcCoun
220f0 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
22100 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
22110 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56 45 52 28  .  /* The NEVER(
22120 29 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  ) on the second 
22130 74 65 72 6d 20 69 73 20 62 65 63 61 75 73 65 20  term is because 
22140 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
22150 73 65 73 54 68 69 73 53 72 63 28 29 0a 20 20 2a  sesThisSrc().  *
22160 2a 20 69 73 20 61 6c 77 61 79 73 20 63 61 6c 6c  * is always call
22170 65 64 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  ed before sqlite
22180 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
22190 65 67 61 74 65 73 28 29 20 61 6e 64 20 73 6f 20  egates() and so 
221a0 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43 4f 4c 55  the.  ** TK_COLU
221b0 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74  MNs have not yet
221c0 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
221d0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
221e0 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20 73 71 6c  MN.  If.  ** sql
221f0 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
22200 54 68 69 73 53 72 63 28 29 20 69 73 20 75 73 65  ThisSrc() is use
22210 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 69 6e  d differently in
22220 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 65   the future, the
22230 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29 20 77 69  .  ** NEVER() wi
22240 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  ll need to be re
22250 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  moved. */.  if( 
22260 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
22270 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52 28 70 45  LUMN || NEVER(pE
22280 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
22290 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20 20 20 69  COLUMN) ){.    i
222a0 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63 74  nt i;.    struct
222b0 20 53 72 63 43 6f 75 6e 74 20 2a 70 20 3d 20 70   SrcCount *p = p
222c0 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72 63 43 6f  Walker->u.pSrcCo
222d0 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74  unt;.    SrcList
222e0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
222f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22300 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
22310 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ){.      if( pEx
22320 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 72 63  pr->iTable==pSrc
22330 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29  ->a[i].iCursor )
22340 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22350 20 20 69 66 28 20 69 3c 70 53 72 63 2d 3e 6e 53    if( i<pSrc->nS
22360 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  rc ){.      p->n
22370 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  This++;.    }els
22380 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 74 68  e{.      p->nOth
22390 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  er++;.    }.  }.
223a0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
223b0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
223c0 44 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6e 79  Determine if any
223d0 20 6f 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   of the argument
223e0 73 20 74 6f 20 74 68 65 20 70 45 78 70 72 20 46  s to the pExpr F
223f0 75 6e 63 74 69 6f 6e 20 72 65 66 65 72 65 6e 63  unction referenc
22400 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74 2e 20 20  e.** pSrcList.  
22410 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
22420 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f 20 72 65  hey do.  Also re
22430 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
22440 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
22450 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 6f 72   no arguments or
22460 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e 73 74 61   has only consta
22470 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 52  nt arguments.  R
22480 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 70  eturn false if p
22490 45 78 70 72 0a 2a 2a 20 72 65 66 65 72 65 6e 63  Expr.** referenc
224a0 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 6e  es columns but n
224b0 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 61  ot columns of ta
224c0 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 70 53  bles found in pS
224d0 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73  rcList..*/.int s
224e0 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
224f0 65 73 54 68 69 73 53 72 63 28 45 78 70 72 20 2a  esThisSrc(Expr *
22500 70 45 78 70 72 2c 20 53 72 63 4c 69 73 74 20 2a  pExpr, SrcList *
22510 70 53 72 63 4c 69 73 74 29 7b 0a 20 20 57 61 6c  pSrcList){.  Wal
22520 6b 65 72 20 77 3b 0a 20 20 73 74 72 75 63 74 20  ker w;.  struct 
22530 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b 0a 20 20  SrcCount cnt;.  
22540 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
22550 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
22560 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ON );.  memset(&
22570 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29  w, 0, sizeof(w))
22580 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
22590 61 63 6b 20 3d 20 65 78 70 72 53 72 63 43 6f 75  ack = exprSrcCou
225a0 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72 63 43 6f  nt;.  w.u.pSrcCo
225b0 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20 20 63 6e  unt = &cnt;.  cn
225c0 74 2e 70 53 72 63 20 3d 20 70 53 72 63 4c 69 73  t.pSrc = pSrcLis
225d0 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69 73 20 3d  t;.  cnt.nThis =
225e0 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74 68 65 72   0;.  cnt.nOther
225f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 57   = 0;.  sqlite3W
22600 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 77 2c 20  alkExprList(&w, 
22610 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
22620 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 2e 6e 54  .  return cnt.nT
22630 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e 6e 4f 74  his>0 || cnt.nOt
22640 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  her==0;.}../*.**
22650 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
22660 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e  nt to the pAggIn
22670 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  fo->aCol[] array
22680 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
22690 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
226a0 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
226b0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
226c0 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
226d0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
226e0 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 43 6f  int addAggInfoCo
226f0 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  lumn(sqlite3 *db
22700 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f  , AggInfo *pInfo
22710 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49  ){.  int i;.  pI
22720 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73 71 6c 69  nfo->aCol = sqli
22730 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
22740 28 0a 20 20 20 20 20 20 20 64 62 2c 0a 20 20 20  (.       db,.   
22750 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 2c      pInfo->aCol,
22760 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  .       sizeof(p
22770 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d 29 2c 0a  Info->aCol[0]),.
22780 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d 3e 6e         &pInfo->n
22790 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 26  Column,.       &
227a0 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
227b0 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
227c0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
227d0 74 20 74 6f 20 74 68 65 20 70 41 67 67 49 6e 66  t to the pAggInf
227e0 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72 72 61 79  o->aFunc[] array
227f0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
22800 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  dex of.** the ne
22810 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52 65 74 75  w element.  Retu
22820 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
22830 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mber if malloc f
22840 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
22850 69 6e 74 20 61 64 64 41 67 67 49 6e 66 6f 46 75  int addAggInfoFu
22860 6e 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nc(sqlite3 *db, 
22870 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  AggInfo *pInfo){
22880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70 49 6e 66  .  int i;.  pInf
22890 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71 6c 69 74  o->aFunc = sqlit
228a0 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
228b0 0a 20 20 20 20 20 20 20 64 62 2c 20 0a 20 20 20  .       db, .   
228c0 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63      pInfo->aFunc
228d0 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
228e0 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 29  pInfo->aFunc[0])
228f0 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f 2d  ,.       &pInfo-
22900 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20 20 20 26  >nFunc,.       &
22910 69 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  i.  );.  return 
22920 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  i;.}    ../*.** 
22930 54 68 69 73 20 69 73 20 74 68 65 20 78 45 78 70  This is the xExp
22940 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 20  rCallback for a 
22950 74 72 65 65 20 77 61 6c 6b 65 72 2e 20 20 49 74  tree walker.  It
22960 20 69 73 20 75 73 65 64 20 74 6f 0a 2a 2a 20 69   is used to.** i
22970 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69 74 65 33  mplement sqlite3
22980 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
22990 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71  gates().  See sq
229a0 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
229b0 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f  Aggregates.** fo
229c0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
229d0 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ormation..*/.sta
229e0 74 69 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41  tic int analyzeA
229f0 67 67 72 65 67 61 74 65 28 57 61 6c 6b 65 72 20  ggregate(Walker 
22a00 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
22a10 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
22a20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
22a30 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
22a40 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  .pNC;.  Parse *p
22a50 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
22a60 72 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse;.  SrcList *
22a70 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
22a80 70 53 72 63 4c 69 73 74 3b 0a 20 20 41 67 67 49  pSrcList;.  AggI
22a90 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20 3d 20  nfo *pAggInfo = 
22aa0 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 3b 0a 0a  pNC->pAggInfo;..
22ab0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
22ac0 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
22ad0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
22ae0 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
22af0 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
22b00 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
22b10 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
22b20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
22b30 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
22b40 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 2f  OLUMN );.      /
22b50 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
22b60 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
22b70 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  in one of the ta
22b80 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
22b90 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  .      ** clause
22ba0 20 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74   of the aggregat
22bb0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
22bc0 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
22bd0 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  List!=0) ){.    
22be0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
22bf0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
22c00 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
22c10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22c20 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
22c30 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
22c40 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
22c50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
22c60 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ol;.          as
22c70 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
22c80 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
22c90 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
22ca0 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20  duced) );.      
22cb0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
22cc0 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e 69 43  Table==pItem->iC
22cd0 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
22ce0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
22cf0 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
22d00 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 70 45  it means that pE
22d10 78 70 72 20 72 65 66 65 72 73 20 74 6f 20 61 20  xpr refers to a 
22d20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
22d30 20 20 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 20    ** that is in 
22d40 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
22d50 6f 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  of the aggregate
22d60 20 71 75 65 72 79 2e 20 20 0a 20 20 20 20 20 20   query.  .      
22d70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
22d80 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20 61 6e 20       ** Make an 
22d90 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 63 6f  entry for the co
22da0 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49 6e 66 6f  lumn in pAggInfo
22db0 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74 68 65 72  ->aCol[] if ther
22dc0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
22dd0 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e 74 72 79   is not an entry
22de0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
22df0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
22e00 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
22e10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
22e20 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ol = pAggInfo->a
22e30 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
22e40 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 41 67 67   for(k=0; k<pAgg
22e50 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b  Info->nColumn; k
22e60 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
22e70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
22e80 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  Col->iTable==pEx
22e90 70 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20  pr->iTable &&.  
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  pCol->iColumn==p
22ec0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
22ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22f10 20 20 69 66 28 20 28 6b 3e 3d 70 41 67 67 49 6e    if( (k>=pAggIn
22f20 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a 20 20 20  fo->nColumn).   
22f30 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6b 20            && (k 
22f40 3d 20 61 64 64 41 67 67 49 6e 66 6f 43 6f 6c 75  = addAggInfoColu
22f50 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  mn(pParse->db, p
22f60 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20 0a 20 20  AggInfo))>=0 .  
22f70 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
22f80 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 20             pCol 
22f90 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  = &pAggInfo->aCo
22fa0 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  l[k];.          
22fb0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 20 3d      pCol->pTab =
22fc0 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20   pExpr->pTab;.  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
22fe0 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 78 70 72  ->iTable = pExpr
22ff0 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
23000 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 43          pCol->iC
23010 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
23020 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
23030 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 4d 65 6d        pCol->iMem
23040 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
23050 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
23060 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
23070 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
23080 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
23090 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
230b0 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
230c0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
230d0 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6e 3b 0a        int j, n;.
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 45 78 70 72 4c 69 73 74 20 2a 70 47 42 20 3d 20  ExprList *pGB = 
23100 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72 6f 75 70  pAggInfo->pGroup
23110 42 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  By;.            
23120 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
23130 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 20  ist_item *pTerm 
23140 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20 20 20 20  = pGB->a;.      
23150 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 47            n = pG
23160 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  B->nExpr;.      
23170 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
23180 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20 70 54 65  0; j<n; j++, pTe
23190 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  rm++){.         
231a0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
231b0 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
231c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
231d0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
231e0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 2d  TK_COLUMN && pE-
231f0 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
23200 69 54 61 62 6c 65 20 26 26 0a 20 20 20 20 20 20  iTable &&.      
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78  pE->iColumn==pEx
23230 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pr->iColumn ){. 
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72     pCol->iSorter
23260 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
23290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
232a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
232b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
232c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
232d0 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75  Col->iSorterColu
232e0 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  mn<0 ){.        
232f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53          pCol->iS
23300 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 70 41  orterColumn = pA
23310 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74 69 6e 67  ggInfo->nSorting
23320 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20  Column++;.      
23330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23350 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
23360 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  now an entry for
23370 20 70 45 78 70 72 20 69 6e 20 70 41 67 67 49 6e   pExpr in pAggIn
23380 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65 69 74 68  fo->aCol[] (eith
23390 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  er.            *
233a0 2a 20 62 65 63 61 75 73 65 20 69 74 20 77 61 73  * because it was
233b0 20 74 68 65 72 65 20 62 65 66 6f 72 65 20 6f 72   there before or
233c0 20 62 65 63 61 75 73 65 20 77 65 20 6a 75 73 74   because we just
233d0 20 63 72 65 61 74 65 64 20 69 74 29 2e 0a 20 20   created it)..  
233e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6e            ** Con
233f0 76 65 72 74 20 74 68 65 20 70 45 78 70 72 20 74  vert the pExpr t
23400 6f 20 62 65 20 61 20 54 4b 5f 41 47 47 5f 43 4f  o be a TK_AGG_CO
23410 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e 67 20 74  LUMN referring t
23420 6f 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  o that.         
23430 20 20 20 2a 2a 20 70 41 67 67 49 6e 66 6f 2d 3e     ** pAggInfo->
23440 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e 0a 20 20  aCol[] entry..  
23450 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23460 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
23470 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
23480 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
23490 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
234a0 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20 3d 20 70  pr->pAggInfo = p
234b0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AggInfo;.       
234c0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
234d0 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3b 0a   TK_AGG_COLUMN;.
234e0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
234f0 72 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 6b  r->iAgg = (i16)k
23500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
23510 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
23520 20 2f 2a 20 65 6e 64 69 66 20 70 45 78 70 72 2d   /* endif pExpr-
23530 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d 3e  >iTable==pItem->
23540 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20  iCursor */.     
23550 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c 6f 6f 70     } /* end loop
23560 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 2a   over pSrcList *
23570 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
23580 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
23590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
235a0 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
235b0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
235c0 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
235d0 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d 30 0a 20  _InAggFunc)==0. 
235e0 20 20 20 20 20 20 26 26 20 70 57 61 6c 6b 65 72        && pWalker
235f0 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68 3d 3d 70  ->walkerDepth==p
23600 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20 20 20 20  Expr->op2.      
23610 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ){.        /* Ch
23620 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 45  eck to see if pE
23630 78 70 72 20 69 73 20 61 20 64 75 70 6c 69 63 61  xpr is a duplica
23640 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 61 67  te of another ag
23650 67 72 65 67 61 74 65 20 0a 20 20 20 20 20 20 20  gregate .       
23660 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   ** function tha
23670 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
23680 74 68 65 20 70 41 67 67 49 6e 66 6f 20 73 74 72  the pAggInfo str
23690 75 63 74 75 72 65 0a 20 20 20 20 20 20 20 20 2a  ucture.        *
236a0 2f 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  /.        struct
236b0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
236c0 49 74 65 6d 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Item = pAggInfo-
236d0 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >aFunc;.        
236e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
236f0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
23700 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
23710 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23720 45 78 70 72 43 6f 6d 70 61 72 65 28 70 49 74 65  ExprCompare(pIte
23730 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78 70 72 2c  m->pExpr, pExpr,
23740 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
23750 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23770 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23780 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  i>=pAggInfo->nFu
23790 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
237a0 2f 2a 20 70 45 78 70 72 20 69 73 20 6f 72 69 67  /* pExpr is orig
237b0 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61 20 6e 65  inal.  Make a ne
237c0 77 20 65 6e 74 72 79 20 69 6e 20 70 41 67 67 49  w entry in pAggI
237d0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a 20 20 20  nfo->aFunc[].   
237e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
237f0 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
23800 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
23810 20 20 20 20 20 20 20 20 69 20 3d 20 61 64 64 41          i = addA
23820 67 67 49 6e 66 6f 46 75 6e 63 28 70 50 61 72 73  ggInfoFunc(pPars
23830 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e 66 6f 29  e->db, pAggInfo)
23840 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23850 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i>=0 ){.        
23860 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23870 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
23880 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
23890 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
238a0 20 70 49 74 65 6d 20 3d 20 26 70 41 67 67 49 6e   pItem = &pAggIn
238b0 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b 0a 20 20  fo->aFunc[i];.  
238c0 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
238d0 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
238e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
238f0 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  m->iMem = ++pPar
23900 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
23910 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
23920 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
23930 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
23940 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
23950 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e 63 20 3d    pItem->pFunc =
23960 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
23970 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
23980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23990 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f      pExpr->u.zTo
239a0 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ken, sqlite3Strl
239b0 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
239c0 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  oken),.         
239d0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
239e0 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  >x.pList ? pExpr
239f0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
23a00 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20   : 0, enc, 0);. 
23a10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23a20 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
23a30 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
23a40 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
23a50 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50  ->iDistinct = pP
23a60 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
23a70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23a90 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20  Item->iDistinct 
23aa0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
23ab0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
23ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ad0 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78 70 72 20    /* Make pExpr 
23ae0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 61 70 70  point to the app
23af0 72 6f 70 72 69 61 74 65 20 70 41 67 67 49 6e 66  ropriate pAggInf
23b00 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e 74 72 79  o->aFunc[] entry
23b10 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23b20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23b30 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
23b40 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
23b50 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
23b60 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 56          ExprSetV
23b70 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  VAProperty(pExpr
23b80 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
23b90 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
23ba0 41 67 67 20 3d 20 28 69 31 36 29 69 3b 0a 20 20  Agg = (i16)i;.  
23bb0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 41 67        pExpr->pAg
23bc0 67 49 6e 66 6f 20 3d 20 70 41 67 67 49 6e 66 6f  gInfo = pAggInfo
23bd0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23be0 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
23bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23c00 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23c10 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
23c20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23c30 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
23c40 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c  .static int anal
23c50 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
23c60 65 6c 65 63 74 28 57 61 6c 6b 65 72 20 2a 70 57  elect(Walker *pW
23c70 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
23c80 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53 45  Select){.  UNUSE
23c90 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61 6c  D_PARAMETER(pWal
23ca0 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ker);.  UNUSED_P
23cb0 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63 74  ARAMETER(pSelect
23cc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
23cd0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
23ce0 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 70  ** Analyze the p
23cf0 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20  Expr expression 
23d00 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
23d10 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
23d20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
23d30 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
23d40 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 41 67  o be added to Ag
23d50 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  gInfo object tha
23d60 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f 0a  t pNC->pAggInfo.
23d70 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ** points to.  A
23d80 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65  dditional entrie
23d90 73 20 61 72 65 20 6d 61 64 65 20 6f 6e 20 74 68  s are made on th
23da0 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74  e AggInfo object
23db0 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   as.** necessary
23dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23dd0 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
23de0 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
23df0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
23e00 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c  has been.** anal
23e10 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 52  yzed by sqlite3R
23e20 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
23e30 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
23e40 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
23e50 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74  regates(NameCont
23e60 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a  ext *pNC, Expr *
23e70 70 45 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72  pExpr){.  Walker
23e80 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
23e90 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
23ea0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
23eb0 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  k = analyzeAggre
23ec0 67 61 74 65 3b 0a 20 20 77 2e 78 53 65 6c 65 63  gate;.  w.xSelec
23ed0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61 6e 61 6c  tCallback = anal
23ee0 79 7a 65 41 67 67 72 65 67 61 74 65 73 49 6e 53  yzeAggregatesInS
23ef0 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e 70 4e 43  elect;.  w.u.pNC
23f00 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73 65 72 74   = pNC;.  assert
23f10 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
23f20 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
23f30 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70  alkExpr(&w, pExp
23f40 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  r);.}../*.** Cal
23f50 6c 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  l sqlite3ExprAna
23f60 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29  lyzeAggregates()
23f70 20 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65   for every expre
23f80 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a 2a 20 65  ssion in an.** e
23f90 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
23fa0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
23fb0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
23fc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
23fd0 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 20 61 6e  is found, the an
23fe0 61 6c 79 73 69 73 20 69 73 20 63 75 74 20 73 68  alysis is cut sh
23ff0 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ort..*/.void sql
24000 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
24010 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f 6e 74 65  ggList(NameConte
24020 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 4c 69 73  xt *pNC, ExprLis
24030 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 74 72  t *pList){.  str
24040 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
24050 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
24060 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  i;.  if( pList )
24070 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 6d 3d  {.    for(pItem=
24080 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
24090 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
240a0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
240b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
240c0 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
240d0 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e 70 45 78  (pNC, pItem->pEx
240e0 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  pr);.    }.  }.}
240f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
24100 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 72 65   a single new re
24110 67 69 73 74 65 72 20 66 6f 72 20 75 73 65 20 74  gister for use t
24120 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69 6e 74 65  o hold some inte
24130 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 2e  rmediate result.
24140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47  .*/.int sqlite3G
24150 65 74 54 65 6d 70 52 65 67 28 50 61 72 73 65 20  etTempReg(Parse 
24160 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
24170 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67  pParse->nTempReg
24180 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
24190 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n ++pParse->nMem
241a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
241b0 50 61 72 73 65 2d 3e 61 54 65 6d 70 52 65 67 5b  Parse->aTempReg[
241c0 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52  --pParse->nTempR
241d0 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  eg];.}../*.** De
241e0 61 6c 6c 6f 63 61 74 65 20 61 20 72 65 67 69 73  allocate a regis
241f0 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61 76 61 69  ter, making avai
24200 6c 61 62 6c 65 20 66 6f 72 20 72 65 75 73 65 20  lable for reuse 
24210 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  for some other.*
24220 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a  * purpose..**.**
24230 20 49 66 20 61 20 72 65 67 69 73 74 65 72 20 69   If a register i
24240 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  s currently bein
24250 67 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f  g used by the co
24260 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  lumn cache, then
24270 0a 2a 2a 20 74 68 65 20 64 65 61 6c 6c 6f 63 61  .** the dealloca
24280 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72 65 64  tion is deferred
24290 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c 75 6d   until the colum
242a0 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74 68 61  n cache line tha
242b0 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20 72 65  t uses.** the re
242c0 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73 20 73  gister becomes s
242d0 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tale..*/.void sq
242e0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
242f0 52 65 67 28 50 61 72 73 65 20 2a 70 50 61 72 73  Reg(Parse *pPars
24300 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a 20 20  e, int iReg){.  
24310 69 66 28 20 69 52 65 67 20 26 26 20 70 50 61 72  if( iReg && pPar
24320 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
24330 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
24340 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
24350 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72 75 63  int i;.    struc
24360 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a  t yColCache *p;.
24370 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70      for(i=0, p=p
24380 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
24390 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
243a0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
243b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
243c0 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20 20 20  Reg==iReg ){.   
243d0 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67 20       p->tempReg 
243e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
243f0 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
24400 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61   }.    pParse->a
24410 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65 2d 3e  TempReg[pParse->
24420 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20 69 52  nTempReg++] = iR
24430 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  eg;.  }.}../*.**
24440 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64 65 61   Allocate or dea
24450 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63 6b 20  llocate a block 
24460 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63 75 74  of nReg consecut
24470 69 76 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2f  ive registers.*/
24480 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65 74 54  .int sqlite3GetT
24490 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65 20 2a  empRange(Parse *
244a0 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52 65 67  pParse, int nReg
244b0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  ){.  int i, n;. 
244c0 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69 52 61   i = pParse->iRa
244d0 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20 70 50  ngeReg;.  n = pP
244e0 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 3b  arse->nRangeReg;
244f0 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e 20 29  .  if( nReg<=n )
24500 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 75  {.    assert( !u
24510 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63 68 65  sedAsColumnCache
24520 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b 6e 2d  (pParse, i, i+n-
24530 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  1) );.    pParse
24540 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d 20 6e  ->iRangeReg += n
24550 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Reg;.    pParse-
24560 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20 6e 52  >nRangeReg -= nR
24570 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  eg;.  }else{.   
24580 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65   i = pParse->nMe
24590 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
245a0 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a 20  >nMem += nReg;. 
245b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
245c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 6c  .void sqlite3Rel
245d0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 50 61  easeTempRange(Pa
245e0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
245f0 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65 67 29   iReg, int nReg)
24600 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
24610 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73  acheRemove(pPars
24620 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29 3b 0a  e, iReg, nReg);.
24630 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61 72 73    if( nReg>pPars
24640 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29 7b 0a  e->nRangeReg ){.
24650 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e      pParse->nRan
24660 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a 20 20  geReg = nReg;.  
24670 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e 67 65    pParse->iRange
24680 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 7d 0a  Reg = iReg;.  }.
24690 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c  }../*.** Mark al
246a0 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  l temporary regi
246b0 73 74 65 72 73 20 61 73 20 62 65 69 6e 67 20 75  sters as being u
246c0 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72  navailable for r
246d0 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  euse..*/.void sq
246e0 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65  lite3ClearTempRe
246f0 67 43 61 63 68 65 28 50 61 72 73 65 20 2a 70 50  gCache(Parse *pP
24700 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
24710 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20  >nTempReg = 0;. 
24720 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52   pParse->nRangeR
24730 65 67 20 3d 20 30 3b 0a 7d 0a                    eg = 0;.}.